SpringBoot 整合 Mybatis 有兩種常用的方式,一種就是我們常見的 xml 的方式 ,還有一種是全注解的方式。我覺得這兩者沒有誰比誰好,在 SQL 語句不太長的情況下,我覺得全注解的方式一定是比較清晰簡潔的。但是,復雜的 SQL 確實不太適合和代碼寫在一起。
下面就開始吧!
目錄:
一 開發前的准備
1.1 環境參數
- 開發工具:IDEA
- 基礎工具:Maven+JDK8
- 所用技術:SpringBoot+Mybatis
- 數據庫:MySQL
- SpringBoot版本:2.1.0
1.2 創建工程
創建一個基本的 SpringBoot 項目,我這里就不多說這方面問題了,具體可以參考下面這篇文章:
https://blog.csdn.net/qq_34337272/article/details/79563606
1.3 創建數據庫和 user 用戶表
我們的數據庫很簡單,只有 4 個字段:用戶 id、姓名、年齡、余額,如下圖所示:

添加了“余額money”字段是為了給大家簡單的演示一下事務管理的方式。
建表語句:
CREATE TABLE `user` ( `id` int(13) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(33) DEFAULT NULL COMMENT '姓名', `age` int(3) DEFAULT NULL COMMENT '年齡', `money` double DEFAULT NULL COMMENT '賬戶余額', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
1.4 配置 pom 文件中的相關依賴
由於要整合 springboot 和 mybatis 所以加入了artifactId 為 mybatis-spring-boot-starter 的依賴,由於使用了Mysql 數據庫 所以加入了artifactId 為 mysql-connector-java 的依賴。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
1.5 配置 application.properties
由於我使用的是比較新的Mysql連接驅動,所以配置文件可能和之前有一點不同。
server.port=8333 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/erp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=153963 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
注意:我們使用的 mysql-connector-java 8+ ,JDBC 連接到mysql-connector-java 6+以上的需要指定時區 serverTimezone=GMT%2B8。另外我們之前使用配置 Mysql數據連接是一般是這樣指定driver-class-name=com.mysql.jdbc.Driver,但是現在不可以必須為 否則控制台下面的異常:
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
上面異常的意思是:com.mysql.jdbc.Driver 被棄用了。新的驅動類是 com.mysql.cj.jdbc.Driver。驅動程序通過SPI自動注冊,手動加載類通常是不必要。
如果你非要寫把com.mysql.jdbc.Driver 改為com.mysql.cj.jdbc.Driver 即可。
1.6 創建用戶類 Bean
public class User {
private int id;
private String name;
private int age;
private double money;
...
此處省略getter、setter以及 toString方法
}
二 全注解的方式
先來看一下 全注解的方式,這種方式和后面提到的 xml 的方式的區別僅僅在於 一個將 sql 語句寫在 java 代碼中,一個寫在 xml 配置文件中。全注方式解轉換成 xml 方式僅需做一點點改變即可,我在后面會提到。
項目結構:

2.1 Dao 層開發
UserDao.java
@Mapper
public interface UserDao {
/**
* 通過名字查詢用戶信息
*/
@Select("SELECT * FROM user WHERE name = #{name}")
User findUserByName(@Param("name") String name);
/**
* 查詢所有用戶信息
*/
@Select("SELECT * FROM user")
List<User> findAllUser();
/**
* 插入用戶信息
*/
@Insert("INSERT INTO user(name, age,money) VALUES(#{name}, #{age}, #{money})")
void insertUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money);
/**
* 根據 id 更新用戶信息
*/
@Update("UPDATE user SET name = #{name},age = #{age},money= #{money} WHERE id = #{id}")
void updateUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money,
@Param("id") int id);
/**
* 根據 id 刪除用戶信息
*/
@Delete("DELETE from user WHERE id = #{id}")
void deleteUser(@Param("id") int id);
}
2.2 service 層
@Service
public class UserService {
@Autowired
private UserDao userDao;
/**
* 根據名字查找用戶
*/
public User selectUserByName(String name) {
return userDao.findUserByName(name);
}
/**
* 查找所有用戶
*/
public List<User> selectAllUser() {
return userDao.findAllUser();
}
/**
* 插入兩個用戶
*/
public void insertService() {
userDao.insertUser("SnailClimb", 22, 3000.0);
userDao.insertUser("Daisy", 19, 3000.0);
}
/**
* 根據id 刪除用戶
*/
public void deleteService(int id) {
userDao.deleteUser(id);
}
/**
* 模擬事務。由於加上了 @Transactional注解,如果轉賬中途出了意外 SnailClimb 和 Daisy 的錢都不會改變。
*/
@Transactional
public void changemoney() {
userDao.updateUser("SnailClimb", 22, 2000.0, 3);
// 模擬轉賬過程中可能遇到的意外狀況
int temp = 1 / 0;
userDao.updateUser("Daisy", 19, 4000.0, 4);
}
}
2.3 Controller 層
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/query")
public User testQuery() {
return userService.selectUserByName("Daisy");
}
@RequestMapping("/insert")
public List<User> testInsert() {
userService.insertService();
return userService.selectAllUser();
}
@RequestMapping("/changemoney")
public List<User> testchangemoney() {
userService.changemoney();
return userService.selectAllUser();
}
@RequestMapping("/delete")
public String testDelete() {
userService.deleteService(3);
return "OK";
}
}
2.4 啟動類
//此注解表示SpringBoot啟動類
@SpringBootApplication
// 此注解表示動態掃描DAO接口所在包,實際上不加下面這條語句也可以找到
@MapperScan("top.snailclimb.dao")
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
2.5 簡單測試
上述代碼經過測試都沒問題,這里貼一下根據姓名查詢的測試的結果。

三 xml 的方式
項目結構:

相比於注解的方式主要有以下幾點改變,非常容易實現。
3.1 Dao 層的改動
我這里只演示一個根據姓名找人的方法。
UserDao.java
@Mapper
public interface UserDao {
/**
* 通過名字查詢用戶信息
*/
User findUserByName(String name);
}
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="top.snailclimb.dao.UserDao">
<select id="findUserByName" parameterType="String" resultType="top.snailclimb.bean.User">
SELECT * FROM user WHERE name = #{name}
</select>
</mapper>
3.2 配置文件的改動
配置文件中加入下面這句話:
mybatis.mapper-locations=classpath:mapper/*.xml
