SpringBoot(六) Mybatis - 注解方式

此前,我们主要通过XML来书写SQL和对象映射关系来使用Mybatis,并没有真正接触注释方式。在SpringBoot中我们可以通过注解方式来快速编写SQL并实现数据访问。

简介

整合MyBatis ,更多的使用注解方法,去掉使用XML 的烦恼。

构建项目

pom.xml

添加常用依赖 和 Mybatis依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!--依赖管理 -->
<dependencies>
<!--添加Web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--添加Mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>

<!--添加MySQL驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--alibaba的druid数据库连接池(在SpringBoot项目中有sql监控)-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--添加Lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--内置tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--添加Test依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

application.yml

application.yml 添加Durid 数据源,以及开启Mybaits 的驼峰映射功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
username: root
password: root
druid:
# 配置控制统计拦截的filters,去掉后监控界面sql将无法统计,wall用于防火墙
filter: stat,wall
# 最大活跃数
max-active: 20
# 初始化数量
initial-size: 1
# 最小连接池数量
min-idle: 1
# 最大连接等待超时时间
max-wait: 60000
# 打开PSCache,并且指定每个连接PSCache的大小,mysql可以设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
# 配置间隔多久才进行一次检测,检测需要关闭的空间连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 用来检测连接是否有效
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
async-init: true

mybatis:
configuration:
# 开启驼峰映射
map-underscore-to-camel-case: true

脚本初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-- ----------------------------
-- Table structure for city
-- ----------------------------
DROP TABLE IF EXISTS `city`;
CREATE TABLE `city` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '城市',
`state` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '省份',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '市级信息' ROW_FORMAT = Compact;

-- ----------------------------
-- Records of city
-- ----------------------------
INSERT INTO `city` VALUES (1, '石家庄', '河北');
INSERT INTO `city` VALUES (2, '北京', '北京');
INSERT INTO `city` VALUES (3, '珠海', '广东');
INSERT INTO `city` VALUES (4, '恩施', '湖北');
INSERT INTO `city` VALUES (5, '丰顺', '广东');
INSERT INTO `city` VALUES (6, '广州', '广东');
INSERT INTO `city` VALUES (7, '佛山', '广东');
INSERT INTO `city` VALUES (8, '江门', '广东');
INSERT INTO `city` VALUES (9, '肇庆', '广东');
INSERT INTO `city` VALUES (10, '惠州', '广东');
INSERT INTO `city` VALUES (11, '汕头', '广东');
INSERT INTO `city` VALUES (12, '潮州', '广东');
INSERT INTO `city` VALUES (13, '石家庄', '河北');
INSERT INTO `city` VALUES (14, '北京', '北京');
INSERT INTO `city` VALUES (15, '珠海', '广东');
INSERT INTO `city` VALUES (16, '恩施', '湖北');

SET FOREIGN_KEY_CHECKS = 1;

注解方式

MyBatis提供了简单的 映射器注解 ,使得我们可以不配置XML格式的Mapper文件,方便的编写简单的数据库操作代码。

实体类

City.java

1
2
3
4
5
6
7
@Data
public class City {

private Long id;
private String name;
private String state;
}

@Data : Lombok注解

数据访问层

简单查询方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* @author Ray
* @date 2018/7/24 0024
* 主要用途:介绍Mybatis注解的常见使用方式
*/
@Repository
public interface CityDao {

/**
* 方式1:使用注解编写简单的SQL。
*/
@Select("select * from city where 1=1")
List<City> selectSimple();
}

@Repository : 声明为数据访问层(Dao层)

修改SpringBoot启动类

添加扫描Mapper接口
注意包: import org.mybatis.spring.annotation.MapperScan;

1
2
3
4
5
6
7
8
@SpringBootApplication
@MapperScan("com.ray.springboot206.dao") // 扫描Mapper接口
public class Springboot206Application {

public static void main(String[] args) {
SpringApplication.run(Springboot206Application.class, args);
}
}

回顾注解

CURD注解

MyBatis 主要提供了以下CRUD注解:
(1)@Select
(2)@Insert
(3)@Update
(4)@Delete

为了解决对象属性和字段驼峰不一致的问题,我们可以使用映射注解@Results 来指定映射关系。

映射注解

Mybatis主要提供这些映射注解:
(1)@Results 用于填写结果集的多个字段的映射关系.
(2)@Result 用于填写结果集的单个字段的映射关系.
(3)@ResultMap 根据ID关联XML里面.

1
2
3
4
5
6
7
8
9
10
/**
* 方式2:使用注解编写映射的SQL。
*/
@Results({
@Result(property = "id", column = "ID"),
@Result(property = "name", column = "NAME"),
@Result(property = "state", column = "STATE"),
})
@Select("select * from city")
List<City> selectResults();

上面的list方法,我们可以在查询SQL的基础上,指定返回的结果集的映射关系,其中 property 表示实体对象的属性名,column 表示对应的数据库字段名。

自动生成映射结果集(推荐)

为了方便演示和免除手工编写映射关系的烦恼,这里提供了一个快速生成映射结果集的方法,具体内容如下:

创建SqlProvider.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.lang.reflect.Field;

/**
* @author Ray
* @date 2018/7/24 0024
*/
public class SqlProvider {

/**
* 1.用于获取结果集的映射关系
*/
public static String getResultsStr(Class origin) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("@Results({\n");
for (Field field : origin.getDeclaredFields()) {
String property = field.getName();
//映射关系:对象属性(驼峰)->数据库字段(下划线)
String column = new PropertyNamingStrategy.SnakeCaseStrategy().translate(field.getName()).toUpperCase();
stringBuilder.append(String.format("@Result(property = \"%s\", column = \"%s\"),\n", property, column));
}
stringBuilder.append("})");
return stringBuilder.toString();
}

public static void main(String[] args) {
System.out.println(getResultsStr(City.class));
}
}

传入xxx.class ,运行main方法

高级注解

MyBatis-3 主要提供了以下CRUD的高级注解:
(1)@SelectProvider
(2)@InsertProvider
(3)@UpdateProvider
(4)@DeleteProvider

见名知意,这些高级注解主要用于动态SQL,这里以@SelectProvider 为例,主要包含两个注解属性,其中type表示工具类,method 表示工具类的某个方法,用于返回具体的SQL。

工具类

CitySqlProvider.java

1
2
3
4
5
6
7
8
9
10
/**
* @author Ray
* @date 2018/7/24 0024
*/
public class CitySqlProvider {

public String selectAll(){
return "select * from city";
}
}

数据访问层

type 表示工具类,method 表示工具类的某个方法。

1
2
3
4
5
/**
* 方式3:使用注解编写动态的SQL。
*/
@SelectProvider(type = CitySqlProvider.class, method = "selectAll")
List<City> selectProvider();

延伸

无论什么方式,如果涉及多个参数,则必须加上@Param注解,否则无法使用EL表达式获取参数。

1
2
3
4
5
/**
* 方式4:使用注解编写绑定参数的SQL。
*/
@Select("select * from city where name = #{name} and state = #{state}")
List<City> getParam(@Param("name") String name, @Param("state") String state);

-------------- 本文结束  感谢您的阅读 --------------