SpringBoot整合Mybatis
使用Mybatis提供的注解可以逐步取代XML,例如使用@Select注解直接编写SQL完成数据查询,使用@SelectProvider高级注解还可以编写动态SQL,以应对复杂的业务需求。
一、基础注解
MyBatis主要提供了以下CRUD注解:
1)@Select
2)@Insert
3)@Update
4)@Delete
增删改查占据了绝大部分的业务操作,在配置文件中开启全局驼峰映射(SpringBoot中同样能够做到,并且更为简单)。下面这段代码无需XML即可完成数据查询:
@Mapper
public interface UserMapper {
@Select("select * from t_user")
List<User> list();
}
二、映射注解
1)@Results 用于填写结果集的多个字段的映射关系。
2)@Result 用于填写结果集的单个字段的映射关系。
3)@RestMap 根据ID关联XML里面“resultMap”;
为了解决对象属性和字段驼峰不一致的问题,我们可以在查询SQL的基础上,指定返回的结果集的映射关系,其中property表示实体对象的属性名,column表示对应的数据库字段名。
@Mapper
public interface UserMapper {
@Results({
@Result(property = "userId", column = "USER_ID"),
@Result(property = "username", column = "USERNAME"),
@Result(property = "password", column = "PASSWORD"),
@Result(property = "mobileNum", column = "PHONE_NUM")
})
@Select("select * from t_user")
List<User> list();
}
下面提供一个快速生成结果集的工具类:
/**
* 用于获取结果集的映射关系
*/
public static String getResultsStr(Class origin) {
StringBuilder stringBuilder = new String Builder();
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();
}
在main方法内执行效果如下:
@Results({
@Result(property = "userId", column = "USER_ID"),
@Result(property = "username", column = "USERNAME"),
@Result(property = "password", column = "PASSWORD"),
@Result(property = "mobileNum", column = "PHONE_NUM")
)}
三、高级注释
Mybatis-3主要提供了以下CRUD的高级注解:
1)@SelectProvider
2)@InsertProvider
3)@UpdateProvider
4)@DeleteProvider
这些高级注解主要用于动态SQL,这里以@SelectProvider为例,主要包含两个注解属性,其中type表示工具类,method表示工具类的某个方法,用于返回具体的SQL。
@Mapper
public interface UserMapper {
@SelectProvider(type = ProviderUtils.class, method = "testList")
List<User> testList();
}
工具类代码如下:
public class UserSqlProvider {
public String testList() {
return "select * from t_user";
}
}
四、详细教程
1)引入依赖
搭建web环境,数据库为Mysql5.5+版本。
<dependencies>
<dependency><!--添加web依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring.boot.starter-web</artifactId>
</dependency>
<dependency><!--添加mybatis依赖-->
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency><!--添加sql驱动依赖-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactid>
<scope>runtime</scope>
</dependency>
<dependency><!--添加TEST依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2)添加配置
添加数据源,配置驼峰映射和开启SQL日志的控制台打印。在项目的资源目录中,添加application.yml配置如下:
spring:
datasource:
#连接MySql
url: jdbc:mysql://localhost:3306/test?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
mybatis:
configuration:
#配置项:开启下划线到驼峰的自动转换,作用:将数据库字段根据驼峰规则自动注入到对象属性
map-underscore-to-camel-case: true
logging:
level:
#打印sql信息
com.hehe.mapper:debug
3)编写数据层代码
编写UserMapper接口和UserSqlProvider。
a、UserMapper
添加UserMapper接口用于数据查询:
package com.hehe.mapper;
@Mapper
public interface UserMapper {
/**
* 方式1:使用注解编写sql
*/
@Select("select * from t_user")
List<User> list();
/**
* 方式2: 使用注解指定某个工具类的方法来动态编写SQL;
*/
@SelectProvider(type = UserSqlProperty.class, method = "listByUserName")
List<User> listByUserName(String userName);
/**
* 通过Result注解来指定结果集的映射关系
*/
@Results({
@Result(property = "userId", column = "USER_ID"),
@Result(property = "username", column = "USERNAME"),
@Result(property = "password", column = "PASSWORD"),
@Result(property = "mobileNum", column = "PHONE_NUM")
)}
@Select("select * from t_user")
List<User> listSample();
/**
* 如果涉及多个参数,则需加上@Param注解,否则无法使用EL表达式获取参数
*/
@Select("select * from t_user where username like #{username} and password like #{password}")
User get(@Param('username') String username, @Param('password') String password);
@SelectProvider(type = UserSqlProvider.class, method = "getBadUser")
User getBadUser(@Param("username") String username, @Param("password") String password);
}
b、UserSqlProvider
添加UserSqlProvider,用于生成SQL的工具类
/**
* 用途:根据复杂的业务需求来动态生成sql
* 目标:使用java工具类来替代传统的XML文件(UserSqlProvider.java <-- UserMapper.xml)
*/
public class UserSqlProvider {
//方式1:手动编写sql
public String listByUserName(String userName) {
return "select * from t_user where userName = #{userName}";
}
//方式2:根据官方提供的API来编写动态SQL
public String getBadUser(@Param("userName") String userName, @Param("password") String password) {
return new SQL() {{
SELECT("*");
FROM("t_user");
if(null != username && null != password) {
WHERE("userName like #{userName} and password like #{password}");
} else {
WHERE ("1=2");
}
}}.toString;
}
}
c、实体类User
添加实体类User
public class User{
private String userId;
private String userName;
pirvate String password;
private String mobileNum;
...
}
d、添加数据记录
添加数据库记录脚本如下:
USE 'test';
DROP TABLE IF EXISTS 't_user';
CREATE TABLE 't_user' (
'USER_ID' varchar(50);
'USERNAME' varchar(50);
'PASSWORD' varchar(50);
'PHONE_NUM' varchar(15);
);
INSERT INTO 't_user' values('1', 'admin', 'admin', '13000000000');
4)编写控制层代码
@RestController
@RequestMapper("/user/*")
public class UserController {
@SuppressWarnings("all")
@Autowired
UserMapper userMapper;
@GetMapping("list")
public List<User> list() {
return userMapper.list();
}
@GetMapping("list/{userName}")
public List<User> listByUserName(@PathVariable("userName") String userName) {
return userMapper.listByUserName(userName);
}
@GetMapping("get/{username}/{password}")
public User get(@PathVariable("userName") String userName, @PathVariable("password") String password) {
return userMapper.get(userName, password);
}
@GetMapping("get/bad/{userName}/{password}")
public User getBadUser(@PathVariable("userName") String userName, @PathVariable("password") String password) {
return userMapper.getBadUser(userName, password);
}
}
启动项目:
可通过访问http://localhost:8080/user/list查看用户列表。
可通过访问http://localhost:8080/user/list/admin查看用户名为admin的信息。