• **本文作者:**唐亚峰
  • 本文链接:http://blog.battcn.com/2018/05/10/springboot/v2-orm-mybatis-plugin/
  • **版权声明:**本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

强烈推荐

分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net

SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程

在一起来学SpringBoot | 第七篇:整合Mybatis一文中,我们介绍了Mybatis这款优秀的框架,顺便提及了民间大神开发的两款插件**(通用MapperPageHelper)**,从此告别简单CURD代码的编写….

插件介绍

以下两款插件作者均是同一个人,如果你想深入了解Mybatis以及插件开发可以购买作者的书籍

  • 京东:https://item.jd.com/12103309.html
  • 当当:http://product.dangdang.com/25098208.html

分页插件

  • GIT地址:https://github.com/pagehelper/Mybatis-PageHelper

在没有分页插件之前,写一个分页需要两条SQL语句,一条查询一条统计,然后才能计算出页码,这样的代码冗余而又枯燥,更重要的一点是**数据库迁移**,众所周知不同的数据库分页写法是不同的,而Mybatis不同于Hibernate的是它只提供动态SQL和结果集映射。值得庆幸的是,它虽然没有为分页提供良好的解决方案,但却提供了Interceptor以供开发者自己扩展,这也是这款分页插件的由来….

通用Mapper

  • GIT地址:https://gitee.com/free/Mapper

通用 Mapper是一个可以实现任意MyBatis通用方法的框架,项目提供了常规的增删改查操作以及Example相关的单表操作。通用 Mapper 是为了解决 MyBatis 使用中 90% 的基本操作,使用它可以很方便的进行开发,可以节省开发人员大量的时间。

导入依赖

pom.xml中添加通用Mapper与分页插件的依赖包

<!-- 通用Mapper插件文档地址:https://gitee.com/free/Mapper/wikis/Home -->
<dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.0.2</version>
</dependency>
<!-- 分页插件文档地址:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.5</version>
</dependency>
<!-- MYSQL包 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 默认就内嵌了Tomcat 容器,如需要更换容器也极其简单-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 测试包,当我们使用 mvn package 的时候该包并不会被打入,因为它的生命周期只在 test 之内-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

属性配置

application.properties文件中分别添加上**数据库Mybatis通用MapperPageHelper的属性配置,这里只提供了常见场景的配置,更全的配置可以参考上文所述的文文档(#^.^#)**

spring.datasource.url=jdbc:mysql://localhost:3306/chapter7?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
# 如果想看到mybatis日志需要做如下配置
logging.level.com.battcn=DEBUG
########## Mybatis 自身配置 ##########
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.winterchen.entity
# 驼峰命名规范 如:数据库字段是  order_id 那么 实体字段就要写成 orderId
mybatis.configuration.map-underscore-to-camel-case=true
########## 通用Mapper ##########
# 主键自增回写方法,默认值MYSQL,详细说明请看文档
mapper.identity=MYSQL
mapper.mappers=tk.mybatis.mapper.common.BaseMapper
# 设置 insert 和 update 中,是否判断字符串类型!=''
mapper.not-empty=true
# 枚举按简单类型处理
mapper.enum-as-simple-type=true
########## 分页插件 ##########
pagehelper.helper-dialect=mysql
pagehelper.params=count=countSql
pagehelper.reasonable=false
pagehelper.support-methods-arguments=true

通用Mapper

  • **mapper.enum-as-simple-type:**枚举按简单类型处理,如果有枚举字段则需要加上该配置才会做映射
  • **mapper.not-empty:**设置以后,会去判断 insert 和 update 中符串类型!=’’

分页插件

  • **pagehelper.reasonable:**分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
  • **support-methods-arguments:**支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。

具体编码

完成基本配置后,接下来进行具体的编码操作。

表结构

创建一张t_user的表

CREATE TABLE `t_user` (`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '主键自增',`username` varchar(50) NOT NULL COMMENT '用户名',`password` varchar(50) NOT NULL COMMENT '密码',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

实体类

通用Mapper采用了JPA规范包中的注解,这种的设计避免了重复造轮子,更是让Spring Data Jpa的应用可以轻松切换到Mybatis

package com.winterchen.entity;import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;/*** Created by Donghua.Chen on 2018/6/7.*/
@Table(name = "t_user")
public class User implements Serializable{private static final long serialVersionUID = 8655851615465363473L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;public User() {}public User(String username, String password) {this.username = username;this.password = password;}public User(Long id, String username, String password) {this.id = id;this.username = username;this.password = password;}// TODO  省略get set
}

持久层

为了更好的让熟悉它,此处模拟了一个自定义的SQL,可以发现使用通用Mapper后并不会破坏原有代码结构

UserMapper

继承BaseMapper<T>就可以了,这点是不是有点类似JpaRepository,同时也可以根据自己需要扩展出更适合自己项目的BaseMapper,它的灵活也是众多开发者喜爱的因素之一

package com.winterchen.mapper;import com.winterchen.entity.User;
import org.apache.ibatis.annotations.Mapper;
import tk.mybatis.mapper.common.BaseMapper;/*** Created by Donghua.Chen on 2018/6/7.*/
@Mapper
public interface UserMapper extends BaseMapper<User> {/*** 根据用户名统计(TODO 假设它是一个很复杂的SQL)** @param username 用户名* @return 统计结果*/int countByUsername(String username);}

UserMapper映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.winterchen.mapper.UserMapper"><select id="countByUsername" resultType="java.lang.Integer">SELECT count(1) FROM t_user WHERE username = #{username}</select>
</mapper>

测试

完成数据访问层接口后,编写一个junit测试类来检验代码的正确性。

package com.winterchen;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.winterchen.entity.User;
import com.winterchen.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootMybatisPluginApplicationTests {private static final Logger log = LoggerFactory.getLogger(SpringBootMybatisPluginApplicationTests.class);@Autowiredprivate UserMapper userMapper;@Testpublic void test1() throws Exception {final User user1 = new User("u1", "p1");final User user2 = new User("u1", "p2");final User user3 = new User("u3", "p3");userMapper.insertSelective(user1);log.info("[user1回写主键] - [{}]", user1.getId());userMapper.insertSelective(user2);log.info("[user2回写主键] - [{}]", user2.getId());userMapper.insertSelective(user3);log.info("[user3回写主键] - [{}]", user3.getId());final int count = userMapper.countByUsername("u1");log.info("[调用自己写的SQL] - [{}]", count);// TODO 模拟分页userMapper.insertSelective(new User("u1", "p1"));userMapper.insertSelective(new User("u1", "p1"));userMapper.insertSelective(new User("u1", "p1"));userMapper.insertSelective(new User("u1", "p1"));userMapper.insertSelective(new User("u1", "p1"));userMapper.insertSelective(new User("u1", "p1"));userMapper.insertSelective(new User("u1", "p1"));userMapper.insertSelective(new User("u1", "p1"));userMapper.insertSelective(new User("u1", "p1"));userMapper.insertSelective(new User("u1", "p1"));// TODO 分页 + 排序 this.userMapper.selectAll() 这一句就是我们需要写的查询,有了这两款插件无缝切换各种数据库final PageInfo<Object> pageInfo = PageHelper.startPage(1, 10).setOrderBy("id desc").doSelectPageInfo(() -> this.userMapper.selectAll());log.info("[lambda写法] - [分页信息] - [{}]", pageInfo.toString());PageHelper.startPage(1, 10).setOrderBy("id desc");final PageInfo<User> userPageInfo = new PageInfo<>(this.userMapper.selectAll());log.info("[普通写法] - [{}]", userPageInfo);}}

总结

  1. Mybatis官方文档:http://www.mybatis.org/mybatis-3/zh/index.html
  2. 通用Mapper文档:https://gitee.com/free/Mapper/wikis/1.1-java?parent=1.integration
  3. 分页插件文档:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

目前很多大佬都写过关于**SpringBoot**的教程了,如有雷同,请多多包涵,本教程基于最新的spring-boot-starter-parent:2.0.1.RELEASE编写,包括新版本的特性都会一起介绍…

说点什么

springboot技术交流群:681513531

个人博客:https://blog.winterchen.com

全文代码:https://github.com/WinterChenS/springboot-learning-experience

  • **本文作者:**唐亚峰
  • 本文链接:http://blog.battcn.com/2018/05/10/springboot/v2-orm-mybatis-plugin/
  • **版权声明:**本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

一起来学SpringBoot | 第八篇:通用Mapper与分页插件的集成相关推荐

  1. Springboot集成mybatis通用Mapper与分页插件PageHelper

    Springboot集成mybatis通用Mapper与分页插件PageHelper 插件介绍 通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及 ...

  2. spring boot整合mybatis+通用mapper+pagehelper分页插件

    spring boot整合mybatis+通用mapper+pagehelper分页插件 pom依赖 <?xml version="1.0" encoding="U ...

  3. Java使用lambda进行分页,SpringBoot(八):整合mybatis,通用mapper,分页插件,lambda,Logger,junit用法...

    本文作者:低调小熊猫 转载声明:自由转载-非商用-非衍生-保持署名,非商业转载请注明作者及出处,商业转载请联系作者本人qq:2696284032 整合demo 配置依赖 tk.mybatis mapp ...

  4. [老老实实学WCF] 第八篇 实例化

    老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的 ServiceContract 的S ...

  5. 简述通用Mapper及分页助手

    什么是通用mapper? 通用mapper 可以极大的方便开发人员进行ORM,提供极其方便的单表增删改查. 什么是通用mapper,一句话简单说,它就是个辅助mybatis极简单表开发的组件.它不是为 ...

  6. SpringBoot第八篇:整合MyBatis-Generator

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10894278.html 版权声明:本文为博主原创文章,转载请附上博文链接! 注意:本章有大量代码 ...

  7. SpringBoot整合Mybatis,使用通用mapper和PageHelper进行分页

    乐哉码农 上节介绍了如何整合Security,这节就说下如何再Springboot下使用持久层框架mybatis和牛人封装的通用mapper与mybatis的整合,直接进入正题吧! 1.首先引入我们需 ...

  8. mysql mapper分页_Mybatis通用Mapper和分页pagehelper

    极其方便的使用Mybatis单表的增删改查 项目地址:http://git.oschina.net/free/Mapper 优点? 不客气的说,使用这个通用Mapper甚至能改变你对Mybatis单表 ...

  9. SpringBoot第八篇:springboot整合mongodb

    这篇文章主要介绍springboot如何整合mongodb. 准备工作 安装 MongoDB jdk 1.8 maven 3.0 idea 环境依赖 在pom文件引入spring-boot-start ...

最新文章

  1. 为什么集群要奇数_面试系列 redis数据删除amp;集群
  2. php.ini 延迟,php超时报错Maximum execution time of 120 seconds exceeded in解决办法
  3. php获取另一个php页面_post值,php接受post传值的方法
  4. 继承jpanel不显示_房产继承全指南
  5. 分布式事务——TCC 原理
  6. 【POJ - 1562】Oil Deposits (dfs搜索,连通块问题)
  7. LeetCode MySQL 1454. 活跃用户(连续dense_rank排名函数)
  8. 用python打印九九乘法表while_利用Python循环(包括whilefor)各种打印九九乘法表的实例...
  9. 如何用AnySDK快速接入SDK上线
  10. 软件测试笔试面试题目完全汇总
  11. 武汉大学计算机学院csc,2018年春武汉大学CSC公派出国留学录取名单
  12. 8B10B编码表,8B10B编码表格,8B10B查表内容
  13. Session的活化与钝化
  14. 谣言止于“较真”,腾讯新闻推出微信新闻辟谣小程序
  15. 初学Python必备的软件你知道吗?
  16. 利用CK11N改标准价格需要注意的地方
  17. 誉天华为数通认证技术指南之BGP的前世今生
  18. big5转utf-8乱码解决方案
  19. 数据结构与算法(Python版)二十二:递归可视化(谢尔宾斯基三角形)
  20. CAJ如何转换成PDF(科研必备!!)

热门文章

  1. 问题 J: 【分治】猪八戒吃西瓜,【分治】桐桐查单词(map的应用)
  2. java基于ssm的高校学生会日常事务管理信息系统
  3. python xlsxwriter 画图_Python-使用XlsxWriter模块用图案填充列绘制Excel图表
  4. 2016,上路了 就不难
  5. java jar war 文件 打包 运行
  6. 生产环境安装centos7系统教程(组装服务器)
  7. 上传大文件(100G)的解决方案
  8. 使用花生壳+Xshell进行内网穿透访问实验室(公司)内网服务器【保姆级别】
  9. php统计 柱状图,PHP动态柱状图
  10. 智慧园区产业链、建设内容及架构