简介

  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

sql server 不等于null sql语句不等于空怎么写_sql语句不为空怎么写

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

<dependency>
 
   
  
<groupId>com.baomidougroupId>
 
   
  
<artifactId>mybatis-plus-boot-starterartifactId>
 
   
  
<version>3.3.1version>
 
   
  
dependency>




3、创建实体类

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 接口

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

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。

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测试类)

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);
 
   
  
}
 
   
  
}




运行结果:

sql server 不等于null sql语句不等于空怎么写_不用写语句的轻量级orm_02

小结

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

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

常用注解

TableName

映射数据库的表名

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 设置主键类型,主键的生成策略,

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、实体类中添加成员变量

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、创建自动填充处理器

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

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、注册配置类

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、通用枚举类注解,将数据库字段映射成实体类的枚举类型成员变量

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;
 
   
  
}




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

type-enums-package: 
 
   
  
com.stj.enums

2、实现接口

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 {
 
   
  
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、实体类添加注解

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 添加配置

global-config:
 
   
  
 db-config:
 
   
  
 logic-not-delete-value: 0
 
   
  
 logic-delete-value: 1



查询

//mapper.selectList(null); 不加任何条件全部查询
 
   
  
QueryWrapper wrapper = new QueryWrapper();
 
   
  
// Map 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);




// System.out.println(mapper.selectById(7));
 
   
  
// mapper.selectBatchIds(Arrays.asList(7,8,9)).forEach(System.out::println);
 
   
  
//Map 只能做等值判断,逻辑判断需要使用 Wrapper 来处理
 
   
  
// Map 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 page = new Page<>(2,2);
 
   
  
// Page result = mapper.selectPage(page,null);
 
   
  
// System.out.println(result.getSize());
 
   
  
// System.out.println(result.getTotal());
 
   
  
// result.getRecords().forEach(System.out::println);
 
   
  
// Page> 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(多表关联查询)

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;
 
   
  
}




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}")
 
   
  
ListproductList(Integer id);
 
   
  
}




添加

User user = new User();
 
   
  
user.setTitle("小明");
 
   
  
user.setAge(22);
 
   
  
mapper.insert(user);
 
   
  
System.out.println(user);




删除

//mapper.deleteById(1);
 
   
  
// mapper.deleteBatchIds(Arrays.asList(7,8));
 
   
  
// QueryWrapper wrapper = new QueryWrapper();
 
   
  
// wrapper.eq("age",14);
 
   
  
// mapper.delete(wrapper);
 
   
  
Map map = new HashMap<>();
 
   
  
map.put("id",10);
 
   
  
mapper.deleteByMap(map);




修改

// //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

<dependency>
 
   
  
<groupId>com.baomidougroupId>
 
   
  
<artifactId>mybatis-plus-generatorartifactId>
 
   
  
<version>3.3.1version>
 
   
  
dependency>
 
   
  
<dependency>
 
   
  
<groupId>org.apache.velocitygroupId>
 
   
  
<artifactId>velocityartifactId>
 
   
  
<version>1.7version>
 
   
  
dependency>




Velocity(默认)、Freemarker、Beetl

2、启动类

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..等都帮你创建了。