前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有了这个,SQL语句都不用写了

有了这个,SQL语句都不用写了

作者头像
千羽
发布2021-01-14 15:08:06
7290
发布2021-01-14 15:08:06
举报
文章被收录于专栏:程序员千羽程序员千羽
  • 本次源码已放在Github:https://github.com/nateshao/MyBatis-Plus
  • 个人博客
    • https://nateshao.gitee.io
    • https://nateshao.github.io

简介

MyBatis-Puls在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

国产的开源框架,基于 MyBatis,功能有点类似JPA,Hibernate

核心功能就是简化 MyBatis 的开发,提高效率。

MyBatis-Plus快速上手

本次是采用SpringBoot开发,所以前提你是要会熟悉 Spring Boot熟悉 Maven,关于Spring boot入门可以看我之前的文章哦

Spring Boot(2.3.1) + MyBatis Plus(国产的开源框架,并没有接入到 Spring 官方孵化器中)所以新建工程没有看到MyBatis Plus的选项。

1、创建 Spring Initializer 创建Spring Boot工程,勾选lombok,MySQL-Driver,SpringWeb,Thymeleaf

2、pom.xml 引入 MyBatis Plus 的依赖

代码语言:javascript
复制
<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus-boot-starter</artifactId>

<version>3.3.1</version>

</dependency>

3、创建实体类

代码语言:javascript
复制
package com.stj.entity;



import lombok.Data;



/**

 * @author shaotongjie

 * @date 2020/6/18 21:11

 */

@Data

public class User {

private Integer id;

private String name;

private Integer age;

}

4、创建 Mapper 接口

代码语言:javascript
复制
package com.stj.mapper;



import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import com.stj.entity.User;



/**

 * @author shaotongjie

 * @date 2020/6/18 21:14

 */

public interface UserMapper extends BaseMapper<User> {



}

5、application.yml

代码语言:javascript
复制
spring:

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

    username: root

    password: 123456

    mybatis-plus:

      configuration:

        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

6、启动类需要添加 @MapperScan(“mapper所在的包”),否则无法加载 Mppaer bean。

代码语言:javascript
复制
package com.stj;



import org.mybatis.spring.annotation.MapperScan;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;



@SpringBootApplication

@MapperScan("com.stj.mapper")       //一定要加@MapperScan()

public class MybatisplusApplication {



public static void main(String[] args) {

SpringApplication.run(MybatisplusApplication.class, args);

}



}

7、测试 (在UserMapper接口上goto新建UserMapperTest测试类)

代码语言:javascript
复制
package com.stj.mapper;



import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;



import static org.junit.jupiter.api.Assertions.*;



/**

 * @author shaotongjie

 * @date 2020/6/18 22:31

 */

@SpringBootTest

class UserMapperTest {



@Autowired

private UserMapper userMapper;



@Test

void test() {

userMapper.selectList(null).forEach(System.out::println);

}

}

运行结果:

小结

通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!

从以上步骤中,我们可以看到集成MyBatis-Plus非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。

常用注解

TableName

映射数据库的表名

代码语言:javascript
复制
package com.stj.entity;



import com.baomidou.mybatisplus.annotation.TableName;

import lombok.Data;



/**

 * @author shaotongjie

 * @date 2020/6/21 23:06

 */

@Data

@TableName(value = "user")

public class Persion {        //当这个实体类与表名不一致时!!

private Integer id;

private String name;

private Integer age;

}

TableId

设置主键映射,value 映射主键字段名

type 设置主键类型,主键的生成策略,

代码语言:javascript
复制
AUTO(0),

NONE(1),

INPUT(2),

ASSIGN_ID(3),

ASSIGN_UUID(4),

下面三个被替换掉了,不常用

/** @deprecated */      

@Deprecated

ID_WORKER(3),

/** @deprecated */

@Deprecated

ID_WORKER_STR(3),

/** @deprecated */

@Deprecated

UUID(4);

描述

AUTO

数据库自增

NONE

MP set 主键,雪花算法实现

INPUT

需要开发者手动赋值

ASSIGN_ID

MP 分配 ID,Long、Integer、String

ASSIGN_UUID

分配 UUID,Strinig

INPUT 如果开发者没有手动赋值,则数据库通过自增的方式给主键赋值,如果开发者手动赋值,则存入该值。

AUTO 默认就是数据库自增,开发者无需赋值。

ASSIGN_ID MP 自动赋值,雪花算法。

ASSIGN_UUID 主键的数据类型必须是 String,自动生成 UUID 进行赋值

TableField

映射非主键字段,value 映射字段名

exist 表示是否为数据库字段 false,如果实体类中的成员变量在数据库中没有对应的字段,则可以使用 exist,VO、DTO

select 表示是否查询该字段

fill 表示是否自动填充,将对象存入数据库的时候,由 MyBatis Plus 自动给某些字段赋值,create_time、update_time

1、给表添加 create_time、update_time 字段

2、实体类中添加成员变量

代码语言:javascript
复制
package com.stj.entity;



import com.baomidou.mybatisplus.annotation.*;

import lombok.Data;

import java.util.Date;



/**

 * @author shaotongjie

 * @date 2020/6/18 21:11

 */

@Data

@TableName(value = "user")

public class User {

@TableId        //(type = IdType.ASSIGN_ID)

private Long id;

@TableField(value = "name",select = false)

private String name;

private Integer age;



@TableField(fill = FieldFill.DEFAULT)

private Date createTime;

@TableField(fill = FieldFill.UPDATE)

private Date updateTime;

//    @TableField(exist = false)

//    private String gender;

}

3、创建自动填充处理器

代码语言:javascript
复制
package com.stj.hander;



import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

import org.apache.ibatis.reflection.MetaObject;

import org.springframework.stereotype.Component;



import java.util.Date;



/**

 * @author shaotongjie

 * @date 2020/6/19 10:19

 */



@Component

public class MyMetaObjectHandler implements MetaObjectHandler {

@Override

public void insertFill(MetaObject metaObject) {

this.setFieldValByName("createTime",new Date(),metaObject);

this.setFieldValByName("updateTime",new Date(),metaObject);

}



@Override

public void updateFill(MetaObject metaObject) {

this.setFieldValByName("updateTime",new Date(),metaObject);

}

}

Version

标记乐观锁,通过 version 字段来保证数据的安全性,当修改数据的时候,会以 version 作为条件,当条件成立的时候才会修改成功。

version = 2

线程 1:update … set version = 2 where version = 1

线程2 :update … set version = 2 where version = 1

1、数据库表添加 version 字段,默认值为 1

2、实体类添加 version 成员变量,并且添加 @Version

代码语言:javascript
复制
package com.stj.entity;



import com.baomidou.mybatisplus.annotation.*;

import com.stj.enums.AgeEnums;

import com.stj.enums.StatusEnums;

import lombok.Data;

import java.util.Date;



/**

 * @author shaotongjie

 * @date 2020/6/18 21:11

 */

@Data

@TableName(value = "user")

public class User {

@TableId        //(type = IdType.ASSIGN_ID)

private Long id;

@TableField(value = "name",select = false)

private String name;

private AgeEnums age;



@TableField(fill = FieldFill.DEFAULT)

private Date createTime;

@TableField(fill = FieldFill.UPDATE)

private Date updateTime;

//    @TableField(exist = false)

//    private String gender;

@Version

private Integer version;

}

3、注册配置类

代码语言:javascript
复制
package com.stj.config;



import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;



/**

 * @author shaotongjie

 * @date 2020/6/19 11:39

 */

@Configuration

public class MybatisPlusConfig {

@Bean

public OptimisticLockerInterceptor optimisticLockerInterceptor(){

return new OptimisticLockerInterceptor();

}

}

EnumValue

1、通用枚举类注解,将数据库字段映射成实体类的枚举类型成员变量

代码语言:javascript
复制
package com.stj.enums;



import com.baomidou.mybatisplus.annotation.EnumValue;



/**

 * @author shaotongjie

 * @date 2020/6/19 11:50

 */

public enum  StatusEnums {

WORK(1,"上班"),

REST(0,"休息");



StatusEnums(Integer code, String msg) {

this.code = code;

this.msg = msg;

}



@EnumValue

private Integer code;

private String msg;

}


代码语言:javascript
复制
package com.stj.entity;



import com.baomidou.mybatisplus.annotation.*;

import com.stj.enums.AgeEnums;

import com.stj.enums.StatusEnums;

import lombok.Data;

import java.util.Date;



/**

 * @author shaotongjie

 * @date 2020/6/18 21:11

 */

@Data

@TableName(value = "user")

public class User {

@TableId        //(type = IdType.ASSIGN_ID)

private Long id;

@TableField(value = "name",select = false)

private String name;

private AgeEnums age;



@TableField(fill = FieldFill.DEFAULT)

private Date createTime;

@TableField(fill = FieldFill.UPDATE)

private Date updateTime;

//    @TableField(exist = false)

//    private String gender;

@Version

private Integer version;



private StatusEnums status;

}

application.yml

代码语言:javascript
复制
type-enums-package: 

com.stj.enums

2、实现接口

代码语言:javascript
复制
package com.stj.enums;



import com.baomidou.mybatisplus.core.enums.IEnum;

import org.thymeleaf.engine.IElementDefinitionsAware;



/**

 * @author shaotongjie

 * @date 2020/6/19 12:08

 */

public enum AgeEnums implements IEnum<Integer> {

ONE(1,"一岁"),

TWO(2,"两岁"),

THREE(3,"三岁");

private Integer code;

private String msg;



AgeEnums(Integer code, String msg) {

this.code = code;

this.msg = msg;

}



@Override

public Integer getValue() {

return this.code;

}

}

TableLogic

映射逻辑删除 数据表虽存在,但是查不出来。

1、数据表添加 deleted 字段

2、实体类添加注解

代码语言:javascript
复制
package com.stj.entity;



import com.baomidou.mybatisplus.annotation.*;

import com.stj.enums.AgeEnums;

import com.stj.enums.StatusEnums;

import lombok.Data;

import java.util.Date;



/**

 * @author shaotongjie

 * @date 2020/6/18 21:11

 */

@Data

@TableName(value = "user")

public class User {

@TableId        //(type = IdType.ASSIGN_ID)

private Long id;

@TableField(value = "name",select = false)

private String name;

private AgeEnums age;



@TableField(fill = FieldFill.DEFAULT)

private Date createTime;

@TableField(fill = FieldFill.UPDATE)

private Date updateTime;

//    @TableField(exist = false)

//    private String gender;

@Version

private Integer version;



private StatusEnums status;

@TableLogic     //逻辑删除

private Integer deleted;



}

3、application.yml 添加配置

代码语言:javascript
复制
global-config:

  db-config:

    logic-not-delete-value: 0

    logic-delete-value: 1

查询

代码语言:javascript
复制
//mapper.selectList(null);      不加任何条件全部查询

QueryWrapper wrapper = new QueryWrapper();

//        Map<String,Object> map = new HashMap<>();

//        map.put("name","小红");

//        map.put("age",3);

//        wrapper.allEq(map);           所有

//        wrapper.gt("age",2);          大于

//        wrapper.ne("name","小红");     不等于

//        wrapper.ge("age",2);          大于等于



模糊查询

//like '%小'

//        wrapper.likeLeft("name","小");

//like '小%'

//        wrapper.likeRight("name","小");



//inSQL  嵌套查询

//        wrapper.inSql("id","select id from user where id < 10");

//        wrapper.inSql("age","select age from user where age > 3");



//        wrapper.orderByDesc("age");   降序



//        wrapper.orderByAsc("age");    升序

//        wrapper.having("id > 8");



mapper.selectList(wrapper).forEach(System.out::println);
代码语言:javascript
复制
//        System.out.println(mapper.selectById(7));

//        mapper.selectBatchIds(Arrays.asList(7,8,9)).forEach(System.out::println);



//Map 只能做等值判断,逻辑判断需要使用 Wrapper 来处理

//        Map<String,Object> map = new HashMap<>();

//        map.put("id",7);

//        mapper.selectByMap(map).forEach(System.out::println);



QueryWrapper wrapper = new QueryWrapper();

wrapper.eq("id",7);

////        System.out.println(mapper.selectCount(wrapper));

//

//        //将查询的结果集封装到Map中

//        mapper.selectMaps(wrapper).forEach(System.out::println);

//        System.out.println("-------------------");

//        mapper.selectList(wrapper).forEach(System.out::println);



//分页查询

//        Page<User> page = new Page<>(2,2);

//        Page<User> result = mapper.selectPage(page,null);

//        System.out.println(result.getSize());

//        System.out.println(result.getTotal());

//        result.getRecords().forEach(System.out::println);



//        Page<Map<String,Object>> page = new Page<>(1,2);

//        mapper.selectMapsPage(page,null).getRecords().forEach(System.out::println);



//        mapper.selectObjs(null).forEach(System.out::println);





System.out.println(mapper.selectOne(wrapper));

自定义SQL(多表关联查询)

代码语言:javascript
复制
package com.stj.mybatisplus.entity;



import lombok.Data;



@Data

public class ProductVO {

private Integer category;

private Integer count;

private String description;

private Integer userId;

private String userName;

}
代码语言:javascript
复制
package com.stj.mybatisplus.mapper;



import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import com.southwind.mybatisplus.entity.ProductVO;

import com.southwind.mybatisplus.entity.User;

import org.apache.ibatis.annotations.Select;



import java.util.List;



public interface UserMapper extends BaseMapper<User> {

@Select("select p.*,u.name userName from product p,user u where p.user_id = u.id and u.id = #{id}")

List<ProductVO> productList(Integer id);

}

添加

代码语言:javascript
复制
User user = new User();

user.setTitle("小明");

user.setAge(22);

mapper.insert(user);

System.out.println(user);

删除

代码语言:javascript
复制
//mapper.deleteById(1);

//        mapper.deleteBatchIds(Arrays.asList(7,8));

//        QueryWrapper wrapper = new QueryWrapper();

//        wrapper.eq("age",14);

//        mapper.delete(wrapper);



Map<String,Object> map = new HashMap<>();

map.put("id",10);

mapper.deleteByMap(map);

修改

代码语言:javascript
复制
//        //update ... version = 3 where version = 2

//        User user = mapper.selectById(7);

//        user.setTitle("一号");

//

//        //update ... version = 3 where version = 2

//        User user1 = mapper.selectById(7);

//        user1.setTitle("二号");

//

//        mapper.updateById(user1);

//        mapper.updateById(user);



User user = mapper.selectById(1);

user.setTitle("小红");

QueryWrapper wrapper = new QueryWrapper();

wrapper.eq("age",22);

mapper.update(user,wrapper);

MyBatis-Plus自动生成

根据数据表自动生成实体类、Mapper、Service、ServiceImpl、Controller

1、pom.xml 导入 MyBatis Plus Generator

代码语言:javascript
复制
<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus-generator</artifactId>

<version>3.3.1</version>

</dependency>



<dependency>

<groupId>org.apache.velocity</groupId>

<artifactId>velocity</artifactId>

<version>1.7</version>

</dependency>

Velocity(默认)、Freemarker、Beetl

2、启动类

代码语言:javascript
复制
package com.stj.mybatisplus;



import com.baomidou.mybatisplus.annotation.DbType;

import com.baomidou.mybatisplus.generator.AutoGenerator;

import com.baomidou.mybatisplus.generator.config.DataSourceConfig;

import com.baomidou.mybatisplus.generator.config.GlobalConfig;

import com.baomidou.mybatisplus.generator.config.PackageConfig;

import com.baomidou.mybatisplus.generator.config.StrategyConfig;

import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;



public class Main {

public static void main(String[] args) {

//创建generator对象

AutoGenerator autoGenerator = new AutoGenerator();

//数据源

DataSourceConfig dataSourceConfig = new DataSourceConfig();

dataSourceConfig.setDbType(DbType.MYSQL);

dataSourceConfig.setUrl("jdbc:mysql://ip:3306/db?useUnicode=true&characterEncoding=UTF-8");

dataSourceConfig.setUsername("root");

dataSourceConfig.setPassword("root");

dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");

autoGenerator.setDataSource(dataSourceConfig);

//全局配置

GlobalConfig globalConfig = new GlobalConfig();

globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");

globalConfig.setOpen(false);

globalConfig.setAuthor("southwind");

globalConfig.setServiceName("%sService");

autoGenerator.setGlobalConfig(globalConfig);

//包信息

PackageConfig packageConfig = new PackageConfig();

packageConfig.setParent("com.southwind.mybatisplus");

packageConfig.setModuleName("generator");

packageConfig.setController("controller");

packageConfig.setService("service");

packageConfig.setServiceImpl("service.impl");

packageConfig.setMapper("mapper");

packageConfig.setEntity("entity");

autoGenerator.setPackageInfo(packageConfig);

//配置策略

StrategyConfig strategyConfig = new StrategyConfig();

strategyConfig.setEntityLombokModel(true);

strategyConfig.setNaming(NamingStrategy.underline_to_camel);

strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);

autoGenerator.setStrategy(strategyConfig);



autoGenerator.execute();

}

}运行成功之后,会发现有Mapper、Service、ServiceImpl、Controller..等都帮你创建了。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 千羽的编程时光 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • MyBatis-Plus快速上手
  • 小结
  • 常用注解
  • 查询
  • 自定义SQL(多表关联查询)
  • 添加
  • 删除
  • 修改
  • MyBatis-Plus自动生成
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档