Springboot集成mybatis通用Mapper與分頁插件PageHelper

插件介紹

通用 Mapper 是一個能夠實現任意 MyBatis 通用方法的框架,項目提供了常規的增刪改查操做以及 Example 相關的單表操做。通用 Mapper 是爲了解決 MyBatis 使用中 90% 的基本操做,PageHelper則提供通用的分頁查詢功能,使用它們能夠很方便的進行開發,能夠節省開發人員大量的時間。java

通用Mapper的GIT地址: https://gitee.com/free/Mappermysql

分頁插件的GIT地址: https://github.com/pagehelper/Mybatis-PageHelpergit

項目結構

 

導入依賴

 1 <!-- 通用Mapper插件
 2  文檔地址:https://gitee.com/free/Mapper/wikis/Home -->
 3 <dependency>
 4     <groupId>tk.mybatis</groupId>
 5     <artifactId>mapper-spring-boot-starter</artifactId>
 6     <version>2.1.5</version>
 7 </dependency>
 8 <!-- 分頁插件
 9  文檔地址:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md -->
10 <dependency>
11     <groupId>com.github.pagehelper</groupId>
12     <artifactId>pagehelper-spring-boot-starter</artifactId>
13     <version>1.2.10</version>
14 </dependency>
15 <!-- MYSQL包 -->
16 <dependency>
17     <groupId>mysql</groupId>
18     <artifactId>mysql-connector-java</artifactId>
19 </dependency>
20 <!-- 默認就內嵌了Tomcat 容器,如須要更換容器也極其簡單-->
21 <dependency>
22     <groupId>org.springframework.boot</groupId>
23     <artifactId>spring-boot-starter-web</artifactId>
24 </dependency>

屬性配置

在 application.properties 文件中分別添加上數據庫、Mybatis、通用Mapper、PageHelper的屬性配置github

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
# 若是想看到mybatis日誌須要作以下配置
logging.level.com.carry=DEBUG
######### Mybatis 自身配置 ##########
mybatis.mapper-locations=classpath:com/carry/mapper/*Mapper.xml
mybatis.type-aliases-package=com.carry.entity
# 駝峯命名規範 如:數據庫字段是  order_id 那麼 實體字段就要寫成 orderId
mybatis.configuration.map-underscore-to-camel-case=true
######### 通用Mapper ########## # 主鍵自增回寫方法,默認值MYSQL,詳細說明請看文檔 mapper.identity=MYSQL mapper.mappers=tk.mybatis.mapper.common.Mapper # 設置 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 配置的字段中取值,查找到合適的值時就會自動分頁

注意事項:

因爲 mybatis.mapper-locations=classpath:com/carry/mapper/*.xml配置的在java package中,而Spring Boot默認只打入java package -> *.java,因此咱們須要給pom.xml文件添加以下內容web

 1 <build>
 2     <resources>
 3         <resource>
 4             <directory>src/main/resources</directory>
 5         </resource>
 6         <resource>
 7             <directory>src/main/java</directory>
 8             <includes>
 9                 <include>**/*.xml</include>
10             </includes>
11             <filtering>true</filtering>
12         </resource>
13     </resources>
14     <plugins>
15         <plugin>
16             <groupId>org.springframework.boot</groupId>
17             <artifactId>spring-boot-maven-plugin</artifactId>
18         </plugin>
19     </plugins>
20 </build>

具體編碼

一、表結構spring

建立一張 usersql

CREATE TABLE `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='用戶表';

二、實體類數據庫

 1 package com.carry.entity;
 2 
 3 import java.io.Serializable;
 4 
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.GenerationType;
 7 import javax.persistence.Id;
 8 import javax.persistence.Table;
 9 
10 @Table(name = "user")
11 public class User implements Serializable {
12 
13     private static final long serialVersionUID = -8057591359892731452L;
14 
15     @Id
16     @GeneratedValue(strategy = GenerationType.IDENTITY)
17     private Long id;
18     private String username;
19     private String password;
20     public Long getId() {
21         return id;
22     }
23     public void setId(Long id) {
24         this.id = id;
25     }
26     public String getUsername() {
27         return username;
28     }
29     public void setUsername(String username) {
30         this.username = username;
31     }
32     public String getPassword() {
33         return password;
34     }
35     public void setPassword(String password) {
36         this.password = password;
37     }
38     
39     
40     public User() {}
41     public User(String username, String password) {
42         super();
43         this.username = username;
44         this.password = password;
45     }
46 }

三、持久層mybatis

package com.carry.mapper;

import com.carry.entity.User;
import tk.mybatis.mapper.common.Mapper; 

public interface UserMapper extends Mapper<User> { 

  /**
* 根據用戶名統計(假設它是一個很複雜的SQL)
*
@param username 用戶名
*
@return 統計結果
*/
  int countByUsername(String username);
}

四、映射文件UserMapper.xmlapp

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

五、啓動類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan(basePackages = "com.carry.mapper")
public class SpringbootMapperPagehelperApplication { 

  public static void main(String[] args) {             
    SpringApplication.run(SpringbootMapperPagehelperApplication.class, args);   } }

 

測試

完成數據訪問層接口後,編寫一個junit測試類來檢驗代碼的正確性。

 1 package com.carry;
 2 
 3 import org.junit.Test;
 4 import org.junit.runner.RunWith;
 5 import org.slf4j.Logger;
 6 import org.slf4j.LoggerFactory;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.boot.test.context.SpringBootTest;
 9 import org.springframework.test.context.junit4.SpringRunner;
10 
11 import com.carry.entity.User;
12 import com.carry.mapper.UserMapper;
13 import com.github.pagehelper.PageHelper;
14 import com.github.pagehelper.PageInfo;
15 
16 @RunWith(SpringRunner.class)
17 @SpringBootTest
18 public class SpringbootMapperPagehelperApplicationTests {
19 
20     private final Logger logger = LoggerFactory.getLogger(this.getClass());
21 
22     @Autowired
23     private UserMapper userMapper;
24 
25     @Test
26     public void test() {
27         try {
28             final User user1 = new User("u1", "p1");
29             final User user2 = new User("u1", "p2");
30             final User user3 = new User("u3", "p3");
31             userMapper.insertSelective(user1);
32             logger.info("[user1回寫主鍵] - [{}]", user1.getId());
33             userMapper.insertSelective(user2);
34             logger.info("[user2回寫主鍵] - [{}]", user2.getId());
35             userMapper.insertSelective(user3);
36             logger.info("[user3回寫主鍵] - [{}]", user3.getId());
37             final int count = userMapper.countByUsername("u1");
38             logger.info("[調用本身寫的SQL] - [{}]", count);
39 
40             // TODO 模擬分頁
41             for (int i = 0; i < 20; i++) {
42                 userMapper.insertSelective(new User("u" + i, "p" + i));
43             }
44             // TODO 分頁 + 排序 this.userMapper.selectAll() 這一句就是咱們須要寫的查詢,有了這兩款插件無縫切換各類數據庫
45             final PageInfo<User> pageInfo = PageHelper.startPage(1, 10).setOrderBy("id desc")
46                     .doSelectPageInfo(() -> this.userMapper.selectAll());
47             logger.info("[lambda寫法] - [分頁信息] - [{}]", pageInfo.toString());
48 
49             PageHelper.startPage(1, 10).setOrderBy("id desc");
50             final PageInfo<User> userPageInfo = new PageInfo<>(this.userMapper.selectAll());
51             logger.info("[普通寫法] - [{}]", userPageInfo);
52         } catch (Exception e) {
53             logger.error(e.getMessage());
54         }
55     }
56 
57 }
相關文章
相關標籤/搜索