基於 SpringBoot2.0+優雅整合 SpringBoot+Mybatis

SpringBoot 整合 Mybatis 有兩種經常使用的方式,一種就是咱們常見的 xml 的方式 ,還有一種是全註解的方式。我以爲這二者沒有誰比誰好,在 SQL 語句不太長的狀況下,我以爲全註解的方式必定是比較清晰簡潔的。可是,複雜的 SQL 確實不太適合和代碼寫在一塊兒。java

下面就開始吧!mysql

目錄:web

 

一 開發前的準備

1.1 環境參數

  • 開發工具:IDEA
  • 基礎工具:Maven+JDK8
  • 所用技術:SpringBoot+Mybatis
  • 數據庫:MySQL
  • SpringBoot版本:2.1.0

1.2 建立工程

建立一個基本的 SpringBoot 項目,我這裏就很少說這方面問題了,具體能夠參考下面這篇文章:segmentfault

http://www.javashuo.com/article/p-qmwpdnah-bz.htmlspringboot

 

 

1.3 建立數據庫和 user 用戶表

咱們的數據庫很簡單,只有 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

 

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

相關文章
相關標籤/搜索