本节利用Mybatis实现数据库相关操作,数据库选择mysql
Mybatis的配置分为两个版本,注解版与XML版,两种版本使用场景有些许不同。
注解版
- 
配置依赖
 
mybatis-spring-boot-starter 是mybatis针对spring推出的框架,简单易用。在pom.xml中最好指定一下它的版本。而Mysql模块与Web模块不用多说。
<dependencies>
    <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>
</dependencies>
- 
applicaiton.properties
 
mybatis.type-aliases-package 用于配置类型别名的包名,在映射时只需要写类名就足够了
spring.datasource.url、username 与 password  不用多说,注意所用数据库的名称及参数
spring.datasource.driver-class-name 用于配置mysql驱动
mybatis.type-aliases-package=com.example.datasource-demo.model 
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
这些配置会被Spring Boot自动加载从而将数据源注入进 SqlSessionFactory 中。同时SqlSessionFactory也会自动注入到 Mapper 中。
- 
表结构
 

- 
实体类
 
此处我使用了 Lombok  插件,引入了 @Data  注解,可以免去 get / set

- 
Mapper
 
注解版最大的特点就是Sql语句可以直接以注解的形式写在mapper接口中

那么如何让SpringBoot识别到这个mapper呢?添加 @Mapper 注解是一个方式,但需要在每一个Mapper上都添加一个注解,更简便的方式是在启动类中添加注解,自动扫描mapper包。

- 
Controller
 
为了测试方便,简单写了一个delete接口,别忘了为Controller加上@RestController注解
    @RequestMapping(value = "/delete/{id}")
    public void delete(@PathVariable("id") Long id) {
        userMapper.delete(id);
    }
- 
测试结果
- user表中数据
 
user表- 
测试delete接口
delete接口 - 
id为1的字段被删除
此时表中数据 
 
XML版
application.yml
yml文件与properties文件同是配置文件,区别在于前者通过树形结构分层,使得层次更加分明,后者则相对比较直接,当工程中同时存在application.properties文件和 application.yml文件时,yml文件中的配置优先级会更高,所以保险起见,工程中只用一种类型即可。
application.yml配置内容:
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
  type-aliases-package: com.example.datasource-demo.model
可以见到,相比于注解版,配置文件中新增了mybatis的内容,config-location 指定了配置文件的路径,mapper-locations 指定了映射xml文件的路径,type-aliases-package 在上文解释过。
mybatis-config.xml
在applicaiton.yml中我们配置了config-location ,这个配置文件需要我们自行创建,特别注意头文件不能遗漏
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<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>
UserMapper
xml版与注解版最大的不同就是sql语句是存放在独立的映射xml文件中的,根据我们在配置文件中的路径创建UserMapper.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.datasourcedemo.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.example.datasourcedemo.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="nick_name" property="nickName" jdbcType="VARCHAR" />
    </resultMap>
    <sql id="Base_Column_List" >
        id, username, password, nick_name
    </sql>
    <select id="getAll" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM user
    </select>
    <select id="getOne" parameterType="java.lang.Long" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM user
        WHERE id = #{id}
    </select>
</mapper>
而UserMapper接口只需要定义接口方法即可,无需注解
public interface UserMapper {
    
    List<User> getAll();
 
    User getOne(Long id);
}
运行项目,结果与注解版并无二致
// http://localhost:8080/getUser?id=2
{
  "code": 200,
  "message": "查询用户成功",
  "data": {
    "id": 2,
    "username": "jerry",
    "password": "123123",
    "nickName": "Jerry"
  }
}
如何选择
两种模式各有特点与适用场景,注解版适合简单快速的模式,适合无需大量多表连接查询的情况,而xml模式则更适合传统中大型项目,灵活地生成Sql。


