mybatis_plus【条件构造】

本贴最后更新于 1361 天前,其中的信息可能已经东海扬尘

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发,提高,效率而生,Mybatis-Plus 是由 baomidou(苞米豆)组织开发并且开源的。

官网地址

文档地址

GIT 源码地址

mybatis_plus 具有强大的 CRUD 操作,:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求,也可以使用支持 Lambda 形式调用。非常的简洁,在日常的工作中使用简洁的 sql 构造还是非常的方便。

具体的语法不在这个依次给大家介绍了,主要是在分享自己几个在工作中使用操作和注意点【下面的配置都是正对于 springboot 中的配置】

基本配置

  • mapperLocations

MyBatis Mapper 所对应的 XML 文件位置,或者是直接在 yml 文件中定义号 xml 的文件的映射地址。

mybatis-plus.mapper-locations = classpath*:mybatis/*.xml
  • configLocation

MyBatis 配置文件位置,如果您有单独的 MyBatis 配置,请将其路径配置到 configLocation 中。

  • typeAliasesPackage

MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,在 xml 文件中可以使用包全名,也就是对用的 entity 的路径地址

 mybatis-plus.config-location = classpath:mybatis-config.xml
  • idType

全局默认主键类型,设置后,即可省略实体对象中的 @TableId(type = IdType.AUTO)配置。

mybatis-plus.global-config.db-config.id-type=auto
  • tablePrefix

表名前缀,全局配置后可省略 @TableName()配置。配置了可以省略表明配置,但是一般使用不多,因为业务上复杂,表名的前缀一般都不一致。

  • mapUnderscoreToCamelCase

是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射。栗子:【数据库字段:user_name javabean :userName】

  • cacheEnabled

全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true。

上述的配置如果是直接写在 application.yml 文件的话,固定的格式,如果是写在 xml 文件中话,可以直接参照官网。

mybatisPlus:
  mapperLocations: classpath:/com/xxx/module/*/*/dao/xml/*.xml,classpath:/com/xxx/module/*/*/*/dao/xml/*.xml
  typeAliasesPackage: com.xxx.module.*.*.entity

条件构造器

因为条件构造器太多,在这里只说明几种说法,可以到官网上面直接查看很详细

allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
allEq(BiPredicate<R, V> filter, Map<R, V> params)
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean
null2IsNull)

allEq 使用全部结构

null2IsNull = fasle:表示的是如果 map 的里面又存在条件为 null 的情况的话,不参与 sql 构造

null2IsNull = true,调用的是 isnull 的方法

(BiPredicate filter): 表示的是对传入参数 map 的过滤操作 key 和 vlaue 的过滤操作。

栗子:

例1: allEq((k,v) -> k.indexOf("s") > 0, {id:1,name:"小花",age:null}) ---> name = '老王' and sex null

例2: allEq((k,v) -> k.indexOf("s") > 0, {id:1,name:"小花",sex:null}, false) ---> name = '小花'

其他的 eq【等于】,le【小于】, lt【小于等于】,ge【大于】,gt【大于等于】,between 【BETWEEN 值 1 AND 值 2】 ,notBetween【NOT BETWEEN 值 1 AND 值 2】,IN【集合】,notIn【不在这个集合中】,like【模糊】,notLike【NOT LIKE '% 值 %'】 ,likeLeft【name like '% 王'】,likeRight【name like '王 %'】等。。官网 get

  • 需要注意 and 和 or 的使用

一般的条件连接都是使用的 and ,如果直接直接使用 or 的话,表示连接的是 and a= 'a' or b= 'b'

如果想构造出 and(a = 'a' or b = 'b')

栗子:

 orderMapper.list(new QueryWrapper<Order>()
              .eq(order.BILLCODE,'1')
              .or(Wrapper->
		wrapper.eq(order.BILLCODE,'2')
              .eq(order.BILLCODE,'3'))
               .eq(order.BILLCODE,'4'));

这个时候表示就是上面的需求的结果。

QueryWrapper

QueryWrapper userQueryWrapper = new QueryWrapper<>();

继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取

UpdateWrapper

继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaUpdateWrapper, 可以通过 new UpdateWrapper().lambda() 方法获取!

可以使用如下的几种:

set

set(String column, Object val)
set(boolean condition, String column, Object val)

栗子:

  • 例: set("name", "老李头")
  • 例: set("name", "")---> 数据库字段值变为空字符串
  • 例: set("name", null)---> 数据库字段值变为 null

这个需要注意一个点,在开发中,很多开发在进行数据更新的时候,是先将数据查询出来,在根据 entity 进行设置值,来进行数据的修改的,这个时候需要注意是如果直接 entity.setName(null); 会出现不改变 数据情况,如果你不使用 UpdateWrapper,就需要在实体类上加上一个注解 @TableField(fill = FieldFill.UPDATE),说到这里就说到了 @TableField 注解的使用

TableField
1.@TableField(value = "name",exist = false)
private String name ;
exist :false //表示在进行mapper实体类映射的时候,这个字段可以不存在数据库字段映射,在开发中一般用在虚拟字段使用。

2.@TableField(value = "user_name")
private String name;

value: user_name  //表示在数据中存在字段user_name 映射到实体类的name 上面

3.@TableField(fill = FieldFill.INSERT) //插入数据时进行填充
private String password;

//多种模式适配
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}





setsql

setSql(String sql)
  • 设置 SET 部分 SQL
  • 例: setSql("name = '老李头'")

lambda

  • 获取 LambdaWrapper
    QueryWrapper 中是获取 LambdaQueryWrapper
    UpdateWrapper 中是获取 LambdaUpdateWrapper
  • 下面的栗子分别为 LambdaQueryWrapper、LambdaUpdateWrapper

/**
 * lambda链式编程
 */
@Test
public void test01(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.lambda()
            .between(User::getAge,10,60)
            .orderByDesc(User::getId);
    List<User> list = userService.list(queryWrapper);
    list.forEach(System.out::println);
}

/**
 * 测试链式编程更新操作
 */
@Test
public void test02(){
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.lambda()
            .le(User::getAge, 20)
            .setSql("email = 'haxdjf.top'");
    userService.update(updateWrapper);
}

Wrapper 自定义 SQL

需求来源:

在使用了 mybatis-plus 之后, 自定义 SQL 的同时也想使用 Wrapper 的便利应该怎么办? 在 mybatis-plus 版本 3.0.7 得到了完美解决 版本需要大于或等于 3.0.7, 以下两种方案取其一即可

  • Service.java

直接使用参数的形式进行实现

mysqlMapper.getAll(Wrappers.<MysqlData>lambdaQuery().eq(MysqlData::getGroup, 1));
  • 方案一 注解方式 Mapper.java
@Select("select * from mysql_data ${ew.customSqlSegment}")
List<MysqlData> getAll(@Param(Constants.WRAPPER) Wrapper wrapper);
  • 方案二 XML形式 Mapper.xml
<select id="getAll" resultType="MysqlData">
	SELECT * FROM mysql_data ${ew.customSqlSegment}
</select>

参考:mybatis_plus 官网,如有侵权请联系删除!

  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 387 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...