博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一起来学SpringBoot | 第八篇:通用Mapper与分页插件的集成
阅读量:7112 次
发布时间:2019-06-28

本文共 7535 字,大约阅读时间需要 25 分钟。

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

在一文中,我们介绍了Mybatis这款优秀的框架,顺便提及了民间大神开发的两款插件通用MapperPageHelper,从此告别简单CURD代码的编写....

<!-- more -->

插件介绍

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

MyBatis 从入门到精通

  • 京东:
  • 当当:
分页插件
  • GIT地址:

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

通用Mapper
  • GIT地址:

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

导入依赖

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

tk.mybatis
mapper-spring-boot-starter
2.0.2
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.5
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test

属性配置

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

spring.datasource.url=jdbc:mysql://localhost:3306/chapter7?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=falsespring.datasource.password=rootspring.datasource.username=root# 如果想看到mybatis日志需要做如下配置logging.level.com.battcn=DEBUG########## Mybatis 自身配置 ##########mybatis.mapper-locations=classpath:com/battcn/mapper/*.xmlmybatis.type-aliases-package=com.battcn.entity# 驼峰命名规范 如:数据库字段是  order_id 那么 实体字段就要写成 orderIdmybatis.configuration.map-underscore-to-camel-case=true########## 通用Mapper ########### 主键自增回写方法,默认值MYSQL,详细说明请看文档mapper.identity=MYSQLmapper.mappers=tk.mybatis.mapper.common.BaseMapper# 设置 insert 和 update 中,是否判断字符串类型!=''mapper.not-empty=true# 枚举按简单类型处理mapper.enum-as-simple-type=true########## 分页插件 ##########pagehelper.helper-dialect=mysqlpagehelper.params=count=countSqlpagehelper.reasonable=falsepagehelper.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 配置的字段中取值,查找到合适的值时就会自动分页。
注意事项

由于 mybatis.mapper-locations=classpath:com/battcn/mapper/*.xml配置的在java package中,而Spring Boot默认只打入java package -> *.java,所以我们需要给pom.xml文件添加如下内容

src/main/resources
src/main/java
**/*.xml
true
org.springframework.boot
spring-boot-maven-plugin

具体编码

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

表结构

创建一张 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.battcn.entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;import java.io.Serializable;/** * @author Levin * @since 2018/5/10 0007 */@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;    // TODO  省略get set}

持久层

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

UserMapper

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

package com.battcn.mapper;import com.battcn.entity.User;import org.apache.ibatis.annotations.Mapper;import tk.mybatis.mapper.common.BaseMapper;/** * t_user 操作,继承 BaseMapper
就可以了,是不是有点类似 JpaRepository * * @author Levin * @since 2018/5/10 0007 */@Mapperpublic interface UserMapper extends BaseMapper
{ /** * 根据用户名统计(TODO 假设它是一个很复杂的SQL) * * @param username 用户名 * @return 统计结果 */ int countByUsername(String username);}
UserMapper 映射文件

测试

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

package com.battcn;import com.battcn.entity.User;import com.battcn.mapper.UserMapper;import com.github.pagehelper.PageHelper;import com.github.pagehelper.PageInfo;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;import java.util.List;/** * @author Levin */@RunWith(SpringRunner.class)@SpringBootTestpublic class Chapter7ApplicationTests {    private static final Logger log = LoggerFactory.getLogger(Chapter7ApplicationTests.class);    @Autowired    private UserMapper userMapper;    @Test    public 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 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
userPageInfo = new PageInfo<>(this.userMapper.selectAll()); log.info("[普通写法] - [{}]", userPageInfo); }}

总结

  1. Mybatis官方文档:
  2. 通用Mapper文档:
  3. 分页插件文档:

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

说点什么

  • 个人QQ:1837307557
  • battcn开源群(适合新手):391619659
  • 微信公众号(欢迎调戏):battcn

公众号

个人博客:

全文代码:

转载地址:http://cpmhl.baihongyu.com/

你可能感兴趣的文章
感想二
查看>>
Mangos魔兽世界服务端初探(1)--游戏服务端主体结构与消息分发
查看>>
SonarQube svn 认证失败的解决办法
查看>>
C++string与VC++CString互转
查看>>
Ubuntu查找占用端口进程并删除
查看>>
Rgb to Yuv,Tuv to Rgb转换(C# emgucv)
查看>>
JSTL标签+EL表达式
查看>>
PHP中的java方式重载
查看>>
CSS3:RESET、标准注释、多屏幕尺寸兼容写法。
查看>>
小得瑟一下,记一下一个SQL语句
查看>>
osx分区合并命令行操作
查看>>
Android 签名出错
查看>>
.net 获得txt内容
查看>>
顺序存储的队列实现(CPP)
查看>>
《关键字选取三步走:最后一步,一个页面多次使用+多次重新加载。
查看>>
zookeeper 常用
查看>>
ES6 new syntax features
查看>>
.NET Core 1.0会不会成为Vista?真为他捏一把汗
查看>>
Android 实现App会话超时设计
查看>>
sparkStreaming SQL黑名单过滤
查看>>