SpringBoot_05_数据访问_02_整合Mybatis(下)_集成通用Mapper与分页插件

前言

一、SpringBoot 集成通用Mapper与分页插件

1.创建子模块

这里我们创建一个子模块,创建步骤同 SpringBoot_01_入门示例

group = 'com.ray.study'
artifact ='spring-boot-05-tk-mybatis'

2.引入依赖

2.1 继承父工程依赖

在父工程spring-boot-seedssettings.gradle加入子工程

rootProject.name = 'spring-boot-seeds'
include 'spring-boot-01-helloworld'
include 'spring-boot-02-restful-test'
include 'spring-boot-03-thymeleaf'
include 'spring-boot-04-swagger2'
include 'spring-boot-05-jpa'
include 'spring-boot-05-mybatis'
include 'spring-boot-05-tk-mybatis'

这样,子工程spring-boot-05-tk-mybatis就会自动继承父工程中subprojects `函数里声明的依赖,主要包含如下依赖:

		implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'

        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'

2.2 引入Mybatis依赖

将子模块spring-boot-05-Mybatisbuild.gradle修改为如下内容:

dependencies {    
    // mysql 驱动
    implementation 'mysql:mysql-connector-java'
    
    // 通用 mapper
    implementation 'tk.mybatis:mapper-spring-boot-starter:2.1.5'
    
    // mybatis 分页插件
    implementation  'com.github.pagehelper:pagehelper-spring-boot-starter:1.2.10'

}

以下为补充内容,主要是一开始我也很困惑:

看到网上很多博客都是既依赖了tk.mybatis:mapper-spring-boot-starter又依赖了mybatis-spring-boot-starter,其实这是没必要的:

(1)我们先来看下mybatis-spring-boot-starter中依赖了哪些jar包

在这里插入图片描述

(2)再看tk.mybatis:mapper-spring-boot-starter中依赖了哪些jar包

在这里插入图片描述

我们发现tk.mybatis:mapper-spring-boot-starter中已经有了mybatis-spring-boot-starter所依赖的jar包了,除了一个自动化配置的jar包,但这些自动化配置应该包括在通用mapper的自动化配置jar包中,因此没必要依赖mybatis-spring-boot-starter

3.数据库准备

若已经在上一节 SpringBoot_05_数据访问_02_整合Mybatis(上)中创建了数据库integrate-mybatis,则忽略这一步

创建数据库integrate-mybatis,然后创建user表,建表语句如下:

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
    `id` bigint(12) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
    `name` varchar(50) NOT NULL COMMENT '用户名',
    `age` int (3) unsigned DEFAULT 3 COMMENT '年龄',
    `creation_date` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP  COMMENT '创建日期',
    `last_update_date` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP  COMMENT '上次更新日期',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

4.修改application.yml

主要配置了:

  • 应用端口与上下文路径
  • 数据源
  • Mybatis自身配置
  • 通用Mapper配置
  • 分页插件
server:
  port: 8088
  servlet:
    context-path: /

spring:
  datasource:       # 配置数据源
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/integrate-mybatis?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: root

########## Mybatis 自身配置 ##########
mybatis:
  type-aliases-package: com.ray.study.springboot05tkmybatis.entity
  mapper-locations: classpath:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true  # 驼峰命名规范 如:数据库字段是  order_id 那么 实体字段就要写成 orderId


########## 通用Mapper ##########
mapper:
  identity: MYSQL
  mappers: tk.mybatis.mapper.common.BaseMapper
  not-empty: true
  enum-as-simple-type: true

########## 分页插件 ##########
pagehelper:
  helper-dialect: mysql
  params: count=countSql
  reasonable: false
  support-methods-arguments: true


(1)配置属性的来源

Mybatis以及通用Mapper的可选配置项可见tk.mybatis:mapper-spring-boot-autoconfigure工程下的spring-configuration-metadata.json文件,在这个json文件中,我们可以看到有哪些可选配置项,以及配置项是对应那个Java类的哪个属性

通用Mapper的配置主要集中在tk.mybatis.mapper.entity.Config类中,注释很详细。

(2)部分配置的说明

以下对上述配置中出现的部分配置给出说明

mapper.identity=MYSQL   # 主键自增回写方法,默认值MYSQL,详细说明请看文档
mapper.mappers=tk.mybatis.mapper.common.BaseMapper  # 通用Mapper接口,其他Mapper接口需要继承此接口
mapper.not-empty=true   # 设置 insert 和 update 中,是否判断字符串类型!=''
mapper.enum-as-simple-type=true # 枚举按简单类型处理

5.业务实现

5.1 entity

package com.ray.study.springboot05tkmybatis.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;

/**
 * description
 *
 * @author shira 2019/05/09 21:26
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "user")
public class User implements Serializable {

	private static final long serialVersionUID = 8655851615465363473L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	private String name;

	private Integer age;

	private Date creationDate;

	private Date lastUpdateDate;

}

5.1 mapper

(1)UserMapper接口

package com.ray.study.springboot05tkmybatis.mapper;

import com.ray.study.springboot05tkmybatis.entity.User;
import org.apache.ibatis.annotations.Mapper;
import tk.mybatis.mapper.common.BaseMapper;

/**
 * description
 *
 * @author shira 2019/05/09 21:27
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

	/**
	 * 根据用户名查询用户
	 * @param name 用户名
	 * @return  user
	 */
	User findByName(String name);


}

(2)UserMapper.xml

<?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.ray.study.springboot05tkmybatis.mapper.UserMapper">

    <select id="findByName" resultType="com.ray.study.springboot05tkmybatis.entity.User">
         select
            u.id,
            u.name,
            u.age
        from user u
        where u.name =#{name}
  </select>
</mapper>

6.单元测试

  • UserMapperTest
package com.ray.study.springboot05tkmybatis.mapper;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ray.study.springboot05tkmybatis.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.number.OrderingComparison.lessThanOrEqualTo;

/**
 * description
 *
 * @author shira 2019/05/10 14:40
 */
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
@Rollback
public class UserMapperTest {

	@Autowired
	private UserMapper userMapper;

	@Test
	public void testUserMapper() {
		//1. 测试插入,主键回写
		for(int i = 0; i < 30; i++) {
			User user = new User();
			user.setName("tom"+i);
			user.setAge(20+i);

			userMapper.insertSelective(user);
			assertThat(user.getId(), is(notNullValue()));
		}

		//2. 测试手写sql
		User  user0 =userMapper.findByName("tom0");
		assertThat(user0, is(notNullValue()));


		// 3.分页+排序
		int pageSize =10;
		// 3.1 lambda 写法
		final PageInfo<User> pageInfo = PageHelper
				.startPage(1, pageSize)
				.setOrderBy("id desc")
				.doSelectPageInfo(() -> this.userMapper.selectAll());
		assertThat(pageInfo.getSize(), lessThanOrEqualTo(pageSize));

		// 3.2 普通写法
		PageHelper.startPage(1, pageSize).setOrderBy("id desc");
		List<User> userList = userMapper.selectAll();
		final PageInfo<User> userPageInfo = new PageInfo<>(userList);
		assertThat(userPageInfo.getSize(), lessThanOrEqualTo(pageSize));

	}
}

二、通用Mapper相关知识

未完待续,暂时请参见

参考资料

  1. abel533__Spring Boot 集成 MyBatis, 分页插件 PageHelper, 通用 Mapper
  2. 唐亚峰__一起来学SpringBoot | 第八篇:通用Mapper与分页插件的集成
在 Spring Boot 中,可以使用两种方式配置 MyBatis 分页插件: 1. 使用 PageHelper 自动配置 PageHelper 是一个开源的 MyBatis 分页插件,支持多种数据库,使用起来非常方便。在 Spring Boot 中,可以使用 PageHelper 的自动配置功能,只需要在 pom.xml 中引入 PageHelper 依赖,然后在 application.properties 或 application.yml 中添加配置即可。 例如,在 pom.xml 中添加如下依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency> ``` 然后在 application.properties 或 application.yml 中添加如下配置: ```properties # 开启分页插件 pagehelper.helperDialect=mysql pagehelper.reasonable=true pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql ``` 2. 使用 MyBatis-Plus MyBatis-Plus 是一个开源的 MyBatis 增强工具包,其中包含了分页插件。在 Spring Boot 中,可以使用 MyBatis-Plus 的自动配置功能,只需要在 pom.xml 中引入 MyBatis-Plus 依赖,然后在 application.properties 或 application.yml 中添加配置即可。 例如,在 pom.xml 中添加如下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.2</version> </dependency> ``` 然后在 application.properties 或 application.yml 中添加如下配置: ```properties # 开启分页插件 mybatis-plus.configuration.properties.pagehelper.helperDialect=mysql ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值