Springboot2.0之后,推荐使用HikriCP作为数据源连接池,笔者也查过多方的资料,虽然没有测过HikriCP的效率和性能,但是多方验证它很强,Spring也默认,必定有它的道理
那么今天我们就使用HikriCP来整合SpringBoot和Mybatis,Mybatis是XML版的,笔者之后会发注解版的和混合版的。
开始吧,首先的数据源要有,笔者采用的是MySQL8.0.16版,查询超级快的版本。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wangye</groupId>
<artifactId>spboot-mybatis1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spboot-mybatis1</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<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.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意:一定要有mysql-connector-java 和 mybatis-spring-boot-starter ,并且mybatis-spring-boot-starter需要指定版本,不然会报错。
接下来,就是application.properties文件的配置了(笔者喜欢使用properties文件,不喜欢使用yaml文件,因为yaml文件,不能很好的把配置分开)。
# 数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useSSL=false
# 数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 用户名
spring.datasource.username=root
# 密码
spring.datasource.password=root
#自动提交 默认值true
spring.datasource.hikari.auto-commit=true
#此属性控制客户端(即您)将等待来自池的连接的最大毫秒数。 默认值30000(30秒)
spring.datasource.hikari.connection-timeout=30000
#此属性控制允许连接在池中闲置的最长时间。 默认值600000(10分钟),此设置仅适用于minimumIdle定义为小于maximumPoolSize。
spring.datasource.hikari.idle-timeout=600000
#此属性控制池中连接的最大生存期。 1800000(30分钟)
spring.datasource.hikari.max-lifetime=1800000
#该属性控制HikariCP尝试在池中维护的最小空闲连接数。不推荐使用这个,默认是和maximum-pool-size相等
spring.datasource.hikari.minimum-idle=100
#此属性控制池允许达到的最大大小,包括空闲和正在使用的连接。默认值10
spring.datasource.hikari.maximum-pool-size=100
#mybatis对应的映射文件路径
mybatis.mapper-locations=classpath:mapper/*.xml
#mybatis对应的实体类
mybatis.type-aliases-package=com.wangye.spbootmybatis1.model
注意:
因为使用的是SpringBoot2.0以上的版本,SpringBoot默认使用的就是HikriCP连接池数据源。所以不需要有特殊的配置。
配置已经配置完了,先看一下目录结构,主要是看XML和Model实体类的在哪,因为mybatis要去扫描的。
注意:
mapperXML一定要和配置文件中 mybatis.mapper-locations=classpath:mapper/*.xml 匹配
model实体类一定要和配置文件中 mybatis.type-aliases-package=com.wangye.spbootmybatis1.model匹配
接下来就是写代码了
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.wangye.spbootmybatis1.mapper.UserMapper">
<select id="getUserById" resultType="com.wangye.spbootmybatis1.model.User">
select
id as id,
name as name,
age as age
from
user
where
id = #{id}
</select>
</mapper>
注意namespace要和mapper(dao)具体的接口映射
UserMapper.java
@Repository
public interface UserMapper {
User getUserById(@Param("id") Long id);
}
使用@Repository说明它是一个持久类型的组件
UserService.java
@Service
public class UserService {
private UserMapper userMapper;
// Spring推荐在不强制依赖的时候,使用这种方式注入
@Autowired
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User getUserById(Long id) {
return userMapper.getUserById(id);
}
}
上面的代码的注入方式是Spring推荐的,详情见笔者另一篇博客:如何消除@Autowired报Field injection is not recommended的警告
还有UserController.java
@RestController
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable("id") Long id){
return userService.getUserById(id);
}
}
启动类:
@SpringBootApplication
@MapperScan("com.wangye.spbootmybatis1.mapper")
public class SpbootMybatis1Application {
public static void main(String[] args) {
SpringApplication.run(SpbootMybatis1Application.class, args);
}
}
注意注解@MapperScan("com.wangye.spbootmybatis1.mapper"),mybatis不仅要加载XML还要加载mapper接口,两者之间是需要做映射的。
然后启动,访问接口,就能实现一个简单的用户查询功能了