最近项目重构 dao层使用的Mybatis plus,有必要总结下。
Mybatis plus 会自动维护Mybatis 以及 MyBatis-Spring 相关依赖 所以在构建项目时候 只需要引入Mybatis plus 的maven坐标就OK了
Mybatis plus的核心在BaseMapper<T>
包含了各种各样的 接口方法
所以我们继承后就可以拿来使用了!
Q1:
在插入时候 bean(包含ID) 需要 使用主键策略 (数据库ID自增)
使用注解@Table
在Bean上面加上注解 @TableId(value="id", type=IdType.AUTO)
可以配置全局策略 就不用每个表都写这个注解了! 处理下划线到驼峰命名的问题
Q2:
MP会默认使用实体类的类名到数据库中找对应的表
使用注解@TableName(value=“tx_user“)解决
可以配置全局策略 加个统一的前缀,就不用每个表都写这个注解了! 前缀+实体类 是table name
Q3:
Mybatis plus全局策略配置
xx.xx.xx.GlobalConfiguration
默认是true 解析驼峰命名 到 下划线对应
Q4:
@TableField(value="last_name") 对应数据库的名字
@TableField(exist=false) 这个字段数据库没有哦 插入时候不会报错(用的比较少)
Q5:
在插入一条数据时候,获取主键值
自动的回写到实体类Bean中 不需要额外的操作
Q6:
插入时候
方法 insert() 只有非空的才会出现在sql语句日志中
insertAllColumn() 插入所有字段 空的也是显示的 日志打印会出来这几个字段 但是是null 结果也是一样的 返回Integer
Q7:
updateById() 通用更新操作 返回Integer
updateAllColumnByID 会插入null
Q8:
selectById()
selectOne( entity ) 通过多个列进行查询 非空属性作为条件进行查询了 要返回一条数据 要不就报错了
List<T> selectBatchIds(List<? extends Serializable> idList) //通过多个Id进行查询
LIst<T> selectByMap<columnMap> // key 是列名"school_name"
List<T> selectPage(RowBounds rowBounds, Warpper<T> wrapper); //分页查询 Page的对象继承了rowBounds 底层没有使用limit 使用的Mybatis的 内存的分页方式 参数 第几页 每页显示多少条数据
Mybatis有个PageHelper Mybatis Plus 有自己的分页插件
补充 selectList
selectOne
selectById
selectAll
selectCount
Q9: (remove)
Integer deleteById(Serializable id)
Integer deleteByMap(@Param("crm") Map<String, Object> columnMap) key一定要写数据库的列名
Integer deleteBatchIds(LIst<? extends Serializable> iDList) //批量删除 底层sql 使用的in
以上是常用的CRUD
原理分析
BaseMapper 中提供了通用的CRUD方法
补充功能强大的条件构造器 EntityWrapper
实体包装器,主要用于处理SQL拼接,排序,实体参数查询等。
条件参数说明
查询方式 | 说明 |
---|---|
setSqlSelect | 设置 SELECT 查询字段 |
where | WHERE 语句,拼接 + WHERE 条件 |
and | AND 语句,拼接 + AND 字段=值 |
andNew | AND 语句,拼接 + AND (字段=值) |
or | OR 语句,拼接 + OR 字段=值 |
orNew | OR 语句,拼接 + OR (字段=值) |
eq | 等于= |
allEq | 基于 map 内容等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查询 LIKE |
notLike | 模糊查询 NOT LIKE |
in | IN 查询 |
notIn | NOT IN 查询 |
isNull | NULL 值查询 |
isNotNull | IS NOT NULL |
groupBy | 分组 GROUP BY |
having | HAVING 关键词 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last("LIMIT 1") |
范围:
.between("age",2,6);
.like("name","jack")
.or() //或者使用orNew() orNew() 之前的结果封装 与后面的进行拼接
.like("email","a") //或者邮箱有a 的
修改操作:
userEntity 属性是要修改的值
Wrapper是条件 不停的.eq (就是where了)
.update(UserEntity, Wrapper )
删除操作
.update()
封装一个添加构造器就OK了 .eq() .eq()
高级点的查询
排序的:
.orderBy() 默认升序
.orderDesc() 降序 传入的是集合!
.last( “desc”) 手动把SQL拼接到最后(有sql注入的风险)
.last("limit 1,3")