SpringBoot 整合 Mybatis 有兩種經常使用的方式,一種就是咱們常見的 xml 的方式 ,還有一種是全註解的方式。我以爲這二者沒有誰比誰好,在 SQL 語句不太長的狀況下,我以爲全註解的方式必定是比較清晰簡潔的。可是,複雜的 SQL 確實不太適合和代碼寫在一塊兒。java
下面就開始吧!mysql
目錄:web
建立一個基本的 SpringBoot 項目,我這裏就很少說這方面問題了,具體能夠參考下面這篇文章:segmentfault
http://www.javashuo.com/article/p-qmwpdnah-bz.htmlspringboot
咱們的數據庫很簡單,只有 4 個字段:用戶 id、姓名、年齡、餘額,以下圖所示:mybatis
添加了「餘額money」字段是爲了給你們簡單的演示一下事務管理的方式。app
建表語句:
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
因爲要整合 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>
因爲我使用的是比較新的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
便可。
public class User { private int id; private String name; private int age; private double money; ... 此處省略getter、setter以及 toString方法 }
先來看一下 全註解的方式,這種方式和後面提到的 xml 的方式的區別僅僅在於 一個將 sql 語句寫在 java 代碼中,一個寫在 xml 配置文件中。全注方式解轉換成 xml 方式僅需作一點點改變便可,我在後面會提到。
項目結構:
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); }
@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); } }
@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"; } }
//此註解表示SpringBoot啓動類 @SpringBootApplication // 此註解表示動態掃描DAO接口所在包,實際上不加下面這條語句也能夠找到 @MapperScan("top.snailclimb.dao") public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
上述代碼通過測試都沒問題,這裏貼一下根據姓名查詢的測試的結果。
項目結構:
相比於註解的方式主要有如下幾點改變,很是容易實現。
我這裏只演示一個根據姓名找人的方法。
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>
配置文件中加入下面這句話:
mybatis.mapper-locations=classpath:mapper/*.xml