SpringBoot整合Mybatis

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的信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值