MyBatis Plus (三) --------- 入门 HelloWorld
目录
- 一、通用 CRUD
- 二、插入操作
- 三、更新操作
- 四、查询操作
- 五、删除操作
- 六、MP 启动注入 SQL 原理分析
- 七、通用 CRUD 小结
一、通用 CRUD
A、提出问题:
假设我们已存在一张 tbl_employee 表,且已有对应的实体类Employee,实现 tbl_employee 表的 CRUD 操作我们需要做什么呢?
B、实现方式
-
基于 Mybatis
- 需要编写 EmployeeMapper 接口,并手动编写 CRUD 方法
- 提供 EmployeeMapper.xml 映射文件,并手动编写每个方法对应的 SQL 语句.
-
基于 MP
- 只需要创建 EmployeeMapper 接口, 并继承 BaseMapper 接口。这就是使用 MP 需要完成的所有操作,甚至不需要创建 SQL 映射文件。
二、插入操作
Integer insert(T entity);
@TableName
全局的 MP 配置: <property name="tablePrefix" value="tbl_"></property>
@TableField
全局的 MP 配置: <property name="dbColumnUnderline" value="true"></property>
@TableId
全局的 MP 配置: <property name="idType" value="0"></property>
支持主键自增的数据库插入数据获取主键值
MyBatis:需要通过 useGeneratedKeys 以及 keyProperty 来设置
MP:自动将主键值回写到实体类中
Integer insertAllColumn(T entity)
三、更新操作
Integer updateById(@Param("et") T entity);
Integer updateAllColumnById(@Param("et") T entity)
四、查询操作
T selectById(Serializable id);
T selectOne(@Param("ew") T entity);
List<T> selectBatchIds(List<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
List<T> selectPage(RowBounds rowBounds, @Param("ew") Wrapper<T> wrapper);
五、删除操作
Integer deleteById(Serializable id);
Integer deleteByMap(@Param("cm") Map<String, Object> columnMap);
Integer deleteBatchIds(List<? extends Serializable> idList);
六、MP 启动注入 SQL 原理分析
问题: xxxMapper 继承了 BaseMapper,BaseMapper 中提供了通用的 CRUD 方法,方法来源于 BaseMapper,有方法就必须有 SQL,因为 MyBatis 最终还是需要通过 SQL 语句操作数据.
前置知识:MyBatis 源码中比较重要的一些对象, MyBatis 框架的执行流程
Configuration
MappedStatement
……..
通过现象看到本质
A.employeeMapper 的本质 org.apache.ibatis.binding.MapperProxy
B.MapperProxy 中 sqlSession –>SqlSessionFactory
C.SqlSessionFacotry 中 → Configuration→ MappedStatements
每一个 mappedStatement 都表示 Mapper 接口中的一个方法与 Mapper 映射文件中的一个 SQL。MP 在启动就会挨个分析 xxxMapper 中的方法,并且将对应的 SQL 语句处理好,保存到 configuration 对象中的 mappedStatements 中。
D.本质
Configuration: MyBatis 或者 MP 全局配置对象
MappedStatement:一个 MappedStatement 对象对应 Mapper 配置文件中的一个select/update/insert/delete 节点,主要描述的是一条 SQL 语句
SqlMethod : 枚举对象 ,MP 支持的 SQL 方法
TableInfo:数据库表反射信息 ,可以获取到数据库表相关的信息
SqlSource: SQL 语句处理对象
MapperBuilderAssistant: 用于缓存、SQL 参数、查询方剂结果集处理等通过 MapperBuilderAssistant 将每一个 mappedStatement添加到 configuration 中的 mappedstatements 中。
七、通用 CRUD 小结
以上是基本的 CRUD 操作,如您所见,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法给大家使用, 可以极其方便的实现单一、批量、分页等操作。极大的减少开发负担,难道这就是 MP 的强大之处了吗?
提出需求:
现有一个需求,我们需要分页查询 tbl_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢 ?
MyBatis : 需要在 SQL 映射文件中编写带条件查询的 SQL,并基于 PageHelper 插件完成分页。实现以上一个简单的需求,往往需要我们做很多重复单调的工作。普通的 Mapper 能够解决这类痛点吗?
MP:依旧不用编写 SQL 语句,MP 提供了功能强大的条件构造器 EntityWrapper