SpringBoot整合通用Mapper以及Pagehelper分页插件

本文介绍如何在Spring Boot项目中整合MyBatis通用Mapper与PageHelper插件,实现快速搭建分页查询功能。包括配置步骤、实体类与Mapper接口创建、测试方法示例等内容。

前言

配置之前请注意版本问题

最近公司在用的技术,是国内的大神写的Mybatis插件,我自己也尝试搭了一个小demo,搭起来也不复杂,但也有一些坑要注意一下

首先介绍一下这两项技术:MapperPagehelper,

Mapper:通用Mapper都可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。极其方便的使用MyBatis单表的增删改查。支持单表操作,不支持通用的多表联合查询。通用 Mapper 支持 Mybatis-3.2.4 及以上版本。(此段来自官方文档)

Pagehelper:Pagehelper是一个非常好用的分页插件,配合前端的数据表格,简直不要太爽,只需填好分页参数,在你使用查询的时候就会有拦截器拦截,添加分页的通用逻辑,并且无视数据库,只需配好数据库方言。

插件开源地址为:https://github.com/abel533

注意:本文只介绍搭建的步骤,如需实现原理请移步该作者的个人网站

创建表:非常简单只有两个字段

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `stu_id` int(11) PRIMARY KEY  AUTO_INCREMENT,
  `stu_name` varchar(20)  NOT NULL
);

项目结构:去掉了一些不相关代码,只保留了基本的数据访问层,使用junit测试接口,整个项目非常简洁.

pom文件:

<!-- spring boot 父节点依赖,引入这个之后相关的引入就不需要添加version配置, 
  	spring boot会自动选择最合适的版本进行添加。 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF8</project.build.sourceEncoding>
		<!-- 指定一下jdk的版本 ,这里我们使用jdk 1.8 -->
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<!-- spring-boot-starter-web: MVC,AOP的依赖包.... -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 添加fastjson 依赖包. -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.15</version>
		</dependency>
		<!-- mysql 数据库驱动. -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.40</version>
		</dependency>
		<dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>druid</artifactId>
		    <version>1.1.9</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.0</version>
		</dependency>
		<!-- 通用Mapper,基于 starter 的自动配置 -->
		<dependency>
		  <groupId>tk.mybatis</groupId>
		  <artifactId>mapper-spring-boot-starter</artifactId>
		  <version>1.2.3</version>
		</dependency>
		<!-- 分页插件PageHelper -->
		<dependency>
	        <groupId>com.github.pagehelper</groupId>
	        <artifactId>pagehelper</artifactId>
	        <version>4.1.6</version>
	    </dependency>
	    <dependency>
	        <groupId>org.mybatis.spring.boot</groupId>
	        <artifactId>mybatis-spring-boot-starter</artifactId>
	        <version>1.3.0</version>
	    </dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>


	<!-- 构建节点. -->
	<build>
		<plugins>
			<!-- 添加SpringBoot的插件 -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

properties文件:

########################################################
###datasource -- mysql
########################################################
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://localhost:3306/studentdb
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10

# Mybatis
mybatis.typeAliasesPackage=com.zhanghui.entity
mybatis.mapperLocations=classpath:mapper/*.xml

 

创建实体类:了解hibernate看这注解看起来是不是很熟悉,hibernate是面向对象的CRM框架嘛,所以需要实体类跟表进行映射,通用Mapper生成的SQl语句也需要知道你实体类字段对应表的那个字段从而生成SQl语句,所以需要这些注解,也可以使用@NameStyle进行规则映射,比如使用"驼峰转下划线大写形式",实体类字段为"stuName",则认为你的表字段为"stu_name"

 

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import lombok.Data;

@Data//lombok,可以省略set,get等常用方法
@Table(name="student")//对应数据库表名
public class Student {
    @Id//表明此列为主键
    @Column(name="stu_id")//数据库的字段名
    @GeneratedValue(strategy = GenerationType.IDENTITY)//主键生成规则,当你使用它的添加方法时会用到
    private Integer id;
    @Column(name="stu_name")
    private String name;
    @Transient//忽略该字段,也就是该字段在表中不存在
    private String clazz;			
}

创建StudentMapper接口:因为我们使用通用Mapper提供的方法,所以你不需要写实现,你会发现继承了一个BaseMapper的接口,不着急,后面会讲到,如果你需要一些自定义的方法,原来怎么写现在一样的写,没有任何变化

import com.zhanghui.config.BaseMapper;
import com.zhanghui.entity.Student;

public interface StudentMapper extends BaseMapper<Student>{
	
}

创建StudentMapper映射文件:因为上面没有编写方法,所以这里自然也不需要写实现,写映射文件的目的是为了Mybatis能生成对应的实现类

<?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.zhanghui.mapper.StudentDao">
	
</mapper>

 

创建BaseMapper:通过源码可以看到这些接口的顶级接口最后又被分为增删改查四大类,所以上面的StudentMapper通过继承BaseMapper,就间接实现了这些通用的增删改查接口当然这一部分接口不需要你自己实现,所以它不能和其它的mapper放在一起,以免被@MapperScan("com.*.Mapper")扫描到,Mybatis扫描后发现你实现了这么多接口但是在映射文件却一个也没有实现,这时候就会报错。但是这些接口一定要被通用Mapper的MapperScan扫描到,由它来根据你在实体类与表中配关系生成通用的增删改查方法

import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * 通用mapper,注意:这个mapper不能和其它mapper放在一起
 * 也就是不能被Mybatis扫描到
 */
public interface BaseMapper<T> extends Mapper<T>, MySqlMapper<T>, IdsMapper<T> {

}

 

创建MyBatisMapperScannerConfig:这个是最关键的一个类,由它进行配置,配置的解释在注释中都已经说明白了,记得把mapper类的包名换成自己项目中实际的包名

 

/**
 * 通用mapper与分页插件的一些配置
 */
@Configuration
public class MyBatisMapperScannerConfig {
	
   /**
   * 使用通用Mapper之前需要初始化的一些信息
   * 使用通用Mapper插件时请勿使用热加载,否则报错,插件作者后续应该会修复
   */
   @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
	   
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        mapperScannerConfigurer.setBasePackage("com.zhanghui.mapper");//普通mapper的位置
        
        Properties properties = new Properties();
        properties.setProperty("mappers", BaseMapper.class.getName());//通用mapper的全名
        properties.setProperty("notEmpty", "false");
        properties.setProperty("IDENTITY", "MYSQL");//配置数据库方言
        
        mapperScannerConfigurer.setProperties(properties);
        
        return mapperScannerConfigurer;
    }

   /**
    * 配置mybatis的分页插件pageHelper
    */
   @Bean
   public PageHelper pageHelper(){
       PageHelper pageHelper = new PageHelper();
       Properties properties = new Properties();
       //设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用
       properties.setProperty("offsetAsPageNum","true");
       //置为true时,使用RowBounds分页会进行count查询
       properties.setProperty("rowBoundsWithCount","true");
       //合理化查询,启用合理化时,
       //如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
       //未开启时如果pageNum<1或pageNum>pages会返回空数据
       properties.setProperty("reasonable","true");
       //配置mysql数据库的方言
       properties.setProperty("dialect","mysql");   
       pageHelper.setProperties(properties);
       return pageHelper;
   }
}

创建SpringBoot启动类:这个懂SpringBoot的都懂,这里就不讲了

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.zhanghui.config.BaseMapper;

@SpringBootApplication
@MapperScan(basePackages = { "com.zhanghui.mapper" },markerInterface = BaseMapper.class)
public class App extends WebMvcConfigurerAdapter{
		
		public static void main(String[] args) {
			SpringApplication.run(App.class, args);
		}
		
}

创建MapperTest:这一步不是必须的,我这里是为了方便,也为了快速定位问题可以看到selectAll与select这两个方法并不是我实现的而是通用Mapper生成的,更多方法请见通用Mapper方法大全

/**
 * 为了简单只有数据访问层,
 * 写测试类测试
 * 这里只用到了查询的方法,mapper提供
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class MapperTest {
		
		@Resource
		private StudentMapper studentMapper;
		
		@Test
		public void test1() {
			//不分页查询
			List<Student> lis1 = studentMapper.selectAll();		
			for (Student stu : lis1) {
				System.out.println(stu);
			}
			System.out.println("-------------------------------------------------------------------");
			System.out.println("-------------------------------------------------------------------");
			
			//分页查询,显示第一页,每页五条
			PageHelper.startPage(1,5);
			List<Student> lis2 = studentMapper.selectAll();	
			for (Student stu : lis2) {
				System.out.println(stu);
			}
			System.out.println("-------------------------------------------------------------------");
			System.out.println("-------------------------------------------------------------------");
			
			//分页查询,显示第一页,每页五条,按id降序
			PageHelper.startPage(1,5,"stu_id desc");
			List<Student> lis3 = studentMapper.selectAll();	
			for (Student stu : lis3) {
				System.out.println(stu);
			}
			System.out.println("-------------------------------------------------------------------");
			System.out.println("-------------------------------------------------------------------");
			
			//分页查询,显示第一页,每页五条,按id降序
			PageHelper.startPage(1,5,"stu_id desc");
			Student student = new Student();
			student.setName("二班张三");
			List<Student> lis4 = studentMapper.select(student);	
			for (Student stu : lis4) {
				System.out.println(stu);
			}
			
		}
		
}

两个插件到这里就整合完了,貌似PageHelper完全没提到,因为太简单了,简单配置然后可以直接使用了,如果这个插件在项目中使用还会用到一个分页类PageInfo,比如你在Service层中查询分页查询学生,在controller直接返回PageInfo就好,配合前端的数据表格插件会很舒服

                       //分页查询,显示第一页,每页五条,按id降序
                        PageHelper.startPage(1,5,"stu_id desc");
                        List<Student> lis4 = studentMapper.selectAll();
                        //使用的时候Pagehelper会自动填充PageInfo,你只需将查到的信息填充就好
                        return new PageInfo<>(lis4);

整个项目为了方便初学者学习只保留了主要的枝干,所以看起来非常简单,很精简,哈哈

END~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值