Mybatis-Plus
1.1. 什么是Mybatis-Plus
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
1.2. 为什么要学习Mybatis-Plus
我们已经学习过Mybatis这个框架,我们只需要在dao层定义抽象接口,基于Mybatis零实现的特性,就可以实现对数据库的crud操作。
如下两个接口:
UserMapper接口
public interface UserMapper { int deleteByPrimaryKey(Long id); int insert(User user); List<User> selectList(); User selectByPrimaryKey(Long id); }
OrderMapper接口
public interface OrderMapper { int deleteByPrimaryKey(Long id); int insert(Order order); List<Order> selectList(); User selectByPrimaryKey(Long id); }
在上面两个业务接口中,我们发现:它们定义了一组类似的crud方法。
在业务类型比较多的时候,我们需要重复的定义这组功能类似的接口方法。
如何解决这个问题呢?
使用Mybatis-plus工具,我们只需要将我们定义的抽象接口,继承一个公用的BaseMapper<T>接口,就可以获得一组通用的crud方法,来操作数据库!!!
使用Mybatis-plus时,甚至都不需要任何的xml映射文件或者接口方法注解,真正的dao层零实现。
public interface OrderMapper extends BaseMapper<User> { //BaseMapper已经实现了通用的curd的方法了。如果有需要非通用的操作,才在这里自定义 }
1.3. Mybatis-Plus小结
Mybatis-Plus只是在Mybatis的基础上,实现了功能增强,让开发更加简洁高效。
Mybatis-Plus并没有修改Mybatis的任何特性!!!
2. 入门示例
2.1. 需求
使用Mybatis-Plus实现对用户的crud操作。
2.2. 配置步骤说明
(1)搭建环境(创建项目、导入包)
(2)配置Mybaits-Plus(基于Spring实现)
(3)编写测试代码
2.3. 配置步骤
2.3.1. 第一部分:搭建环境
2.3.1.1. 前提
已经创建好了数据库环境:
CREATE TABLE `tb_user` ( `id` bigint(20) NOT NULL COMMENT '主键ID', `name` varchar(30) DEFAULT NULL COMMENT '姓名', `age` int(11) DEFAULT NULL COMMENT '年龄', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (`id`) )
2.3.1.2. 说明
(1)Mybatis-Plus并没有提供单独的jar包,而是通过Maven(或者gradle)来管理jar依赖。本教程需要使用Maven构建项目。
(2)Mybatis-Plus是基于Spring框架实现的,因此使用Mybatis-Plus,必须导入Spring相关依赖。
2.3.1.3. 第一步:创建一个Maven项目
因为我们只是测试MybatisPlus框架,所以创建一个jar项目就可以了
2.3.1.4. 第二步:配置pom.xml构建文件
--需要导入依赖,并且配置项目的编码,JDK版本等构建信息
1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <groupId>org.chu.mybatisplus</groupId> 6 <artifactId>mybatisplus-demo-01-start</artifactId> 7 <version>1.0</version> 8 9 <!-- 依赖 --> 10 <dependencies> 11 <!-- spring依赖 --> 12 13 <dependency> 14 <groupId>org.springframework</groupId> 15 <artifactId>spring-jdbc</artifactId> 16 <version>4.3.24.RELEASE</version> 17 </dependency> 18 19 <dependency> 20 <groupId>org.springframework</groupId> 21 <artifactId>spring-context</artifactId> 22 <version>4.3.24.RELEASE</version> 23 </dependency> 24 25 <!-- mybatis plus --> 26 <dependency> 27 <groupId>com.baomidou</groupId> 28 <artifactId>mybatis-plus</artifactId> 29 <version>2.3.3</version> 30 </dependency> 31 32 <!-- mysql driver --> 33 <dependency> 34 <groupId>mysql</groupId> 35 <artifactId>mysql-connector-java</artifactId> 36 <version>5.1.47</version> 37 </dependency> 38 39 </dependencies> 40 41 <!-- 只有配置了build标签里面的内容,配置后都需要强制更新项目 --> 42 <build> 43 <plugins> 44 <plugin> 45 <groupId>org.apache.maven.plugins</groupId> 46 <artifactId>maven-compiler-plugin</artifactId> 47 <version>3.8.1</version> 48 <configuration> 49 <!-- 设置编码 --> 50 <encoding>UTF-8</encoding> 51 <!-- JDK版本 --> 52 <source>1.8</source> 53 <target>1.8</target> 54 </configuration> 55 </plugin> 56 <!-- 安装install命令的时候跳过单元测试 --> 57 58 <plugin> 59 <groupId>org.apache.maven.plugins</groupId> 60 <artifactId>maven-surefire-plugin</artifactId> 61 <version>2.22.2</version> 62 <configuration> 63 <skipTests>true</skipTests> 64 </configuration> 65 </plugin> 66 </plugins> 67 </build> 68 </project>
2.3.2. 第二部分:配置整合部分
整合MybatisPlus与Spring的配置。创建一个spirng-data.xml配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd 8 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> 9 10 <!-- 第一步:配置数据源 --> 11 <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> 12 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 13 <property name="url" value="jdbc:mysql://localhost:3306/mybatis-plus"></property> 14 <property name="username" value="root"></property> 15 <property name="password" value="123456"></property> 16 <!-- 最大激活的连接数 --> 17 <property name="maxActive" value="10"></property> 18 <!-- 最大空闲连接数据 --> 19 <!-- <property name="maxIdle" value="5"></property> --> 20 <!-- 超时毫秒数 --> 21 <property name="maxWait" value="30000"></property> 22 </bean> 23 <!-- 第二步:获得会话工厂 --> 24 <bean name="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> 25 <!-- 指定数据源 --> 26 <property name="dataSource" ref="dataSource"></property> 27 </bean> 28 29 <!-- 第三步:扫描动态映射对象到Spring容器 --> 30 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 31 <!-- 指定会话工厂 --> 32 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> 33 <!-- 指定扫描的映射包 --> 34 <property name="basePackage" value="org.chu.mybatisplus.mapper"></property> 35 </bean> 36 37 <!-- 第四步:配置事务代理 --> 38 <bean name="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 39 <property name="dataSource" ref="dataSource"></property> 40 </bean> 41 <tx:annotation-driven transaction-manager="tx"/> 42 </beans>
2.3.3. 第三部分:实现操作功能
说明:完成实验MybatisPlus对数据库增删改查。
2.3.3.1. 第一步:编写POJO
说明:使用Mybatis-Plus不使用xml文件,而是基于一组注解来解决实体类和数据库表的映射问题。
@TableName(value="tb_user") |
指定对应的表,表名和类名一致时,可以省略value属性。 |
@TableId |
指定表的主键。Value属性指定表的主键字段,和属性名一致时,可以省略。Type指定主键的增长策略。 |
@TableField |
指定类的属性映射的表字段,名称一致时可以省略该注解。 |
1 @TableName(value="tb_user") 2 public class User { 3 4 /*-- 5 AUTO->`0`("数据库ID自增") 6 INPUT->`1`(用户输入ID") 7 ID_WORKER->`2`("全局唯一ID") 8 UUID->`3`("全局唯一ID") 9 NONE-> 4 ("不需要ID") 10 --*/ 11 @TableId(value="id",type=IdType.AUTO) 12 private Long id;//BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', 13 //如果属性名与数据库表的字段名相同可以不写 14 @TableField(value="name") 15 private String name;//VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', 16 @TableField(value="age") 17 private Integer age;//INT(11) NULL DEFAULT NULL COMMENT '年龄', 18 @TableField(value="email") 19 private String email;//VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', 20 //补全get/set方法 21 }
2.3.3.2. 第二步:编写Mapper接口
import com.baomidou.mybatisplus.mapper.BaseMapper; public interface UserMapper extends BaseMapper<User> { }
2.3.3.3. 第三步:测试增删改查
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:spring-data.xml") public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void insert() { try { User user=new User(); user.setName("wangwu"); user.setAge(20); user.setEmail("wangwu@163.com"); Integer insert = userMapper.insert(user); System.out.println(insert); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void deleteById() { try { Integer count = userMapper.deleteById(1L); System.out.println(count); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void deleteByCondition() { try { //设置条件 EntityWrapper<User> wrapper=new EntityWrapper<>(); wrapper.like("name", "%wang%"); Integer count = userMapper.delete(wrapper); System.out.println(count); } catch (Exception e) { e.printStackTrace(); } } @Test public void update() { User user=new User(); user.setName("wangwu"); user.setEmail("wangwu@163.com"); user.setId(2L); userMapper.updateById(user); } @Test public void findAll() { List<User> users = userMapper.selectList(null); for (User user : users) { System.out.println(user.getName()); } } }
3. 常用配置
3.1. 实体类全局配置
如果在配置文件指定实体类的全局配置,那么可以不需要再配置实体类的关联注解。
--配置文件spring-data.xml的修改
<!-- 第二步:获得会话工厂 --> <bean name="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> <!-- 指定数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 全局实体类配置 --> <property name="globalConfig" > <bean class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <!-- AUTO->`0`("数据库ID自增") INPUT->`1`(用户输入ID") ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID") --> <property name="idType" value="0"></property> <!-- 实体类名与表名的关联规则是,忽略前缀 --> <property name="tablePrefix" value="tb_"></property> </bean> </property> </bean>
--实体类就可以去掉关联的注解了
public class User { private Long id; private String name; private Integer age; private String email; //补全get、set方法 }
3.2. 插件配置
Mybatis默认情况下,是不支持物理分页的。默认提供的RowBounds这个分页是逻辑分页来的。
所谓的逻辑分页,就是将数据库里面的数据全部查询出来后,在根据设置的参数返回对应的记录。(分页是在程序的内存中完成)。【表数据过多时,会溢出】
所谓的物理分页,就是根据条件限制,返回指定的记录。(分页在数据库里面已经完成)
MybatisPlus是默认使用RowBounds对象是支持物理分页的。但是需要通过配置Mybatis插件来开启。
配置代码
<!-- 第二步:获得会话工厂 --> <bean name="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> <!-- 指定数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 全局实体类配置 --> <property name="globalConfig" > <bean class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <!-- AUTO->`0`("数据库ID自增") INPUT->`1`(用户输入ID") ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID") --> <property name="idType" value="0"></property> <!-- 实体类名与表名的关联规则是,忽略前缀 --> <property name="tablePrefix" value="tb_"></property> </bean> </property> <!-- 配置插件 --> <property name="plugins"> <list> <!-- 分页的支持 --> <bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"> <!-- 方言 --> <!-- 我们使用的是MySQL数据库,所以需要配置MySQL的方言 --> <property name="dialectClazz" value="com.baomidou.mybatisplus.plugins.pagination.dialects.MySqlDialect"></property> </bean> <!-- 配置支持SQL输出 --> <bean class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor"> <property name="format" value="true"></property> </bean> </list> </property> </bean>