在Spring Boot中使用MyBatis访问数据库中我们通过直接使用注解的方式完成了简单实现增删改查操作,现在这篇,我将围绕在xml文件中配置相关SQL语句,换句话将,本篇将SQL语句和相关Java接口分离,这更加符合我们在实际开发中的操作,这篇可以说更加适合我们在企业中进行开发的操作。
并且了解IOC的小伙伴们应该知道,IOC(控制反转)是Spring 中特有的操作,我们通过配置Mybatis的相关属性,将MyBatis的配置文件和Mapper XML文件加载到Spring 的容器中,从而实现IOC。
具体来说吧:
- 通过在
application.properties
或application.yml
文件中配置mybatis.config-location
属性,指定了 MyBatis 的配置文件的位置。Spring Boot会自动将该配置文件加载到 Spring 容器中,从而实现了对 MyBatis 配置的管理和控制。 - 通过在
application.properties
或application.yml
文件中配置mybatis.mapper-locations
属性,指定了 Mapper XML 文件的位置。Spring Boot会自动扫描并加载这些 Mapper XML 文件,将其解析为 MyBatis 的 Mapper 接口,从而实现了对 Mapper接口的管理和控制。 - 在
MyBatisConfig
配置类中,使用@MapperScan
注解扫描 Mapper 接口所在的包,并将其注册到 Spring容器中。这样,我们就可以在其他组件中通过依赖注入的方式使用这些 Mapper 接口,实现了对 Mapper 接口的控制反转。
好,介绍相关知识点后,我们开始搭建一个demo
老样子,还是引入相关依赖
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
第二步:在application文件中配置我们的数据库和端口
# MySQL
#spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
#spring.datasource.username=root
#spring.datasource.password=123456
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Oracle
server.port=1001
#spring.datasource.url=jdbc:oracle:thin:@localhost:1521/orcl
#spring.datasource.username=root
#spring.datasource.password=root
#spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
# 配置Mybatis文件位置,告诉Spring Boot你需要扫描的位置
mybatis.mapper-locations=classpath:mapper/*.xml
MySQL数据库结构:
CREATE TABLE `User` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`age` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
根据表结构创建实体类对象:
public class User {
private Long id;
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public User() {
}
}
创建一个Mapper接口,与UserMapper.xml文件关联起来,了解过MyBatis的都知道这种方式是通过映射的方式进行的。
public interface UserMapper {
User findByName(@Param("name") String name);
int insert(@Param("name") String name, @Param("age") Integer age);
}
接下来我们需要创建一个MyBatis配置文件,一般我们会创建*Mapper.xml文件。比如我们现在使用的实体类是User,那么我们就创建一个UserMapper.xml文件放到Resources/mapper,如果你没有mapper文件夹,就新建一个。
<?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接口的Java接口路径-->
<mapper namespace="com.miaow.demo.mapper.UserMapper">
<select id="findByName" resultType="com.miaow.demo.entity.User">
SELECT * FROM USER WHERE NAME = #{name}
</select>
<insert id="insert">
INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})
</insert>
</mapper>
至此我们就可以通过编写一个单元测试进行接口测试了。
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class ApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
@Rollback //执行完毕后回滚操作,避免影响数据
public void test() throws Exception {
//插入miaow,年龄20岁
userMapper.insert("maiow", 20);
//根据名字为miaow的进行查找
User u = userMapper.findByName("miaow");
//Assert.assertEquals(20, u.getAge().intValue()) 的含义是,断言对象 u 的年龄属性的值等于 20。如果断言成功,即对象的年龄属性等于 20,则程序继续执行;如果断言失败,即对象的年龄属性不等于 20,则会抛出一个 AssertionError 异常。
Assert.assertEquals(20, u.getAge().intValue());
}
}
PS:这里说明一下,本案例为了直接展示,故而免去了Service层的操作,正确的操作,是我们创建Service接口,然后创建一个Service 实现类,在Service实现类里边调用Mapper接口。