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 會根據實體類自動創建
- 先了解一下表結構,數據庫存在即可,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()); } }
-
測試結果:
下一篇:Spring Boot學習筆記(十二)MyBatis Druid 多數據源 、Spring Boot 集成 Druid—— 概念與實戰