學習Spring Boot:(七)集成Mybatis

前面都是用的是spring data JPA,現在學習下Mybatis,而且現在Mybatis也像JPA那樣支持註解形式了,也非常方便,學習一下。

  • 數據庫 mysql 5.7

添加依賴

在pom文件中添加:

<mybatis.version>1.3.1</mybatis.version>
<druid.version>1.1.3</druid.version>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>

由於springboot 默認使用的 tomcat-jdbc數據源,爲了方便,我添加了阿里巴巴的數據源。

首先了解下mybatis-spring-boot-starter 會做哪些事情:
* 自動檢測現有的DataSource
* 將創建並註冊SqlSessionFactory的實例,該實例使用SqlSessionFactoryBean將該DataSource作爲輸入進行傳遞
* 將創建並註冊從SqlSessionFactory中獲取的SqlSessionTemplate的實例。
* 自動掃描您的mappers,將它們鏈接到SqlSessionTemplate並將其註冊到Spring上下文,以便將它們注入到您的bean中。

只要使用這個springboot mybatis starter 只需要DataSource的配置就可以使用了,它會自動創建使用該DataSource的SqlSessionFactoryBean以及SqlSessionTemplate。會自動掃描你的Mappers,連接到SqlSessionTemplate,並註冊到Spring上下文中。

配置數據源

resources/applicaiton.yml文件中添加一些數據源的連接參數配置(可選):

spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        druid:
            url: jdbc:mysql://localhost:3306/learnboot?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
            username: root
            password: 123456
            initial-size: 10
            max-active: 100
            min-idle: 10
            max-wait: 60000
            pool-prepared-statements: true
            max-pool-prepared-statement-per-connection-size: 20
            time-between-eviction-runs-millis: 60000
            min-evictable-idle-time-millis: 300000
            validation-query: SELECT 1
            test-while-idle: true
            test-on-borrow: false
            test-on-return: false
            stat-view-servlet:
                enabled: true
                url-pattern: /druid/*
            filter:
                stat:
                    log-slow-sql: true
                    slow-sql-millis: 1000
                    merge-sql: true
                wall:
                    config:
                        multi-statement-allow: true

springboot會自動加載spring.datasource.*相關配置,數據源就會自動注入到sqlSessionFactory中,sqlSessionFactory會自動注入到Mapper中,

使用Mybatis

首先我有一個SysUser

public class SysUserEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    //主鍵
    private Long id;
    //用戶名
    @NotBlank(message = "用戶名不能爲空", groups = {AddGroup.class, UpdateGroup.class})
    private String username;
    //密碼
    private String password;

使用XMl形式

我們來創建User的映射SysUserDao,也可以命名Mapper作爲尾綴,這裏我們寫個新增一條數據的接口,需要注意的是每個Mapper類上要加上@Mapper註解:

@Mapper
public interface SysUserDao {
    void save(SysUserEntity user);
    /**
     * 根據條件查詢User
     * @param user User
     * @return 符合條件列表
     */
    List<SysUserEntity> query(SysUserEntity user);
}

使用xml的時候需要注意的是Mybatis掃描mapper.xml並且裝配,需要在系統的配置文件resources/applicaiton.yml加入:

# Mybatis配置
mybatis:
    mapperLocations: classpath:mapper/**/*.xml
    configuration:
        map-underscore-to-camel-case: true

根據自己的xml目錄,進行配置。
例如:我在resources/mapper/sys目錄下面加入SysUserDao.xml文件,添加我們查詢的SQL:

<?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="com.wuwii.module.sys.dao.SysUserDao">

    <!-- 可根據自己的需求,是否要使用 -->
    <resultMap type="com.wuwii.module.sys.entity.SysUserEntity" id="sysUserMap">
        <result property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
    </resultMap>

        <insert id="save" parameterType="com.wuwii.module.sys.entity.SysUserEntity" useGeneratedKeys="true"
            keyProperty="id">
        INSERT INTO sys_user
        (
            `username`,
            `password`
        )
        VALUES
            (
                #{username},
                #{password}
            )
    </insert>

    <select id="query" resultType="com.wuwii.module.sys.entity.SysUserEntity">
        SELECT *
        FROM sys_user
       <where>
           <if test="username != null"> and `username` = #{username}</if>
           <if test="password != null">and `password` = #{password}</if>
       </where>
    </select>

使用註解形式

這個就要方便很多,沒有Mapper.xml文件了,也不要配置它的文件路徑的映射了,只要把xml中的SQL 寫到註解上就可以了。
直接在SysUserDao中改成:

@Mapper
public interface SysUserDao {
    @Insert("INSERT INTO sys_user(username,password) VALUES(#{username}, #{password})")
    void save(SysUserEntity user);

    @Select("SELECT * FROM sys_user WHERE id = #{id}")
    @Results({
        @Result(property = "username",  column = "username", javaType = String.class),
        @Result(property = "password", column = "password")
    })
    UserEntity getOne(Long id);
}

根據對數據庫的操作不同,使用不同的註解:
* @Select 是查詢類的註解,所有的查詢均使用這個
* @Result 修飾返回的結果集,關聯實體類屬性和數據庫字段一一對應,如果實體類屬性和數據庫屬性名保持一致,就不需要這個屬性來修飾。
* @Insert 插入數據庫使用,直接傳入實體類會自動解析屬性到對應的值
* @Update 負責修改,也可以直接傳入對象
* @Delete 負責刪除

注意,使用#符號和$符號的不同:

// This example creates a prepared statement, something like select * from teacher where name = ?;
@Select("Select * from teacher where name = #{name}")
Teacher selectTeachForGivenName(@Param("name") String name);

// This example creates n inlined statement, something like select * from teacher where name = 'someName';
@Select("Select * from teacher where name = '${name}'")
Teacher selectTeachForGivenName(@Param("name") String name);

單元測試

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class UserDaoTest {
    @Resource
    private SysUserDao userDao;

    @Test
    @Transactional
    @Rollback(false)
    public void testSave() {
        SysUserEntity user = new SysUserEntity();
        user.setUsername("wuwii");
        user.setPassword("123");
        userDao.save(user);
        Assert.assertEquals(user.getUsername(), userDao.query(user).get(0).getUsername());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章