Spring Boot 集成Mybatis
首先在SpringBoot的配置文件application.yml(application.properties)中
datasource:
url: localhost:3306/test
spring:
datasource: # 数据库配置
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://${datasource.url}?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
username: root
password: 123456
hikari:
maximum-pool-size: 10 # 最大连接池数
max-lifetime: 1770000
mybatis:
# 指定别名设置的包为所有pojo
type-aliases-package: com.example.demo.pojo
configuration:
map-underscore-to-camel-case: true # 驼峰命名规范
mapper-locations: # mapper 映射文件位置
- classpath:mapper/*.xml
map-underscore-to-camel-case: true
开启驼峰命名,类似于表中的字段user_name在相应的POJO类中只需要写成userName便会自动匹配。
有两种方式来操纵数据库。
1. XML方式
表t_user结构:
mysql> desc t_user;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| age | int(11) | YES | | NULL | |
| user_name | varchar(255) | YES | | NULL | |
| passWD | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
创建一个UserController类
@RestController
public class UserController {
@Resource
private UserService userService;
@RequestMapping("/getUserByName/{name}")
public UserInfo getUserByName(@PathVariable String name){
return userService.getUserByName(name);
}
}
UserService.interface
public interface UserService {
UserInfo getUserByName(String name);
}
UserServiceImp.java
@Service
public class UserServiceImp implements UserService{
@Resource
private UserMapper userMapper;
@Override
public UserInfo getUserByName(String name){
return userMapper.getUserByName(name);
}
}
UserMapper.java
public interface UserMapper {
//使用XML方式
UserInfo getUserByName(String userName);
}
在项目资源目录中创建一个mapper文件夹(在上面的配置文件中说明了映射文件位置),新建一个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.demo.dao.UserMapper">
<resultMap id="BaseResultMap" type="com.example.demo.pojo.UserInfo">
<result column="user_name" jdbcType="VARCHAR" property="userName" />
</resultMap>
<select id="getUserByName" resultType="UserInfo" parameterType="String">
select * from t_user where user_name = #{userName}
</select>
</mapper>
namespace指定对应的Mapper,resultMap
指定表对应的实体类。在前的配置文件中已经开启驼峰命名了所以可以不用写<result>
这里需要注意一下:Spring Boot是如何知道这个Mapper的呢?一种方法是在mapper层对应的类上添加@Mapper注解即可,但这种方法有个弊端,当我们有很多个mapper时,每个一个类上都得添加@Mapper注解。另一种比较简便的方法是在Spring Boot启动类上添加@MaperScan注解,用来扫描某个包下的所有mapper。
@SpringBootApplication
@MapperScan("com.example.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2. 注解方式
还可以通过注解的方式使用SQL语句 spring boot支持 增:@insert;删:@delete;改:@update;查:@selete;注解。
public interface UserMapper {
//使用XML方式
UserInfo getUserByName(String userName);
//注解方式
@Select("select * from t_user where age = #{age}")
UserInfo getUserByAge(int age);
//多个参数 @ Param指定的参数要和SQL中#{}取的参数名相同,不同则取不到。
@Select("select * from t_user where age = #{age} and userName = #{userName}")
UserInfo getUserByAgeAndName(@Param("age") int age,@Param("userName") String userName);
@Select("select * from t_user")
List<UserInfo> getUser();
}
只需要在对应的方法上添加注解即可。不需要再写XML文件。如果实体类和数据库表字段不能通过驼峰命名来映射,就需要使用@Results注解。
@Select("select * from t_user where age = #{age}")
@Results({
@Result(property = "username", column = "user_name"),
@Result(property = "password", column = "passWD")
})
User getUser(int age);
不过在项目中一般会使用XML和注解结合的方式来使用。使用@ResultMap引入XML文件中的<ResultMap>
的配置,注解中的值为XML中<ResultMap>
的id值。
@Select("select * from t_user where age = #{age}")
@ResultMap("BaseResultMap")
User getUser(int age);