文章目錄
-
- 1 概述
- 2 基本使用
- 3 自定義 XXXMapper.xml(非必須)
- 4 代碼生成器
學習在 Spring Boot 中整合 MyBatis 通用 Mapper(TkMybatis)。通用 Mapper 是一個可以實作任意 MyBatis 通用方法的架構,項目提供了正常的增删改查操作以及 Example 相關的單表操作。通用 Mapper 是為了解決 MyBatis 使用中 90% 的基本操作,使用它可以很友善的進行開發,可以節省開發人員大量的時間。
1 概述
通用 Mapper 都可以極大的友善開發人員。可以随意的按照自己的需要選擇通用方法,還可以很友善的開發自己的通用方法。
極其友善的使用 MyBatis 單表的增删改查。
支援單表操作,不支援通用的多表聯合查詢。
使用通用 Mapper 可以無 xml 檔案實作資料庫操作,隻需要繼承 TkMybatis 中相關的 Mapper 接口即可。但如果有特殊需求,可以自定義 XXXMapper.xml 檔案,實作複雜 sql 語句的操作。
為什麼需要通用 Mapper ?
我個人最早用 MyBatis 時,先是完全手寫,然後用上了 MyBatis 代碼生成器(簡稱為 MBG),在使用 MBG 過程中,發現一個很麻煩的問題,如果資料庫字段變化很頻繁,就需要反複重新生成代碼,并且由于 MBG 覆寫生成代碼和追加方式生成 XML,導緻每次重新生成都需要大量的比對修改。除了這個問題外,還有一個問題,僅僅基礎的增删改查等方法,就已經産生了大量的 XML 内容,還沒有添加一個自己手寫的方法,代碼可能就已經幾百行了,内容多,看着比較礙事。
因為很多人都在使用 MBG,MBG 中定義了很多常用的單表方法,為了解決前面提到的問題,也為了相容 MBG 的方法避免項目重構太多,在 MBG 的基礎上結合了部分 JPA 注解産生了通用 Mapper。通用 Mapper 可以很簡單的讓你擷取基礎的單表方法,也很友善擴充通用方法。使用通用 Mapper 可以極大的提高你的工作效率。
說明:我們也可以改造 MBG ,比如自動生成一套基本的 model/mapper/service 等,與表對應,不去做修改,自定義的都寫在對應的另一個子類上,這樣,當表字段修改後,隻需全部重新生成上述基本的那些檔案,再手動修改自定義的檔案(如果有需要)即可。
2 基本使用
- 建立項目,引入依賴
建立 Spring Boot 項目
spring-boot-mybatis-tkmybatis
,添加
Web/MySQL Driver
依賴,如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yM3QmNhNWOmZTOzIWYkZWYzEGZ0EDNwMTZ1AjZiFWO48CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
之後手動在 pom 檔案中添加
Druid/Mapper
依賴(Spring Boot 版本),最終的依賴如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.27</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
接着在
application.properties
配置檔案中添加資料庫相關資訊的配置,如下:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=000000
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/cxy35?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&autoReconnectForPools=true
logging.level.com.cxy35.sample.springboot.mybatis.tkmybatis.mapper=debug
# [Mybatis 通用 Mapper 代碼生成器](https://github.com/cxy35/generators/tree/master/generator-mapper)
- 建立實體類
手動建立或用代碼生成器生成
User
實體類,并增加相關注解,如下:
@Table(name = "t_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "JDBC")
private Integer id;
private String username;
private String password;
private Boolean enabled;
private Boolean locked;
// @Column(name = "c_address")
private String address;
private String nickName;
private Date createTime;
private Date updateTime;
// getter/setter
}
注解說明:
-
:指定該實體類對應的表名,如果表名為 t_user ,類名為 TUser ,則可以不需要此注解(預設駝峰命名規則)。@Table
-
:指定該屬性對應的列名,如果列名為 create_time ,屬性名為 createTime ,則可以不需要此注解(預設駝峰命名規則)。@Column
-
:辨別該字段對應資料庫表的主鍵 id 。@Id
-
:指定主鍵 id 生成規則,其中 strategy 表示使用資料庫自帶的主鍵生成政策, generator 配置為"JDBC",在資料插入完畢之後,會自動将主鍵id填充到實體類中,類似普通 mapper.xml 中配置的 selectKey 标簽。@GeneratedValue
- 建立 Mapper 接口
public interface UserMapper extends Mapper<User> {
}
這裡繼承 TkMybatis 中最基本的一個通用 Mapper 接口,這樣就自動擁有了這個 Mapper 中的一些接口,不用寫 XXXMapper.xml 檔案。
相關接口如下:
除了 Mapper 接口,官方還提供了一些幾個好用的通用 Mapper 接口,都可以用來繼承使用,彙總如下:
- Mapper 接口:
IdsMapper 接口:
ConditionMapper 接口:
- MySqlMapper 接口:
- SqlServerMapper 接口:
當然,我們也可以根據自己的實際業務需求,抽取通用業務邏輯,自定義通用 Mapper 接口,參考:通用 Mapper 進階執行個體:為什麼好久都沒更新了? 。
- 配置 Mapper 接口的掃描
可以在啟動類上或自定義 MyBatis 的配置類上,通過
@MapperScan
注解配置。
@SpringBootApplication
@tk.mybatis.spring.annotation.MapperScan(basePackages = "com.cxy35.sample.springboot.mybatis.tkmybatis.mapper")
public class SpringBootMybatisTkmybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatisTkmybatisApplication.class, args);
}
}
- 測試
在測試類中注入
UserMapper
完成測試,如下:
@SpringBootTest
class SpringBootMybatisTkmybatisApplicationTests {
@Autowired
UserMapper userMapper;
@Test
public void insertSelective() {
User user = new User();
user.setUsername("zhangsan");
user.setPassword("123456");
user.setAddress("杭州");
user.setNickName("zs");
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
userMapper.insertSelective(user);
}
@Test
public void deleteByPrimaryKey() {
userMapper.deleteByPrimaryKey(2);
}
@Test
public void updateByPrimaryKeySelective() {
User user = new User();
user.setId(2);
user.setUsername("zhangsan2");
user.setPassword("654321");
user.setNickName("zs2");
user.setAddress("上海");
userMapper.updateByPrimaryKeySelective(user);
}
@Test
public void selectByPrimaryKey() {
User user = userMapper.selectByPrimaryKey(4);
System.out.println(user);
}
@Test
public void selectAll() {
List<User> users = userMapper.selectAll();
System.out.println(users);
}
@Test
public void selectByExample() {
Example example = new Example(User.class);
Example.Criteria criteria = example.createCriteria();
criteria.andLike("username", "zhangsan%");
criteria.andEqualTo("address", "杭州");
List<User> users = userMapper.selectByExample(example);
System.out.println(users);
}
}
3 自定義 XXXMapper.xml(非必須)
雖然大多數複雜的需求,都能通過 TkMyBatis 的組合完成操作。但如果有特殊需求,可以自定義 XXXMapper.xml 檔案,實作複雜 sql 語句的操作,這裡以聯表查詢為例。
在
UserMapper.java
所在包下建立
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.cxy35.sample.springboot.mybatis.tkmybatis.mapper.UserMapper">
<select id="selectByRoleId" parameterType="java.lang.Integer" resultType="com.cxy35.sample.springboot.mybatis.tkmybatis.pojo.User">
SELECT
u.*
FROM
t_user u
INNER JOIN t_user_role ur ON u.id = ur.user_id
WHERE
ur.role_id = #{roleId, jdbcType=INTEGER};
</select>
</mapper>
上述 xml 檔案與普通 xml 檔案的不同之處在于:這裡不需要使用 resultMap 進行字段的映射。當然,如果想在傳回的 Map 中新增傳回字段映射,直接添加新的字段即可。
注意:不要在 xml 檔案中寫 TkMyBatis 中已經有的一些基礎方法,否則會報錯,提示方法重複。
接着,修改 UserMapper.java ,增加對應的接口:
public interface UserMapper extends Mapper<User> {
// 測試用,非必須
List<User> selectByRoleId(Integer roleId);
}
上述 UserMapper.xml 放在 UserMapper.java 所在的包下面,會被自動掃描到。但在項目打包時會被忽略掉,是以需要在 pom.xml 中配置 Maven 建構時的資源路徑。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
關于 XXXMapper.xml 檔案位置,還有其他方案,這裡不再贅述,具體可參考 Spring Boot 整合 MyBatis 。
最後在測試類中增加方法,完成測試:
@Test
public void selectByRoleId() {
List<User> users = userMapper.selectByRoleId(2);
System.out.println(users);
}
4 代碼生成器
- Mybatis 通用 Mapper 代碼生成器
- Spring Boot 教程合集(微信左下方閱讀全文可直達)。
- Spring Boot 教程合集示例代碼:https://github.com/cxy35/spring-boot-samples
- 本文示例代碼:https://github.com/cxy35/spring-boot-samples/tree/master/spring-boot-dao/spring-boot-mybatis-tkmybatis
掃碼關注微信公衆号 程式員35 ,擷取最新技術幹貨,暢聊 #程式員的35,35的程式員# 。獨立站點:https://cxy35.com