SpringBoot如何高效集成并使用Mybatis-plus框架?
- 内容介绍
- 文章标签
- 相关推荐
本文共计3362个文字,预计阅读时间需要14分钟。
前言:对于后端开发者而言,和数据库打交道是每天都在进行的,因此一个好用的ORM框架是非常必要的。
目前,绝大多数公司都选择MyBatis框架作为底层数据库持久化框架。MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatis-Plus
前言
对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数据库持久化框架。
Mybatis-Plus
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官方网站:mp.baomidou.com
简单来说,Mybatis-Plus是Mybatis的增强工具包,其简化了CRUD操作,提供了代码生成器,强大的条件构造器(这是我最喜欢的一个),同时内置了多个实用插件:标配的分页插件、性能分析插件、全局拦截插件等。使得开发过程中,基本的范式代码都一句话解决了,省去了很多重复的操作(程序猿存在的意义呢,说好的让我们搬砖呢!)。
SpringBoot集成
这里选用的mybatis-plus版本为:2.1.9, mybatisplus-spring-boot-starter版本为:1.0.5。 对应Mybatis版本为:3.4.5
0. 这里以user表为例子,数据库为mysql
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) DEFAULT NULL COMMENT '唯一标示', `code` varchar(20) DEFAULT NULL COMMENT '编码', `name` varchar(64) DEFAULT NULL COMMENT '名称', `status` char(1) DEFAULT '1' COMMENT '状态 1启用 0 停用', `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8;1. pom依赖:
<!--mybatis plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-spring-boot-starter</artifactId> <version>1.0.5</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.1.9</version> </dependency>2. 配置文件(当然也可以直接使用@Bean的方式进行或者通过application配置文件进行,详见官网)
spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="www.springframework.org/schema/beans" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xmlns:tx="www.springframework.org/schema/tx" xsi:schemaLocation="www.springframework.org/schema/beans www.springframework.org/schema/beans/spring-beans.xsd www.springframework.org/schema/tx www.springframework.org/schema/tx/spring-tx.xsd"> <!--创建jdbc数据源 这里直接使用阿里的druid数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClassName" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="${mysql.password}"/> <!-- 初始化连接大小 --> <property name="initialSize" value="0"/> <!-- 连接池最大使用连接数量 --> <property name="maxActive" value="20"/> <!-- 连接池最大空闲 --> <property name="maxIdle" value="20"/> <!-- 连接池最小空闲 --> <property name="minIdle" value="0"/> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="60000"/> <property name="validationQuery" value="${validationQuery}"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="testWhileIdle" value="true"/> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="25200000"/> <!-- 打开removeAbandoned功能 --> <property name="removeAbandoned" value="true"/> <!-- 1800秒,也就是30分钟 --> <property name="removeAbandonedTimeout" value="1800"/> <!-- 关闭abanded连接时输出错误日志 --> <property name="logAbandoned" value="true"/> <!-- 监控数据库 --> <property name="filters" value="mergeStat"/> </bean> <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 可通过注解控制事务 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!--mybatis--> <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 自动扫描mapper.xml文件,支持通配符 --> <property name="mapperLocations" value="classpath:mapper/**/*.xml"/> <!-- 配置文件,比如参数配置(是否启动驼峰等)、插件配置等 --> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/> <!-- 启用别名,这样就无需写全路径类名了,具体可自行查阅资料 --> <property name="typeAliasesPackage" value="cn.lqdev.learning.springboot.chapter9.biz.entity"/> <!-- MP 全局配置注入 --> <property name="globalConfig" ref="globalConfig"/> </bean> <bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <!-- AUTO->`0`("数据库ID自增")QW INPUT->`1`(用户输入ID") ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID") --> <property name="idType" value="3" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 自动扫描包路径,接口自动注册为一个bean类 --> <property name="basePackage" value="cn.lqdev.learning.springboot.chapter9.biz.dao"/> </bean> </beans>3. 编写启动类,应用启动时自动加载配置xml文件
/** * mybatisPlus 配置类,使其加载配置文件 * @author oKong * */ @Configuration @ImportResource(locations = {"classpath:/mybatis/spring-mybatis.xml"}) //@MapperScan("cn.lqdev.learning.springboot.chapter9.biz.dao") //@EnableTransactionManagement public class MybatisPlusConfig { }至此,mybatis-plus就配置完成了,接下来,利用代码生成器一次性创建所需的dao、mapper、通用CRUDservice类。
4. 编写代码生成器类
由于生成器依赖velocity模版引擎,故需要加入依赖:
<dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> <scope>test</scope> </dependency>MysqlGenerator,此类较长,相关配置可根据实际情况信息修改替换。
运行后即可,省了多少事!
简单实例
简单演示下增删改查及分页的使用。
使用分页时,mybatis-config.xml需要加入分页插件:PerformanceInterceptor
<plugins> <!-- 分页插件配置 --> <plugin interceptor="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></plugin> </plugins>编写控制层
/** * 用户控制层 简单演示增删改查及分页 * @author oKong * */ @RestController @RequestMapping("/user") public class UserController { @Autowired IUserService userService; @PostMapping("add") //正常业务时, 需要在user类里面进行事务控制,控制层一般不进行业务控制的。 //@Transactional(rollbackFor = Exception.class) public Map<String,String> addUser(@Valid @RequestBody UserReq userReq){ User user = new User(); user.setCode(userReq.getCode()); user.setName(userReq.getName()); //由于设置了主键策略 id可不用赋值 会自动生成 //user.setId(0L); userService.insert(user); Map<String,String> result = new HashMap<String,String>(); result.put("respCode", "01"); result.put("respMsg", "新增成功"); //事务测试 //System.out.println(1/0); return result; } @PostMapping("update") public Map<String,String> updateUser(@Valid @RequestBody UserReq userReq){ if(userReq.getId() == null || "".equals(userReq.getId())) { throw new CommonException("0000", "更新时ID不能为空"); } User user = new User(); user.setCode(userReq.getCode()); user.setName(userReq.getName()); user.setId(Long.parseLong(userReq.getId())); userService.updateById(user); Map<String,String> result = new HashMap<String,String>(); result.put("respCode", "01"); result.put("respMsg", "更新成功"); return result; } @GetMapping("/get/{id}") public Map<String,Object> getUser(@PathVariable("id") String id){ //查询 User user = userService.selectById(id); if(user == null) { throw new CommonException("0001", "用户ID:" + id + ",未找到"); } UserResp resp = UserResp.builder() .id(user.getId().toString()) .code(user.getCode()) .name(user.getName()) .status(user.getStatus()) .build(); Map<String,Object> result = new HashMap<String,Object>(); result.put("respCode", "01"); result.put("respMsg", "成功"); result.put("data", resp); return result; } @GetMapping("/page") public Map<String,Object> pageUser(int current, int size){ //分页 Page<User> page = new Page<>(current, size); Map<String,Object> result = new HashMap<String,Object>(); result.put("respCode", "01"); result.put("respMsg", "成功"); result.put("data", userService.selectPage(page)); return result; } }启动应用后,使用postman依次访问对应的url地址即可。
数据库:
分页
由于配置了分析插件,控制台会输出执行的sql语句
其他的就不一一贴图了。
关于事务
正常情况下,只需要在服务层中加入@Transactional即可,事务相关的此章节不进行阐述,之后有机会会专门拿一个章节来说明下。
示例中为了方便,直接在控制层中加入了@Transactional进行事务测试,正式开发过程中,强烈建议在服务层进行业务控制,控制层一般上是进行逻辑判断的!
实体对象字段为枚举类
可能在实际开发中,大家会碰到,为了方便,一些类型、状态字段会编写成枚举类型,比如启用状态:DISABLE(“0”),ENABLE(“1”)。此时可通过配置typeHandlers进行自定义类型的处理,这里简单以EnumOrdinalTypeHandler(存储enum类里的序号值)进行示例,当然也可根据需要进行自定义处理器的编写,比如编写一个通用的枚举转换器等,其他相关知识点,大家可自行谷歌。
StatusEnums
public enum StatusEnum { DISABLE, ENABLE; }将user对象修改成枚举类型
/** * 状态1 启用 0 停用 */ private StatusEnum status;配置文件mybatis-config.xml加入处理类
<typeHandlers> <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="cn.lqdev.learning.springboot.chapter9.biz.entity.StatusEnum"/> </typeHandlers>之后就会自动进行转换了。大家可下载示例,进行实际操作下。
总结
本章节主要是对Mybatis-plus的集成和简单使用进行了说明,详细的用法,可到官网查看,官网有详细的使用指南,这里就不班门弄斧了。至此,对于一般的开发需求基本上都可以满足了。接下来的章节会重点讲解其他配套工具的使用,敬请期待!
参考
blog.lqdev.cn/2018/07/21/springboot/chapter-nine/
本文共计3362个文字,预计阅读时间需要14分钟。
前言:对于后端开发者而言,和数据库打交道是每天都在进行的,因此一个好用的ORM框架是非常必要的。
目前,绝大多数公司都选择MyBatis框架作为底层数据库持久化框架。MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatis-Plus
前言
对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数据库持久化框架。
Mybatis-Plus
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官方网站:mp.baomidou.com
简单来说,Mybatis-Plus是Mybatis的增强工具包,其简化了CRUD操作,提供了代码生成器,强大的条件构造器(这是我最喜欢的一个),同时内置了多个实用插件:标配的分页插件、性能分析插件、全局拦截插件等。使得开发过程中,基本的范式代码都一句话解决了,省去了很多重复的操作(程序猿存在的意义呢,说好的让我们搬砖呢!)。
SpringBoot集成
这里选用的mybatis-plus版本为:2.1.9, mybatisplus-spring-boot-starter版本为:1.0.5。 对应Mybatis版本为:3.4.5
0. 这里以user表为例子,数据库为mysql
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) DEFAULT NULL COMMENT '唯一标示', `code` varchar(20) DEFAULT NULL COMMENT '编码', `name` varchar(64) DEFAULT NULL COMMENT '名称', `status` char(1) DEFAULT '1' COMMENT '状态 1启用 0 停用', `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8;1. pom依赖:
<!--mybatis plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-spring-boot-starter</artifactId> <version>1.0.5</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.1.9</version> </dependency>2. 配置文件(当然也可以直接使用@Bean的方式进行或者通过application配置文件进行,详见官网)
spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="www.springframework.org/schema/beans" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xmlns:tx="www.springframework.org/schema/tx" xsi:schemaLocation="www.springframework.org/schema/beans www.springframework.org/schema/beans/spring-beans.xsd www.springframework.org/schema/tx www.springframework.org/schema/tx/spring-tx.xsd"> <!--创建jdbc数据源 这里直接使用阿里的druid数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClassName" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="${mysql.password}"/> <!-- 初始化连接大小 --> <property name="initialSize" value="0"/> <!-- 连接池最大使用连接数量 --> <property name="maxActive" value="20"/> <!-- 连接池最大空闲 --> <property name="maxIdle" value="20"/> <!-- 连接池最小空闲 --> <property name="minIdle" value="0"/> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="60000"/> <property name="validationQuery" value="${validationQuery}"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="testWhileIdle" value="true"/> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="25200000"/> <!-- 打开removeAbandoned功能 --> <property name="removeAbandoned" value="true"/> <!-- 1800秒,也就是30分钟 --> <property name="removeAbandonedTimeout" value="1800"/> <!-- 关闭abanded连接时输出错误日志 --> <property name="logAbandoned" value="true"/> <!-- 监控数据库 --> <property name="filters" value="mergeStat"/> </bean> <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 可通过注解控制事务 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!--mybatis--> <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 自动扫描mapper.xml文件,支持通配符 --> <property name="mapperLocations" value="classpath:mapper/**/*.xml"/> <!-- 配置文件,比如参数配置(是否启动驼峰等)、插件配置等 --> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/> <!-- 启用别名,这样就无需写全路径类名了,具体可自行查阅资料 --> <property name="typeAliasesPackage" value="cn.lqdev.learning.springboot.chapter9.biz.entity"/> <!-- MP 全局配置注入 --> <property name="globalConfig" ref="globalConfig"/> </bean> <bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <!-- AUTO->`0`("数据库ID自增")QW INPUT->`1`(用户输入ID") ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID") --> <property name="idType" value="3" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 自动扫描包路径,接口自动注册为一个bean类 --> <property name="basePackage" value="cn.lqdev.learning.springboot.chapter9.biz.dao"/> </bean> </beans>3. 编写启动类,应用启动时自动加载配置xml文件
/** * mybatisPlus 配置类,使其加载配置文件 * @author oKong * */ @Configuration @ImportResource(locations = {"classpath:/mybatis/spring-mybatis.xml"}) //@MapperScan("cn.lqdev.learning.springboot.chapter9.biz.dao") //@EnableTransactionManagement public class MybatisPlusConfig { }至此,mybatis-plus就配置完成了,接下来,利用代码生成器一次性创建所需的dao、mapper、通用CRUDservice类。
4. 编写代码生成器类
由于生成器依赖velocity模版引擎,故需要加入依赖:
<dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> <scope>test</scope> </dependency>MysqlGenerator,此类较长,相关配置可根据实际情况信息修改替换。
运行后即可,省了多少事!
简单实例
简单演示下增删改查及分页的使用。
使用分页时,mybatis-config.xml需要加入分页插件:PerformanceInterceptor
<plugins> <!-- 分页插件配置 --> <plugin interceptor="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></plugin> </plugins>编写控制层
/** * 用户控制层 简单演示增删改查及分页 * @author oKong * */ @RestController @RequestMapping("/user") public class UserController { @Autowired IUserService userService; @PostMapping("add") //正常业务时, 需要在user类里面进行事务控制,控制层一般不进行业务控制的。 //@Transactional(rollbackFor = Exception.class) public Map<String,String> addUser(@Valid @RequestBody UserReq userReq){ User user = new User(); user.setCode(userReq.getCode()); user.setName(userReq.getName()); //由于设置了主键策略 id可不用赋值 会自动生成 //user.setId(0L); userService.insert(user); Map<String,String> result = new HashMap<String,String>(); result.put("respCode", "01"); result.put("respMsg", "新增成功"); //事务测试 //System.out.println(1/0); return result; } @PostMapping("update") public Map<String,String> updateUser(@Valid @RequestBody UserReq userReq){ if(userReq.getId() == null || "".equals(userReq.getId())) { throw new CommonException("0000", "更新时ID不能为空"); } User user = new User(); user.setCode(userReq.getCode()); user.setName(userReq.getName()); user.setId(Long.parseLong(userReq.getId())); userService.updateById(user); Map<String,String> result = new HashMap<String,String>(); result.put("respCode", "01"); result.put("respMsg", "更新成功"); return result; } @GetMapping("/get/{id}") public Map<String,Object> getUser(@PathVariable("id") String id){ //查询 User user = userService.selectById(id); if(user == null) { throw new CommonException("0001", "用户ID:" + id + ",未找到"); } UserResp resp = UserResp.builder() .id(user.getId().toString()) .code(user.getCode()) .name(user.getName()) .status(user.getStatus()) .build(); Map<String,Object> result = new HashMap<String,Object>(); result.put("respCode", "01"); result.put("respMsg", "成功"); result.put("data", resp); return result; } @GetMapping("/page") public Map<String,Object> pageUser(int current, int size){ //分页 Page<User> page = new Page<>(current, size); Map<String,Object> result = new HashMap<String,Object>(); result.put("respCode", "01"); result.put("respMsg", "成功"); result.put("data", userService.selectPage(page)); return result; } }启动应用后,使用postman依次访问对应的url地址即可。
数据库:
分页
由于配置了分析插件,控制台会输出执行的sql语句
其他的就不一一贴图了。
关于事务
正常情况下,只需要在服务层中加入@Transactional即可,事务相关的此章节不进行阐述,之后有机会会专门拿一个章节来说明下。
示例中为了方便,直接在控制层中加入了@Transactional进行事务测试,正式开发过程中,强烈建议在服务层进行业务控制,控制层一般上是进行逻辑判断的!
实体对象字段为枚举类
可能在实际开发中,大家会碰到,为了方便,一些类型、状态字段会编写成枚举类型,比如启用状态:DISABLE(“0”),ENABLE(“1”)。此时可通过配置typeHandlers进行自定义类型的处理,这里简单以EnumOrdinalTypeHandler(存储enum类里的序号值)进行示例,当然也可根据需要进行自定义处理器的编写,比如编写一个通用的枚举转换器等,其他相关知识点,大家可自行谷歌。
StatusEnums
public enum StatusEnum { DISABLE, ENABLE; }将user对象修改成枚举类型
/** * 状态1 启用 0 停用 */ private StatusEnum status;配置文件mybatis-config.xml加入处理类
<typeHandlers> <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="cn.lqdev.learning.springboot.chapter9.biz.entity.StatusEnum"/> </typeHandlers>之后就会自动进行转换了。大家可下载示例,进行实际操作下。
总结
本章节主要是对Mybatis-plus的集成和简单使用进行了说明,详细的用法,可到官网查看,官网有详细的使用指南,这里就不班门弄斧了。至此,对于一般的开发需求基本上都可以满足了。接下来的章节会重点讲解其他配套工具的使用,敬请期待!
参考
blog.lqdev.cn/2018/07/21/springboot/chapter-nine/

