文章使用版本为 Spring Boot 2.1.x
前言
在 Spring Boot 入门系列(四) 使用JdbcTemplate访问数据库 中我们介绍了 JdbcTemplate 的简单用法,当项目比较小或者不怎么需要使用数据库时,JdbcTemplate 是个不错的选择,但是如果项目比较大时,我们希望使用一些更加强大的框架,比如今天我们介绍的 MyBatis。
Mybatis通常有两种使用方式
- 在接口文件上写注解来映射SQL语句
- 通过XML文件来映射SQL语句
今天我们先来学习第一种方式,使用注解
添加依赖
在spring boot下使用 mybatis,首先我们要添加 mybatis 的依赖,其中 pagehelper 是第三方的一个分页插件。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<!--mybatis分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
配置application.yml
application.yml的配置包括两部分,一部分是数据源的配置,另一部分就是Mybatis的各种配置。
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring_boot_learn?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&useSSL=true
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
hikari:
minimum-idle: 2
maximum-pool-size: 5
mybatis:
configuration:
default-executor-type: reuse
default-statement-timeout: 2
新建接口类
package org.schhx.springbootlearn.dao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.schhx.springbootlearn.module.User;
public interface UserMapper {
@Insert("insert into user (id, username, age) values(#{id}, #{username}, #{age})")
int insert(User record);
@Delete("delete from user where id = #{id}")
int deleteByPrimaryKey(String id);
@Update("update user set username = #{username}, age = #{age} where id = #{id}")
int updateByPrimaryKey(User record);
@Select("select * from user where id = #{id}")
User selectByPrimaryKey(String id);
}
扫描接口类
现在我们还需要把接口类交给Spring来管理,扫描接口类的方式有两种
- 在接口类上加上注解 @Mapper。
- 在项目启动类上加注解 @MapperScan(basePackages = {"org.schhx.springbootlearn.dao"}),它会扫描指定包下的所有接口类。
建议使用第二种方式。
测试
到此为止,我们已经把所有的配置都配置完毕,可以通过一个测试文件来测试是否能够正常访问数据库。
package org.schhx.springbootlearn.dao;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.schhx.springbootlearn.module.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import java.util.UUID;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
@Transactional
public void insert() throws Exception {
User user = new User()
.setId(UUID.randomUUID().toString())
.setUsername("张三")
.setAge(20);
int result = userMapper.insert(user);
Assert.assertEquals(1, result);
}
@Test
@Transactional
public void deleteByPrimaryKey() throws Exception {
User user = new User()
.setId(UUID.randomUUID().toString())
.setUsername("张三")
.setAge(20);
userMapper.insert(user);
int result = userMapper.deleteByPrimaryKey(user.getId());
Assert.assertEquals(1, result);
}
@Test
@Transactional
public void updateByPrimaryKey() throws Exception {
User user = new User()
.setId(UUID.randomUUID().toString())
.setUsername("张三")
.setAge(20);
userMapper.insert(user);
user.setUsername("李四")
.setAge(30);
userMapper.updateByPrimaryKey(user);
User result = userMapper.selectByPrimaryKey(user.getId());
Assert.assertEquals(user, result);
}
@Test
public void selectByPrimaryKey() throws Exception {
}
}