SpringBoot笔记(4)-整合MyBatis访问数据库

数据库场景

在Web开发过程中,经常会使用到数据库,因此需要引入相关依赖。SpringBoot官方提供了一个启动器,对应数据库场景。我们引入下面的启动器,就可以引入数据库相关依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>

不过在导入的依赖中,没有导入数据库的驱动。这也能够理解,SpringBoot并不能预见到我们会使用哪种数据库驱动,因此将导入的主动权交给用户。所以接下来我们需要引入数据库驱动,例如MySQL驱动:

1
2
3
4
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

在引入驱动的时候我们可以查看一下SpringBoot中配置的默认版本是多少,如果需要修改,可以直接指定version,或者重新设置对应的properties。

SpringBoot完成数据库场景的自动配置,会涉及到下面一些类:

  • DataSourceAutoConfiguration:完成数据源的自动配置。对应配置项为spring.datasource,底层默认配置的数据库连接池为HikariDataSource
  • DataSourceTransactionManagerAutoConfiguration:完成事务管理器的自动配置
  • JdbcTemplateAutoConfiguration:完成JdbcTemplate的自动配置。对应配置项为spring.jdbc。完成自动配置后IOC容器中会管理JdbcTemplate组件,可以使用自动注入@Autowired获取
  • JndiDataSourceAutoConfiguration:完成JDNI的自动配置
  • XADataSourceAutoConfiguration:完成分布式事务相关配置

完成启动器引入之后,我们可以在配置项中指定数据库的连接配置,主要完成连接url、用户名、密码和驱动的配置:

1
2
3
4
5
6
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssm_data
username: root
password: 123123
driver-class-name: com.mysql.cj.jdbc.Driver

之后可以使用JdbcTemplate来测试是否能够正常工作:

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
public class JdbcController {
@Autowired
private JdbcTemplate jdbcTemplate;

@RequestMapping("/testEmp")
public Emp test() {
String sql = "select * from emp where emp_id = 1";
Emp emp = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Emp.class));
return emp;
}
}

SpringBoot默认配置的数据库连接池是HikariDataSource,之前我们使用的一直是Druid,这里也可以进行整合。

SpringBoot中整合第三方技术的有两种常见的方式,一种是自定义方式,手动将对应的类配置到IOC容器中,这样就底层就会使用我们配置的Bean对象;另一种方式是找到对应的场景启动器starter,这种一般是官方或者第三方提供的解决方案。

第一种方式,利用自定义方式整合Druid。我们需要先添加依赖:

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>

之后在配置类中提供需要被IOC容器管理的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration
public class MyConfig {

@Bean
@ConfigurationProperties("spring.datasource")//复用配置文件的数据源配置
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();

// druidDataSource.setUrl();
// druidDataSource.setUsername();
// druidDataSource.setPassword();

return druidDataSource;
}
}

第二种方式,使用场景启动器。只需要直接引入相关starter即可:

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>

MyBatis整合

配置使用

在SSM中,DAO层我们使用的是MyBatis框架。我们同样可以在SpringBoot中整合MyBatis。由于MyBaits为我们提供了SpringBoot的场景启动器(GitHub - mybatis/spring-boot-starter: MyBatis integration with Spring Boot),因此我们直接在项目中引入即可:

1
2
3
4
5
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>

引入启动器之后,SpringBoot会帮助我们完成自动配置。包括全局配置文件、SqlSessionFactory、SqlSession等。

之后,我们需要在application.yaml配置文件中指定相关配置,除了上面的数据库连接配置之外,还需要配置mybatis规则,包括全局配置文件的位置,mapper配置文件的位置:

1
2
3
4
5
6
7
8
9
10
11
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssm_data
username: root
password: 123123
driver-class-name: com.mysql.cj.jdbc.Driver

# MyBatis规则
mybatis:
config-location: classpath:mybatis/mybatis-config.xml # 全局配置文件
mapper-locations: classpath:mybatis/mapper/*.xml # mapper配置文件

这里的全局配置文件mybatis-config.xml我们只需要准备一个基本结构即可,其中的内容都会由SpringBoot自动进行配置,这里也就不需要我们配置了。

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>

之后我们就可以按照MyBatis中的开发方式进行开发,完成Mapper接口以及对应的Mapper配置文件,这里的Mapper接口需要使用@Mapper注解标识,才能被SpringBoot管理。据此,我们可以实现如下的Mapper接口和Mapper配置文件。

Mapper接口UserMapper如下:

1
2
3
4
@Mapper
public interface UserMapper {
public User getUser(Integer id);
}

Mapper配置文件UserMapper.xml如下:

1
2
3
4
5
6
7
8
9
10
<?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.syh.springboot.mapper.UserMapper">
<!--public User getUser(Integer id)-->
<select id="getUser" resultType="com.syh.springboot.bean.User">
select * from users where id = #{id}
</select>
</mapper>

之后可以进行测试,按照三层架构应该分成Contorller和Service层,不过这里我们可以全部写在一起。这里IOC容器中管理了对应接口的代理类,我们可以通过自动注入的方式来获取:

1
2
3
4
5
6
7
8
9
10
11
@RestController
public class MyBatisController {

@Autowired
private UserMapper userMapper;

@GetMapping("getUser")
public User getUser() {
return userMapper.getUser(3);
}
}

我们可以按照以前的方式,在全局配置文件中进行相关配置,也可以直接在配置文件application.yaml中,利用mybatis属性进行配置。我们也可以直接将配置全部写在其中的configuration中,这里面的值就对应全局配置文件中的值。也就是说,我们配置了mybatis.configuration,就不需要再配置MyBatis全局配置文件了:

1
2
3
4
5
# MyBatis规则
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml # mapper配置文件
configuration:
map-underscore-to-camel-case: true

默认没有开启驼峰转换,这里我们使用配置的方式进行开启。

总结来说,在SpringBoot中使用MyBatis,我们需要经过下面的步骤:

  1. 导入MyBatis官方提供的启动器starter
  2. 编写Mapper接口,使用@Mapper注解
  3. 编写Mapper配置文件并绑定对应的Mapper接口
  4. application.yaml中指定Mapper配置文件所在的位置,在mybatis.configuration配置相关全局信息

注解使用

在MyBatis中我们还可以使用注解来完成SQL与方法映射:

1
2
3
4
5
@Mapper
public interface EmpMapper {
@Select("select * from emp where emp_id=#{id}")
Emp getEmp(Integer id);
}

这是提供的一种简化方式,当然也可以利用注解和配置文件结合。简单的操作方法就直接写在注解上,如果复杂的就写在配置文件中。

我们的Mapper接口都需要使用@Mapper注解进行标识,不过我们也可以在启动类上使用@MapperScan("com.syh.springboot.mapper")注解,指明对应Mapper所在的包路径,之后对应包下的Mapper接口就可以不标注@Mapper注解了。


SpringBoot笔记(4)-整合MyBatis访问数据库
http://example.com/2022/11/03/SpringBoot笔记-4-整合MyBatis访问数据库/
作者
EverNorif
发布于
2022年11月3日
许可协议