MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发,提高,效率而生,Mybatis-Plus 是由 baomidou(苞米豆)组织开发并且开源的。
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 官网,如有侵权请联系删除!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于