本节利用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接口中
userMapper那么如何让SpringBoot识别到这个mapper呢?添加 @Mapper
注解是一个方式,但需要在每一个Mapper上都添加一个注解,更简便的方式是在启动类中添加注解,自动扫描mapper包。
-
Controller
为了测试方便,简单写了一个delete接口,别忘了为Controller加上@RestController注解
@RequestMapping(value = "/delete/{id}")
public void delete(@PathVariable("id") Long id) {
userMapper.delete(id);
}
-
测试结果
- 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。
网友评论