Spring Boot學習筆記(十一)Spring Boot 集成 MyBatis —— 實戰篇

Spring Boot 集成 MyBatis —— 實戰篇

  • 訪問 https://start.spring.io/, 初始化Spring Boot項目在這裏插入圖片描述
  • 解壓之後用 IDEA 打開
  • 項目結構

    在這裏插入圖片描述

  • pom.xml 文件
    • 除了必要的mybatis-spring-boot-starter之外,其中有個commons-lang3包,它包含許多工具類,比如常用的判斷字符串是否爲空,快速複寫實體類的 toString() 方法等
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>wen</groupId>
        <artifactId>sbmybatis</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>sbmybatis</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.6</version>
            </dependency>
    
            <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>2.0.0</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    
  • application.properties:
    • mybatis.config-locations:對應mybatis-config.xml路徑,並在mybatis-config.xml配置Mybatis基礎屬性
    • mybatis.mapper-locations:配置Mapper對應的XML文件路徑
    • mybatis.type-aliases-package:對應實體類路徑
    • spring.datasource.*:數據源配置
    mybatis.config-locations=classpath:mybatis/mybatis-config.xml
    mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
    mybatis.type-aliases-package=wen.sbmybatis.model
    spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/sbl?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone = GMT
    rEncoding=utf-8
    spring.datasource.username=root
    spring.datasource.password=
    
  • 啓動類 SbmybatisApplication.java
    • 在啓動類中添加對 Mapper 包掃描 @MapperScan ,Spring Boot 啓動的時候會自動加載包路徑下的Mapper
    • 或者直接在 Mapper 類上面添加註解 @Mapper ,不過代碼上的方式更省力
    package wen.sbmybatis;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @MapperScan("wen.sbmybatis.mapper")
    public class SbmybatisApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SbmybatisApplication.class, args);
        }
    
    }
    
  • mybatis-config.xml
    • 主要配置常用的 typeAliases,設置類型別名爲 Java 類型只用後綴名。它只和 XML 配置有關,用來減少類完全限定名的冗餘
    <configuration>
        <typeAliases>
            <typeAlias alias="Integer" type="java.lang.Integer"/>
            <typeAlias alias="Long" type="java.lang.Long"/>
            <typeAlias alias="HashMap" type="java.util.HashMap"/>
            <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
            <typeAlias alias="ArrayList" type="java.util.ArrayList"/>
            <typeAlias alias="LinkedList" type="java.util.LinkedList"/>
        </typeAliases>
    </configuration>
    
  • 數據庫設置:
    • 先了解一下表結構,數據庫存在即可,Spring Boot 會根據實體類自動創建
      在這裏插入圖片描述
  • 負責性別的枚舉類:

    package wen.sbmybatis.enums;
    
    public enum GenderEnum {
        FEMALE, MALE;
    }
    
  • User.java
    package wen.sbmybatis.model;
    
    import wen.sbmybatis.enums.GenderEnum;
    
    public class User {
    
        private Long id;
        private String username;
        private String password;
        private GenderEnum gender;
        private String nickname;
    
    
        public User() {
            super();
        }
    
        public User(String username, String password, GenderEnum gender) {
            super();
            this.username = username;
            this.password = password;
            this.gender = gender;
        }
    
        @Override
        public String toString() {
            return "username " + this.username + ", password " + this.password + "gender " + gender.name();
        }
    
        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 getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public GenderEnum getGender() {
            return gender;
        }
    
        public void setGender(GenderEnum gender) {
            this.gender = gender;
        }
    
        public String getNickname() {
            return nickname;
        }
    
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
    }
    
    
  • 分頁的Page.java:
    • currentPage: 當前的頁數,默認0爲第一頁
    • totalPage:總共的頁數
    • totalNumber:總共的記錄數
    • list:每頁記錄集合
    package wen.sbmybatis.model;
    
    import java.io.Serializable;
    import java.util.List;
    
    public class Page<E> implements Serializable {
    
        private int currentPage = 0;
    
        private long totalPage;
    
        private long totalNumber;
    
        private List<E> list;
    
        public Page(long totalPage, long totalNumber, List<E> list) {
            this.totalPage = totalPage;
            this.totalNumber = totalNumber;
            this.list = list;
        }
    }
    
    
  • 這個小項目是實體類操作與分頁查詢一起實現的,所以在UserMapperTest獲得Page實體類的時候需要提供相關參數,所以需要建立PageParam.java 和 UserParam.java來獲取參數:

  • PageParam.java:
    package wen.sbmybatis.param;
    
    public class PageParam {
    
        private int beginLine;
        private Integer pageSize = 3;
        private Integer currentPage = 0;
    
        public int getBeginLine() {
            return pageSize * currentPage;
        }
    
        public void setBeginLine(int beginLine) {
            this.beginLine = beginLine;
        }
    
        public Integer getPageSize() {
            return pageSize;
        }
    
        public void setPageSize(Integer pageSize) {
            this.pageSize = pageSize;
        }
    
        public Integer getCurrentPage() {
            return currentPage;
        }
    
        public void setCurrentPage(Integer currentPage) {
            this.currentPage = currentPage;
        }
    }
    
    
  • UserParam.java:
    package wen.sbmybatis.param;
    
    public class UserParam extends PageParam {
    
        private String username;
        private String gender;
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    }
    
    
  • 底層操作數據庫代碼 UserMapper.xml:
    • <mapper namespace="wen.sbmybatis.mapper.UserMapper"> 指名對應Mapper類地址
    • <resultMap id="BaseResultMap" type="wen.sbmybatis.model.User"> 配置表結構和類的對應關係
    <?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="wen.sbmybatis.mapper.UserMapper">
        <resultMap id="BaseResultMap" type="wen.sbmybatis.model.User">
            <id column="id" property="id" jdbcType="BIGINT"/>
            <result column="username" property="username" jdbcType="VARCHAR"/>
            <result column="password" property="password" jdbcType="VARCHAR"/>
            <result column="gender" property="gender" javaType="wen.sbmybatis.enums.GenderEnum"/>
            <result column="nickname" property="nickname" jdbcType="VARCHAR"/>
        </resultMap>
    
        <sql id="BaseColumnList">id, username, password, gender, nickname</sql>
    
        <select id="getAll" resultMap="BaseResultMap">
            select
            <include refid="BaseColumnList"/>
            from user
        </select>
    
        <select id="getOne" parameterType="java.lang.Long" resultMap="BaseResultMap">
            select
            <include refid="BaseColumnList"/>
            from user where id = #{id}
        </select>
    
        <insert id="insert" parameterType="wen.sbmybatis.model.User">
            insert into user (username,password,gender) values (#{username}, #{password}, #{gender})
        </insert>
    
        <update id="update" parameterType="wen.sbmybatis.model.User">
            update user set
            <if test="username != null">username = #{username},</if>
            <if test="password != null">password = #{password},</if>
            nickname = #{nickname} where id = #{id}
        </update>
    
        <delete id="delete" parameterType="java.lang.Long">
            delete from user where id = #{id}
        </delete>
    
        <!-- 分頁查詢 -->
        <sql id="BaseWhereList">
            <if test="username != null and username != ''">
                and username = #{username}
            </if>
    
            <if test="gender != null and gender != ''">
                and gender = #{gender}
            </if>
        </sql>
    
        <select id="getList" resultMap="BaseResultMap" parameterType="wen.sbmybatis.param.UserParam">
            select
            <include refid="BaseColumnList"/>
            from user where 1 = 1
            <include refid="BaseWhereList"/>
            order by id desc
            limit #{beginLine}, #{pageSize}
        </select>
    
        <select id="getCount" resultType="Integer" parameterType="wen.sbmybatis.param.UserParam">
            select count(1) from user where 1 = 1
            <include refid="BaseWhereList"></include>
        </select>
    </mapper>
    
  • mapper層,一定要與上文的UserMapper.xml的id 相對應:
    package wen.sbmybatis.mapper;
    
    import wen.sbmybatis.model.User;
    import wen.sbmybatis.param.UserParam;
    
    import java.util.List;
    
    public interface UserMapper {
    
        List<User> getAll();
    
        User getOne(Long id);
    
        void insert(User user);
    
        void update(User user);
    
        void delete(Long id);
    
        List<User> getList(UserParam userParam);
    
        int getCount(UserParam userParam);
    }
    
    
  • 對userMapper進行測試的 UserMapperTest.java:
    package wen.sbmybatis.mapper;
    
    import org.junit.Assert;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import wen.sbmybatis.enums.GenderEnum;
    import wen.sbmybatis.model.Page;
    import wen.sbmybatis.model.User;
    import wen.sbmybatis.param.UserParam;
    
    import java.util.List;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class UserMapperTest {
    
        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void testInsert() throws Exception {
            userMapper.insert(new User("aa", "a123456", GenderEnum.FEMALE));
            userMapper.insert(new User("bb", "b123456", GenderEnum.MALE));
            userMapper.insert(new User("cc", "c123456", GenderEnum.FEMALE));
            Assert.assertEquals(9, userMapper.getAll().size());
        }
    
        @Test
        public void testQuery() throws Exception {
            List<User> users = userMapper.getAll();
            if (users == null || users.size() == 0) {
                System.out.println("is null");
            } else {
                System.out.println(users.toString());
            }
        }
    
        @Test
        public void TestUpdate() throws Exception {
            User user = userMapper.getOne(29L);
            System.out.println(user.toString());
            user.setNickname("papa");
            userMapper.update(user);
            Assert.assertTrue("papa".equals(userMapper.getOne(29L).getNickname()));
        }
    
        @Test
        public void testPage() {
    
            UserParam userParam = new UserParam();
            userParam.setGender(GenderEnum.FEMALE.toString());
            userParam.setCurrentPage(0);
    
            // 總個數
            int totalNumber = userMapper.getAll().size();
            // 總頁數
            int totalPage = totalNumber / (userParam.getPageSize()) + 1;
            // 數據集
            List<User> users = userMapper.getList(userParam);
    
            Page page = new Page(totalPage, totalNumber, users);
    
            System.out.println("*****  page info *******");
            System.out.println(page.getCurrentPage());
            System.out.println(page.getTotalNumber());
            System.out.println(page.getTotalPage());
            System.out.println(page.getList());
        }
    }
    
    
  • 測試結果:testInsert:
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    下一篇:Spring Boot學習筆記(十二)MyBatis Druid 多數據源 、Spring Boot 集成 Druid—— 概念與實戰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章