mybatis_plus【条件构造】

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

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。

    173 引用 • 414 回帖 • 363 关注

相关帖子

欢迎来到这里!

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

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