天天看點

Spring Boot 2.X(二):內建 MyBatis 資料層開發

MyBatis 簡介

概述

MyBatis 是一款優秀的持久層架構,支援定制化 SQL、存儲過程以及進階映射。它采用面向對象程式設計的方式對資料庫進行 CRUD 的操作,使程式中對關系資料庫的操作更友善簡單。它支援 XML 描述符配置檔案和注解兩種方式執行 SQL 語句。“簡單靈活”是它在對象關系映射工具上的最大優勢。

mybatis-spring-boot-starter

過去使用 MyBatis 開發,需要各種配置檔案、實體類、Dao 層映射關聯、還有一大推其它配置。經過進行不斷的優化後,終于他來了,

mybatis-spring-boot-starter

可以做到無需配置隻用注解開發,也可以使用簡單的配置輕松上手。

當然兩種方式都需要在 POM 檔案引入

mybatis-spring-boot-starter

<!-- mybaits -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.0</version>
</dependency>           

內建 MyBatis

準備工作

1.建構一個 Spring Boot項目
2.建立 MySQL 資料庫(db_test),建立表(t_user)及添加部分測試資料
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` int(8) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `user_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '使用者姓名',
  `user_sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '使用者性别',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_user
-- ----------------------------
BEGIN;
INSERT INTO `t_user` VALUES (1, '劉備', '男');
INSERT INTO `t_user` VALUES (2, '孫尚香', '女');
INSERT INTO `t_user` VALUES (3, '周瑜', '男');
INSERT INTO `t_user` VALUES (4, '小喬', '女');
INSERT INTO `t_user` VALUES (5, '諸葛亮', '男');
INSERT INTO `t_user` VALUES (6, '黃月英', '女');
INSERT INTO `t_user` VALUES (7, '關羽', '男');
INSERT INTO `t_user` VALUES (8, '張飛', '男');
INSERT INTO `t_user` VALUES (9, '趙雲', '男');
INSERT INTO `t_user` VALUES (10, '黃總', '男');
INSERT INTO `t_user` VALUES (11, '曹操', '男');
INSERT INTO `t_user` VALUES (12, '司馬懿', '男');
INSERT INTO `t_user` VALUES (13, '貂蟬', '女');
INSERT INTO `t_user` VALUES (14, '呂布', '男');
INSERT INTO `t_user` VALUES (15, '馬超', '男');
INSERT INTO `t_user` VALUES (16, '魏延', '男');
INSERT INTO `t_user` VALUES (17, '孟獲', '男');
INSERT INTO `t_user` VALUES (18, '大喬', '女');
INSERT INTO `t_user` VALUES (19, '劉婵', '男');
INSERT INTO `t_user` VALUES (20, '姜維', '男');
INSERT INTO `t_user` VALUES (21, '廖化', '男');
INSERT INTO `t_user` VALUES (22, '關平', '男');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;
           
3.建立使用者實體類 UserEntity.java
public class UserEntity {

    private Long id;
    private String userName;
    private String userSex;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserSex() {
        return userSex;
    }
    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }
    
}           

注解方式

1.添加相關 Maven 依賴
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        
        <!-- 熱部署子產品 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional> <!-- 這個需要為 true 熱部署才有效 -->
        </dependency>
        
        
        <!-- mysql 資料庫驅動. -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        
        <!-- mybaits -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        
    </dependencies>           
2.application.properties 添加相關配置
#datasource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/db_test?useUnicode=true&characterEncoding=UTF-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root           

在啟動類中添加對 mapper 包掃描@MapperScan

@SpringBootApplication
@MapperScan("cn.zwqh.springboot.dao")
public class SpringBootMybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMybatisApplication.class, args);
    }

}
           

或者直接在 Mapper 類上面添加注解@Mapper,建議使用上面那種,不然每個 mapper 加個注解也挺麻煩的

3.Mapper 開發
public interface UserDao {
    //使用注解方式
    /**
     * 擷取所有使用者
     * @return
     */
    @Select("select * from t_user")
    @Results({
        @Result(property = "userName",column = "user_name"),
        @Result(property = "userSex",column = "user_sex")
    })
    List<UserEntity> getAll2();
    /**
     * 根據id擷取使用者
     * @param id
     * @return
     */
    @Select("select * from t_user where id=#{id}")
    @Results({
        @Result(property = "userName",column = "user_name"),
        @Result(property = "userSex",column = "user_sex")
    })
    List<UserEntity> getOne2(Long id);
    /**
     * 新增使用者
     * @param user
     */
    @Insert("insert into t_user (user_name,user_sex) values(#{userName},#{userSex})")
    void insertUser2(UserEntity user);
    /**
     * 修改使用者
     * @param user
     */
    @Update("update t_user set user_name=#{userName},user_sex=#{userSex} where id=#{id}")
    void updateUser2(UserEntity user);
    /**
     * 删除使用者
     * @param id
     */
    @Delete("delete from t_user where id=#{id}")
    void deleteUser2(Long id);

}           

注解:

@Select 是查詢類的注解,所有的查詢均使用這個

@Result 修飾傳回的結果集,關聯實體類屬性和資料庫字段一一對應,如果實體類屬性和資料庫屬性名保持一緻,就不需要這個屬性來修飾。

@Insert 插入資料庫使用,直接傳入實體類會自動解析屬性到對應的值

@Update 負責修改,也可以直接傳入對象

@delete 負責删除

4. restful 接口測試

UserController

@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserDao userDao;
    
    
    //使用注解方式
    /**
     * 擷取所有使用者
     * @return
     */
    @RequestMapping("/getAll2")
    public List<UserEntity> getAll2(){
        return userDao.getAll2(); 
    }
    /**
     * 根據id擷取使用者
     * @return
     */
    @RequestMapping("/getOne2")
    public List<UserEntity> getOne2(Long id){
        return userDao.getOne2(id); 
    }
    /**
     * 新增使用者
     * @param user
     * @return
     */
    @RequestMapping("/insertUser2")
    public String insertUser2(UserEntity user) {
        userDao.insertUser2(user);
        return "insert success";
    }    
    /**
     * 修改使用者
     * @param user
     * @return
     */
    @RequestMapping("/updateUser2")
    public String updateUser2(UserEntity user) {
        userDao.updateUser2(user);
        return "update success";
    }
    /**
     * 删除使用者
     * @param user
     * @return
     */
    @RequestMapping("/deleteUser2")
    public String deleteUser2(Long id) {
        userDao.deleteUser2(id);
        return "delete success";
    }    
    
}           

啟動項目後可以通過浏覽器通路

http://127.0.0.1:8080/user/getOne2?id=1

進行測試,其他雷同。也可以編寫單元測試進行測試。

XML 方式

1.pom 檔案如上
#datasource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/db_test?useUnicode=true&characterEncoding=UTF-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
#mybatis
mybatis.mapper-locations=classpath:/mapper/*.xml
           
3.Mapper 層開發
public interface UserDao {
    //mapper.xml方式 
    /**
     * 擷取所有使用者
     * @return
     */
    List<UserEntity> getAll();
    /**
     * 根據id擷取使用者
     * @return
     */
    List<UserEntity> getOne(Long id);
    /**
     * 新增使用者
     * @param user
     */
    void insertUser(UserEntity user);
    /**
     * 修改使用者
     * @param user
     */
    void updateUser(UserEntity user);
    /**
     * 删除使用者
     * @param id
     */
    void deleteUser(Long id);

}           
4.xml 映射檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.4//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.zwqh.springboot.dao.UserDao">
    <resultMap type="cn.zwqh.springboot.model.UserEntity" id="user">
        <id property="id" column="id"/>
        <result property="userName" column="user_name"/>
        <result property="userSex" column="user_sex"/>
    </resultMap>
    <!-- 擷取所有使用者 -->
    <select id="getAll" resultMap="user">
        select * from t_user
    </select>
    <!-- 根據使用者ID擷取使用者 -->
    <select id="getOne" resultMap="user">
        select * from t_user where id=#{id}
    </select>
    <!-- 新增使用者 -->
    <insert id="insertUser" parameterType="cn.zwqh.springboot.model.UserEntity">
        insert into t_user (user_name,user_sex) values(#{userName},#{userSex})
    </insert>
    <!-- 修改使用者 -->
    <update id="updateUser" parameterType="cn.zwqh.springboot.model.UserEntity">
        update t_user set user_name=#{userName},user_sex=#{userSex} where id=#{id}
    </update>
    <!-- 删除使用者 -->
    <delete id="deleteUser" parameterType="Long">
        delete from t_user where id=#{id}
    </delete>
</mapper>

           

如何選擇使用

個人覺得,注解方式适合輕量級的項目,現在的微服務項目比較适合這種模式;對于大型項目,複雜的多表聯合查詢sql用 xml 更适合。

擴充: 使用 MyBatis 分頁插件 pagehelper

1. pom.xml 添加依賴
<!-- pagehelper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.12</version>
        </dependency>           
2. pagehelper 使用
@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserDao userDao;

    /**
     * 使用pagehelper分頁插件
     * @param pageNum
     * @param pageSize
     * @return
     */
    @RequestMapping("/pagehelperTest")
    public List<UserEntity> pagehelperTest(int pageNum,int pageSize){
        PageHelper.startPage(pageNum, pageSize);
        return userDao.getAll(); //直接使用上面的 mapper 
    }
}           
3. 測試

浏覽器直接通路

http://127.0.0.1:8080/user/pagehelperTest?pageNum=1&pageSize=10

,改變參數試試。

示例代碼

碼雲 github

非特殊說明,本文版權歸

朝霧輕寒

所有,轉載請注明出處.

原文标題: Spring Boot 2.X(二):內建 MyBatis 資料層開發

原文位址:

https://www.zwqh.top/article/info/3

如果文章對您有幫助,請掃碼關注下我的公衆号,文章持續更新中...

Spring Boot 2.X(二):內建 MyBatis 資料層開發