1. 程式人生 > >Spring Boot學習日誌(四)使用Mybatis

Spring Boot學習日誌(四)使用Mybatis

前言

之前簡單介紹了一下Soring Boot Jpa操作Mysql資料庫的相關方法,但是在使用Jpa的時候總有寫不習慣,比如:複雜的邏輯使用Jpa的規則生成Sql總覺得很麻煩,如果直接在 @Query裡面寫Sql總是不那麼的“舒服”,下面開始關於MyBatis相關的使用。

新增依賴

<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.1</version> </dependency> <dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId
>
<scope>runtime</scope> </dependency>

配置檔案application.properties

spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowMultiQueries=true&&useSSL=false
spring.datasource.username = root
spring.datasource.password = root
#mapper掃描範圍
mybatis.mapperLocations=classpath:mapper/**/*.xml
#entity位置
mybatis.typeAliasesPackage=com.example.mybatis_demo.entity

使用mybatis有兩種方法,一種是使用註解的方式,一種是使用xml配置檔案的方式,這裡選擇xml配置檔案的形式介紹。
mybatis.mapperLocations:設定xml檔案的位置,這裡xml裡寫sql語句
mybatis.typeAliasesPackage:設定實體類所在位置

測試表結構

CREATE TABLE `tb_user` (
  `id` int(11) NOT NULL,
  `username` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
  `group` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

CREATE TABLE `tb_group` (
  `id` varchar(20) DEFAULT NULL,
  `group` int(11) NOT NULL DEFAULT '0',
  `groupname` varchar(20) CHARACTER SET utf8mb4 DEFAULT NULL,
  PRIMARY KEY (`group`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

建立實體類

public class User {
    private Integer id;

    private String userName;

    private Integer group;

    省略getset方法
}

建立Mybatis配置檔案

由於spring在啟動時不知道mapper介面位置在什麼地方,所以要做一個設定告訴spring程式mapper所在的位置,資料來源就會自動注入到sqlSessionFactory中

@Configuration
public class MyBatisMapperConfig {
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        mapperScannerConfigurer.setBasePackage("com.example.mybatis_demo.mapper");
        return mapperScannerConfigurer;
    }

}

建立Mapper介面

public interface UserMapper {
    /**
     * 查詢使用者
     * @param user
     * @return
     */
    List<User> queryUser(User user);

    /**
     * 新增使用者
     * @param user
     * @return
     */
    Integer insertUser(User user);

    /**
     * 更新使用者資訊
     * @param user
     * @return
     */
    Boolean updateUser(User user);
       /**
     * 刪除使用者
     * @param user
     * @return
     */
    Integer deleteUser(User user);
}

建立Mapper對應的sql

上邊的操作已經建立了使用者相關的增改查,但是僅僅建立了介面,還沒有具體的實現,具體的實現怎麼做呢?

#mapper掃描範圍
mybatis.mapperLocations=classpath:mapper/**/*.xml

配置檔案裡已經設定了mapper的掃描範圍,在這裡建立相應的.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="com.example.mybatis_demo.mapper.UserMapper">
    <select id="queryUser" resultType="com.example.mybatis_demo.entity.User">
        select * from tb_user
        <where>
            <if test="id!= null ">
                   id =#{id}
            </if>
        </where>
    </select>


    <insert id="insertUser"  parameterType="com.example.mybatis_demo.entity.User">
        insert into tb_user(
        id,
        username,
        groupid
        )
        values(
        #{id},
        #{userName},
        #{groupid}
        )
    </insert>

    <update id="updateUser" parameterType="com.example.mybatis_demo.entity.User">
        UPDATE tb_user
        <set>
            <if test="userName!=null and userName!='' ">
                username= #{userName},
            </if>
            <if test="groupid!=null">
                groupid= #{groupid},
            </if>
        </set>
        WHERE id= #{id};
    </update>

    <delete id="delete" parameterType="int">
        delete from tb_user where id=#{id}
    </delete>
</mapper>

需要注意的地方有:
.xml配置檔案

<mapper namespace="com.example.mybatis_demo.mapper.UserMapper">

這裡寫的是之前建立的介面的地址,地址要寫全(包名+介面名)

resultType="com.example.mybatis_demo.entity.User"

sql查詢之後資料返回型別

parameterType="com.example.mybatis_demo.entity.User"

sql新增或者修改返回操作後的實體

parameterType="int"

sql刪除資料之後返回操作成功的個數

<set>
            <if test="username!=null and username!='' ">
                username= #{username},
            </if>
            <if test="group!=null">
                group= #{group},
            </if>
        </set>
#{userName}表示mapper介面傳遞過來的User類的userName屬性的值

這裡因為username是String型別,所以要判斷username不為null並且不為空
而group是Integer,只要判斷是否為空就可以了

編寫控制器

@RestController
@RequestMapping(value = "/user")
public class UserController {
    @Autowired
    private UserMapper mapper;

    @RequestMapping(value = "/list",method = RequestMethod.GET)
    public Object queryUser(User user) {
        return mapper.queryUser(user);
    }

    @RequestMapping(value = "/insert",method = RequestMethod.GET)
    public Object insertUser(User user) {
        return mapper.insertUser(user);
    }

    @RequestMapping(value = "/update",method = RequestMethod.GET)
    public Object updateUser(User user) {
        return mapper.updateUser(user);
    }
    @RequestMapping(value = "/delete",method = RequestMethod.GET)
    public Object deleteUser(User user) {
        return mapper.deleteUser(user);
    }
}

這裡的UserMapper和Jpa一樣,無需例項化,只需新增 @Autowired註解就可以使用,mybatis會自動執行.xml檔案裡的sql語句。

測試

和上一章一樣,資料庫理有三條資料如下所示
資料庫
先測試一下檢索,如果不加引數,會檢索出所有資料

http://127.0.0.1:8080/user/list

檢索
可以看到和預期一樣,三條資料都被檢索出來了。
再測試一下條件檢索

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

條件檢索
只檢索出來了一條資料,也是符合預期的
再測試一下新增資料

http://127.0.0.1:8080/user/insert?id=4&userName=測試&groupid=2

新增資料
結果
可以看到資料已經新增進去了
更新資料

http://127.0.0.1:8080/user/update?id=4&groupid=3

刪除資料

http://127.0.0.1:8080/user/delete?id=4

結果和過程大致相同,就不再一一描述

專案目錄結構

專案目錄結構