spring-boot整合通用mapper
阿新 • • 發佈:2018-11-16
通用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);