MyBatis-Plus
1、简介
1.1MyBatisPlus介绍
MyBatis-Plus(简称MP),是一个MyBatis的增强工具包,只做增强不做改变,为简化开发工作、提高生产效率而生。
1.2代码及文档发布地址
官方地址:
http://mp.baomidou.com
代码发布地址:
Github:http://github.com/baomidou/mybatis-plus
Gitee:https://gitee.com/baomidou/mybatis-plus
文档发布地址:
http://mp.baomidou.com/#/?id=%E7%AE%80%E4%BB%8B
2、注解
1、@TableId注解:
1)value:指定表中的主键列的列名,如果实体属性名与列名一致,可以省略不指定
2)type:指定主键策略(自增,用户输入,全局唯一ID,UUID)
2、@TableName注解:
1)value:指定数据库中的表名,如果实体类名与表名一致,可以省略不指定
3、@TableField注解:
1)value:指定数据库中的列名,当数据库中的列名与实体类属性名不一致时使用
2)exist:默认为true,数据库中是否存在此字段,如果设置为false,插入时,此字段不插入
3、CRUD通用
3.1CURD函数
1、只需要继承BaseMapper接口
2、插入
1)insert()方法
insert方法在插入时,会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到SQL语句中
2)insertAllColumn()方法
insertAllColumn 方法在插入时,不管属性是否为空,属性所对应的字段都会出现到SQL语句中
3、修改
3)updateById()方法
updateById 方法在修改时,会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现在SQL语句中
4)updateAllColumnById()方法
updateAllColumnById 方法在修改时,不管属性是否为空,属性所对应的字段都会出现到SQL语句中
4、查询
5)selectById()方法
通过id进行查询
6)selectOne(@Param(“ew”)T entity)方法
通过传入一个对象进行查询,将需要查询的条件封装到对象中
7)selectBatchIds(idList) 方法
通过多个id进行查询,List IdList
8)selectByMap(@Param(“cm”) Map<String,Object> columnMap)
通过columnMap中的条件进行查询,columnMap.put(“列名”,“值”);String类型key应该是列名,而不是对象属性名
9)selectPage(RowBounds rowBounds,@Param(“ew”) Wrapper warpper)
分页查询
RowBounds :mybatisplus自带的分页查询对象,我们也可以传一个page(分页辅助类)对象
selectPage(new Page<>(int current,int size),null),current 第几页;size 每页显示几条
5、删除
1)deleteById();
通过id进行删除。
2)deleteByMap(@Param(“cm”) Map<String,Object> columnMap)
通过columnMap中的条件进行删除
3)deleteBatchIds(List<? extends Serializable> idList)
批量删除,通过idList中的id进行批量删除
3.2 MP启动注入SQL原理分析
1、问题:xxxxMapper继承了BaseMapper,BaseMapper中提供了通用的CRUD方法,方法来源于BaseMapper,有方法就必须有SQL,因为mybatis最终还是需要通过SQL语句操作数据。
2、前置知识:mybatis源码中比较重要的一些对象,mybatis框架的执行流程
3、通过现象看到本质
1)xxxMapper的本质org.apache.ibatis.binding.MapperProxy;
2)MapperProxy中SqlSession—>SqlSessionFactory
3)SqlSessionFactory中configuration(全局配置)对象—>MappedStatements,每一个mapperedStatement都表示Mapper接口中的一个方法与Mapper映射文件中的一个SQL。
MP在启动就会挨个分析xxxMapper中的方法,并将对应的sql语句处理好,保存到configuration对象中的mapperStatements中。
4)本质:在启动的时候,把每一个方法构造成MapperStatement。
a.SqlMethod:枚举对象,MP支持的SQL语句
b.TableInfo:数据库表的反射信息,可以获取到数据库表相关的信息
c.SqlSource:sql语句处理对象
d.MapperBuilderAssistant:用于缓存、SQL参数、查询方法结果集处理等。通过MapperBuilderAssistant将每一个mapperedStatement添加到configuration中的mappedstatments中
3.3 通用CRUD小结
1、以上是基本的CRUD操作,如您所见,我们仅仅需要继承一个BaseMappper即可实现大部分单标CRUD操作。BaseMapper提供了多达17个方法给大家使用,可以极其方便的实现单一、批量、分页等操作。极大的减少开发负担,难道这就是泗MP的强大之处了吗?
2、提出需求:
现有一个需求,我们需要分页查询Employee表中,年龄在18~50之间性别为男且姓名为xx的所有用户,这时候我们该如何实现上述需求呢?
MyBatis:需要在SQL映射文件中编写带条件查询的SQL,并基于PageHelper插件完成分页,实现以上需求,往往需要我们做很多重复单调的工作。普通的Mapper能够解决这类痛点吗?
MP:依旧不用编写SQL语句,MP提供了功能强大的条件构造器EntityWrapper
4、条件构造器EntityWrapper
4.1 EntityWrapper简介
1、MyBatis-Plus通过EntityWrapper(简称EW,MP封装的一个查询条件构造器)或者Condition(和EW类似)来让用户自由的构建查询条件,简单便捷,没有额外的负担,能够有效提高开发效率。
2、实体类包装器,主要用于处理sql拼接,排序,实体类参数查询等
3、注意:使用的是数据库字段,不是java属性!
4、条件参数说明
查询方式 | 说明 |
---|---|
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 | 模糊查询NOTLIKE |
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 | 拼接在最后,例如:{“LIMIT 1”} |
4.2 带条件的查询
1、List selectList(@Param(“ew”) T entity,@Param(“ew”) Wrapper wrapper);
2、List selectPage();
List<Employee> userListCondition = employeeMapper.selectPage(new Page<Employee>(2,3),
new EntityWrapper<Employee>()
.eq("gender",1)
.eq("last_name","MyBatisPlus")
.between("age",18,50));
4.3 带条件的修改
1、Integer update(@Param(“et”) T entity,@Param(“ew”) Wrapper warpper);
4.4 带条件的删除
1、Integer delete(@Param(“ew”) Wrapper wrapper);
4.5 使用Condition的方式打开如上需求
List<Employee> userListCondition = employeeMapper.selectPage(new Page<Employee>(2,3),
Condition.create()
.eq("gender",1)
.eq("last_name","MyBatisPlus")
.between("age",18,50));
4.6 小结
MP:EntityWrapper Condition 条件构造器
MyBatis MBG: xxxExample–>Criteria:QBC(Query By Criteria)QBC风格的查询
Hibernate、通用Mapper
5、ActiveRecord(活动记录)
Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
ActiveRecord一致广受动态语言(php、Ruby等)的喜爱,而Java作为准静态语言,对于ActiveRecord往往只能感叹其优雅,所以MP也在AR道路上进行了一定的探索
5.1 如何使用AR模式
1、仅仅需要让实体类集成Model类且实现主键指定方法,即可开启AR之旅。
@TableName("tbl_employee")
public class Employee extends Model<Employee>{
// ... fields
// ... getter and setter
}