MyBatis官方为了方便Spring Boot集成MyBatis,专门提供了一个符合Spring Boot规范的starter项目mybatis-spring-boot-starter,
现在只需要在pom.xml中添加上面的依赖即可,符合Spring Boot规范的starter依赖都会按照默认的配置方式在系统启动时自动配置好,因此不用对 MyBatis 进行任何额外的配置,MyBatis就已经集成好了。
导入依赖
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<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.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
项目具体情况
数据库,建表
drop table if exists n_sysdict;
create table n_sysdict(
id int not null auto_increment,
code varchar(64) not null comment '类型',
name varchar(64) not null comment '字典名',
value varchar(64) not null comment '字典值',
primary key(id)
) comment '字典表';
insert into n_sysdict values (1,'性别','男','女');
insert into n_sysdict values (2,'性别','女','女');
insert into n_sysdict values (3,'季度','第一季度','1');
insert into n_sysdict values (4,'季度','第二季度','2');
insert into n_sysdict values (5,'季度','第三季度','3');
insert into n_sysdict values (6,'季度','第四季度','4');
drop table if exists n_country;
create table n_country(
id int not null auto_increment primary key,
country_name varchar(50) not null,
country_code varchar(20) null
);
insert into n_country(country_name,country_code) values('中国','CN');
insert into n_country(country_name,country_code) values('美国','US');
insert into n_country(country_name,country_code) values('俄罗斯','RU');
insert into n_country(country_name,country_code) values('美国','GB');
insert into n_country(country_name,country_code) values('法国','FR');
drop table if exists n_sysuser;
create table n_sysuser(
id int not null auto_increment primary key,
loginName varchar(30) not null,
userName varchar(30) null,
age int null,
password varchar(30) not null,
tel varchar(20) null
);
insert into n_sysuser(loginName,userName,age,password,tel) values ('admin','管理员',99,'1234','110');
添加CountryMapper接口
先在com.shrimpking.pojo包下新建Country类。
Country.java
package com.shrimpking.pojo;
import lombok.Data;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/12 19:23
*/
@Data
public class Country
{
private Integer id;
private String countryName;
private String countryCode;
}
然后在com.shrimpking.mapper包下新建CountryMapper接口。
CountryMapper.java
package com.shrimpking.mapper;
import com.shrimpking.pojo.Country;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/12 19:25
*/
@Mapper
public interface CountryMapper
{
/**
*
* @return
*/
List<Country> selectAll();
}
这个接口和前面的接口最大的区别是,这里使用了@Mapper注解,增加这个注解之后,Spring启动时会自动扫描该接口,这样就可以在需要使用时直接注入Mapper了。
添加CountryMapper.xml
映射文件在src/main/resources下面创建mapper目录,然后新建CountryMapper.xml映射文件。
CountryMapper.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.shrimpking.mapper.CountryMapper">
<select id="selectAll" resultType="com.shrimpking.pojo.Country">
select id,country_name,country_code from n_country
</select>
</mapper>
配置MyBatis
在application.properties配置文件中添加如下内容。
server.port=8099
#数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=UTC
spring.datasource.username=root
spring.datasource.password=mysql123
#起别名
mybatis.type-aliases-package=com.shrimpking.pojo
#mapper xml
mybatis.mapper-locations=classpath:mapper/**/*.xml
#驼峰转换
mybatis.configuration.map-underscore-to-camel-case=true
测试
package com.shrimpking;
import com.shrimpking.mapper.CountryMapper;
import com.shrimpking.pojo.Country;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class Springboot59MybaitsApplicationTests
{
@Autowired
private CountryMapper countryMapper;
@Test
void test()
{
List<Country> countries = countryMapper.selectAll();
countries.forEach(System.out::println);
}
}
到这里,Spring Boot集成MyBatis就完成了。其中还存在很多和配置相关的细节,并且我们还想把前面章节中开发的MyBatis代码集成到Spring Boot中,那么继续来看下一节的配置介绍。
MyBaits 在不同用法中的配置方式不同,但是所有可配置的属性含义和作用都是相同的,由于Spring Boot方式有特殊的配置规范,所以这里将特别介绍。
Spring Boot可以通过@ConfigurationProperties注解自动将配置文件中的属性组装到对象上,这个注解一般都需要配置与属性匹配的前缀,此处前缀为“mybatis”,因此对MyBatis的配置都是以“mybatis.”作为前缀的。属性类中的字段如果是驼峰形式的,在配置文件中进行配置时建议改为横杠(-)和小写字母连接的形式,虽然Spring Boot仍然能正确匹配驼峰形式的属性,但是支持 Spring Boot 的 IDE 在自动提示时会使用标准的形式,例如configLocation在配置时应改写成mybatis.config-location的形式。
MybatisProperties 并没有把所有的属性都列举出来,但是这个类提供了一个嵌套的Configuration属性,通过这种方式可以直接对Configuration对象进行属性配置,例如settings中的属性可以按下面的方式进行配置。基本上大部分的配置都可以通过这种形式去实现,如果遇到不会配置的内容,仍然可以通过mybatis-config.xml方式去配置MyBatis,然后在Spring Boot的配置中指定该文件的路径即可,示例如下。mybatis.config-location=classpath:mybatis-config.xml使用上面这种方式在任何情况下都是最有效的。
简单示例
引入新的依赖后,还需要配置MyBatis,让MyBatis可以扫描到这个依赖下面的Mapper接口。上面的例子中使用的是@Mapper 注解,但是对于已经存在的 项目来说,一个个去添加注解并不合适,因此要换一种新的方式来扫描Mapper接口。添加@MapperScan注解,代码如下。
package com.shrimpking;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.shrimpking.mapper")
public class Springboot59MybaitsApplication
{
public static void main(String[] args)
{
SpringApplication.run(Springboot59MybaitsApplication.class, args);
}
}
实体类
SysUser.java
package com.shrimpking.pojo;
import lombok.Data;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/12 21:26
*/
@Data
public class SysUser
{
private Integer id;
private String loginName;
private String userName;
private Integer age;
private String password;
private String tel;
}
Mapper接口
SysUserMapper.java
package com.shrimpking.mapper;
import com.shrimpking.pojo.SysUser;
import java.util.List;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/12 21:34
*/
public interface SysUserMapper
{
SysUser selectById(Integer id);
List<SysUser> selectAll();
}
开发业务(Service)层
新建com.shrimpking.service包,然后在该包下面创建SysUserService接口,代码如下。
SysUserService.java
package com.shrimpking.Service;
import com.shrimpking.pojo.SysUser;
import java.util.List;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/12 21:23
*/
public interface SysUserService
{
/**
*
* @param id
* @return
*/
SysUser getById(Integer id);
/**
*
* @return
*/
List<SysUser> getAll();
}
再创建com.shrimpking.service.impl包,在该包下创建SysUserServiceImpl实现类,代码如下。
package com.shrimpking.Service.impl;
import com.shrimpking.Service.SysUserService;
import com.shrimpking.mapper.SysUserMapper;
import com.shrimpking.pojo.SysUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/12 21:39
*/
@Service
public class SysUserServiceImpl implements SysUserService
{
@Autowired
private SysUserMapper sysUserMapper;
@Override
public SysUser getById(Integer id)
{
return sysUserMapper.selectById(id);
}
@Override
public List<SysUser> getAll()
{
return sysUserMapper.selectAll();
}
}
开发控制(Controller)层
在com.shrimpking.controller包下创建SysUserController类,代码如下。
package com.shrimpking.controller;
import com.shrimpking.Service.SysUserService;
import com.shrimpking.pojo.SysUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/12 21:42
*/
@RestController
public class SysUserController
{
@Autowired
private SysUserService sysUserService;
@RequestMapping("/user/{id}")
SysUser user(@PathVariable("id") Integer id)
{
return sysUserService.getById(id);
}
@RequestMapping("/users")
List<SysUser> users()
{
return sysUserService.getAll();
}
}
UserController中提供了两个方法:通过id获取具体的用户信息的方法以及获取全部用户信息的方法。
运行应用查看效果
在浏览器地址栏输入http://localhost:8089/users,此时会显示出系统中所有的用户信息,显示内容如下。
本章在Spring Boot项目中集成了MyBatis,通过MyBatis提供的starter可以很方便地实现集成。通过对 MybatisProperties 配置类的介绍,我们了解到了在 Spring Boot 中实现MyBatis各项配置的方法,最后通过后实际的例子学会了如何在Spring Boot中开发Mapper接口。
通过引入项目使用已有的Mapper,我们明白了一件事:在任何框架中使用MyBatis都只是配置不同而已,其核心用法是一样的,因此学会MyBatis的用法才是最主要的。