MP
MybatisPlus
MyBatis-Plus(简称 MP),是一个 MyBatis 的增强工具包,只做增强不做改变. 为简化开 发工作、提高生产率而生
- 官方地址: http://mp.baomidou.com
- 代码发布地址: Github:https://github.com/baomidou/mybatis-plus
Gitee: https://gitee.com/baomidou/mybatis-plus
文档发布地址: http://mp.baomidou.com/#/id=%E7%AE%80%E4%BB%8B
优点
- 无侵入
- 依赖少
- 预防sql注入
- 通用crud(内置通用mapper)
- …
集成MP
创建测试表
创建 javaBean
- java bean要与表中字段对应
- 成员变量均使用包装类型(Integer),而不用基本类型,是因为mybatis,MP,操作成员变量时会进行非空判断,使用基本类型会存在默认值(int默认0,boolean为false,所以很难判断当前字段是否为空,所以都要尽量使用包装类型)
依赖配置
- 在 pom.xml 中加入对 MP、Spring、连接池、Junit、Mysql 驱动等依赖
( Mybatis 及 Mybatis-Spring 依赖请勿加入项目配置,以免引起版本冲突!!! Mybatis-Plus 会自动帮你维护!
)
<!-- mp 依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.3</version>
</dependency>
<!--junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<!-- log4j -->
<!-- c3p0 -->
<!-- mysql -->
<!-- spring -->
- 加入 MyBatis 的全局配置文件(Mybatis-config-xml)
没做任何配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
- 加入 log4j.xml
- 加入 db.properties 连接信息配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mp
jdbc.username=root
jdbc.password=1234
-
加入 spring 的配置文件 applicationContext.xml
- < !-- 数据源 -->
- < !-- 事务管理器 --> < !-- 基于注解的事务管理 -->
- < !-- 配置 SqlSessionFactoryBean --> <bean
- 配置 mybatis 扫描 mapper 接口的路径
集成 MP
- Mybatis-Plus 的集成非常简单,对于 Spring,我们仅仅需要把 Mybatis 自带 MybatisSqlSessionFactoryBean 替换为 MP 自带的即可
applicationContext.xml
<!-- 配置 SqlSessionFactoryBean -->
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
原mybatis提供的为
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
入门HelloWorld
通用CRUD
-
基于 Mybatis
- 需要编写 EmployeeMapper 接口,并手动编写 CRUD 方法
- 提供 EmployeeMapper.xml 映射文件,并手动编写每个方法对应的 SQL 语句.
-
基于 MP
- 只需要创建 EmployeeMapper 接口, 并继承 BaseMapper 接口.这就是使用 MP 需要完成的所有操作,甚至不需要创建 SQL 映射文件
-
Mapper继承BaseMapper接口后,无需编写mapper.xml,即可获得CRUD功能
- 这个接口中已经定义好了很多CRUD方法
插入操作
Integer insert(T entity);
insertAllColumn(T entity)
@TableId
- Value:指定表中的主键列的列名,如果实体属性名和列名一致,可以省略
- type: 指定主键策略
@TableName
- MP会默认会默认使用实体类的类名到数据库中找对应的表
- 用表名注解当前实体类对应的表名
@TableField
- 实体类中的属性与数据库中类名不一致时可用该注解指明
- 实体类的成员变量对应在数据库中的字段是什么
MP的全局配置策略
-
在applicationCpntext中配置
-
如数据库字段下划线到实体类驼峰命名的映射的解决
-
配置完后还需要注入全局MP策略配置
支持主键自增的数据库插入数据获取主键值
- Mybatis: 需要通过 useGeneratedKeys 以及 keyProperty 来设置
- MP: 自动将主键值回写到实体类中
insertALLColumn
-
Insert方法插入时,会根据实体类的每个属性进行非空判断,只有非空属性对应的字段才会出现在SQL
-
insertALLColumn在插入时,不管属性是否为空,属性所对应的字段都会出现在SQL中
更新操作
- Integer updateById(@Param(“et”) T entity); 会做非空判断,空的不会出现在SQL中
- Integer updateAllColumnById(@Param(“et”) T entity);不会做非空判断
查询操作
-
T selectById(Serializable id);
-
T selectOne(@Param(“ew”) T entity);
将几个列组合成一个对象,封装成对象,传入select语句进行查询 -
List selectBatchIds(List<? extends Serializable> idList
通过多个id进行批量查询,封装成对象集合传出 -
List selectByMap(@Param(“cm”) Map<String, Object> columnMap);
通过map封装条件查询,注意封装条件时要用数据库的字段名而不能用属性名 -
List selectPage(RowBounds rowBounds, @Param(“ew”) Wrapper wrapper);
分页查询(基于Mybatis的rowbounds对象实现)
删除操作
- Integer deleteById(Serializable id);
- Integer deleteByMap(@Param(“cm”) Map<String, Object> columnMap)
用map封装删除条件 - Integer deleteBatchIds(List<? extends Serializable> idList)
MP启动注入SQL原理分析
条件构造器EntityWrapper
- Mybatis-Plus 通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者 Condition(与 EW 类似)来让用户自由的构建查询条件,简但快捷,提高开发效率
- 实体包装器EntityWrapper主要用于处理sql 拼接,排序,实体参数查询等
- 注意: 使用的是数据库字段,不是Java属性
ActiveRecord(活动记录)
Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的 一个表,而模型类的一个实例对应表中的一行记录