基於 SpringBoot2.0+優雅整合 SpringBoot+Mybatis
Github 地址: ofollow,noindex">https://github.com/Snailclimb/springboot-integration-examples (SpringBoot和其他常用技術的整合,可能是你遇到的講解最詳細的學習案例,力爭新手也能看懂並且能夠在看完之後獨立實踐。基於最新的 SpringBoot2.0+,是你學習SpringBoot 的最佳指南。) ,歡迎各位 Star。
SpringBoot 整合 Mybatis 有兩種常用的方式,一種就是我們常見的 xml 的方式 ,還有一種是全註解的方式。我覺得這兩者沒有誰比誰好,在 SQL 語句不太長的情況下,我覺得全註解的方式一定是比較清晰簡潔的。但是,複雜的 SQL 確實不太適合和程式碼寫在一起。
下面就開始吧!
目錄:
一 開發前的準備
1.1 環境引數
1.2 建立工程
建立一個基本的 SpringBoot 專案,我這裡就不多說這方面問題了,具體可以參考下面這篇文章:
3606" target="_blank" rel="nofollow,noindex">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("UPDATEuser 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
ThoughtWorks准入職Java工程師。專注Java知識分享!開源 Java 學習指南——JavaGuide(12k+ Star)的作者。公眾號多篇文章被各大技術社群轉載。公眾號後臺回覆關鍵字“1”可以領取一份我精選的Java資源哦!

我的公眾號