1. 程式人生 > >spring-boot整合通用mapper

spring-boot整合通用mapper

通用Mapper

在使用spring-boot mybatis操作資料庫的時候,使用通用Mapper可以極大的方便開發人員。可以隨意的按照自己的需要選擇通用方法,還可以很方便的開發自己的通用方法。通用Mapper提供了預設的操作資料庫增刪改查的功能,如果你的操作很複雜,還可以自己構建動態sql,實現自己的通用Mapper功能等

下面介紹通用Mapper的操作過程

專案依賴 pom.xml

<!-- Spring Boot Mybatis 依賴 -->
<!--mybatis-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>

<!--mapper-->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>1.1.4</version>
</dependency>

<!--pagehelper-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.1</version>
</dependency>
配置 application.p

配置 application.properties

#mybatis
mybatis.type-aliases-package=com.example.mapper.domain
mybatis.mapper-locations=classpath:mapper/*.xml

#mappers 多個介面時逗號隔開
mapper.mappers=com.example.mapper.util.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL

#pagehelper
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

配置 Spring DevTools

在使用 DevTools 時,通用Mapper經常會出現 class x.x.A cannot be cast to x.x.A。

同一個類如果使用了不同的類載入器,就會產生這樣的錯誤,所以解決方案就是讓通用Mapper和實體類使用相同的類載入器即可。

DevTools 預設會對 IDE 中引入的所有專案使用 restart 類載入器,對於引入的 jar 包使用 base 類載入器,因此只要保證通用Mapper的jar包使用 restart 類載入器即可。

在 src/main/resources 中建立 META-INF 目錄,在此目錄下新增 spring-devtools.properties 配置,內容如下:

restart.include.mapper=/mapper-[\\w-\\.]+jar
restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar

通用Mapper介面

在專案中新建util/MyMapper.java 繼承Mapper<T>作為通用Mapper的介面

package com.example.mapper.util;

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

public interface MyMapper<T> extends Mapper<T>,MySqlMapper<T> {
    //TODO
    //FIXME 特別注意,該介面不能被掃描到,否則會出錯
}

使用Mapper

在專案中新建mapper目錄,下面的每個檔案作為一張表,只要繼承上面的MyMapper介面就可以使用基本的增刪改查操作了。

下面舉例user表,建立一個mapper/UserMapper.java

package com.example.mapper.mapper;

import com.example.mapper.domain.User;
import com.example.mapper.util.MyMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserMapper extends MyMapper<User> {}

一旦繼承了MyMapper<T>,繼承的Mapper就擁有了以下通用的方法:

//根據實體類不為null的欄位進行查詢,條件全部使用=號and條件
List<T> select(T record);

//根據實體類不為null的欄位查詢總數,條件全部使用=號and條件
int selectCount(T record);

//根據主鍵進行查詢,必須保證結果唯一
//單個欄位做主鍵時,可以直接寫主鍵的值
//聯合主鍵時,key可以是實體類,也可以是Map
T selectByPrimaryKey(Object key);

//插入一條資料
//支援Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫)
//優先使用傳入的引數值,引數值空時,才會使用序列、UUID,自動增長
int insert(T record);

//插入一條資料,只插入不為null的欄位,不會影響有預設值的欄位
//支援Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫)
//優先使用傳入的引數值,引數值空時,才會使用序列、UUID,自動增長
int insertSelective(T record);

//根據實體類中欄位不為null的條件進行刪除,條件全部使用=號and條件
int delete(T key);

//通過主鍵進行刪除,這裡最多隻會刪除一條資料
//單個欄位做主鍵時,可以直接寫主鍵的值
//聯合主鍵時,key可以是實體類,也可以是Map
int deleteByPrimaryKey(Object key);

//根據主鍵進行更新,這裡最多隻會更新一條資料
//引數為實體類
int updateByPrimaryKey(T record);

//根據主鍵進行更新
//只會更新不是null的資料
int updateByPrimaryKeySelective(T record);