在企业应用项目中,数据库是一个非常重要的组成部分,因为它是存储和管理数据的地方。与此同时,ORM框架使得业务逻辑可以轻松地与数据持久化进行交互,MyBatis正是其中一种常用的ORM框架之一。而在现代的Java应用程序开发中,SpringBoot是必不可少的。
本文旨在介绍如何使用SpringBoot整合Mybatis,以及其中可能会遇到的一些问题及其解决方案。
一、整合Mybatis
首先,我们需要在项目中将Mybatis依赖导入,可在pom.xml
文件中声明依赖项。SpringBoot提供了一个名为‘MyBatis-Spring-Boot Starter’的包,可以将其添加到Maven或Gradle中,以自动将MyBatis集成到SpringBoot项目中。
<!-- SpringBoot Mybatis Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
复制代码
接下来,我们需要配置数据源。如果是使用Spring Data JPA等框架,可以通过自动化配置来设置数据源。但是使用MyBatis,需要在项目中手动配置数据源。这里我们以MySQL为例,定义了一个包含必要属性的application.properties
文件。
# Spring DataSource Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
# Mybatis Configuration
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.model
复制代码
在上述代码中,application.properties
文件中定义了MySQL数据源的相关属性,包括用户名、密码等。此外,还有一个用于指定Mapper文件(.xml)位置的属性mybatis.mapper-locations,这里我们将它们放在mappers目录下,以.xml
为后缀的文件都会被识别为mapper文件。而用于定义Model实体类(实体类即是数据库表格中的行数据映射类)的mybatis.type-aliases-package属性也被设置好了。
但这些是整合Mybatis的基础,如果需要进一步了解如何在SpringBoot中使用MyBatis,还需要了解更深入的技术内容。
二、事务管理
事务是一组原子性的操作,在数据库中要么全部执行,要么全部不执行。当我们使用Mybatis的时候,需要确保数据库操作的成功性和数据的一致性,因此需要事务的支持。在Spring框架中,事务是通过AOP(面向切面编程)来实现的,事务管理使用了声明性事务模式。这可以确保业务类尽可能地专注于业务本身,并最小化与事务管理相关的代码。
通过@Transactional
注解,我们可以在方法中指定事务处理的方法,例如:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional(rollbackFor = Exception.class)
public void addUser(User user) throws Exception {
// 保存到数据库
userMapper.insert(user);
// 判断是否成功,如不再手动抛异常以回退事务
if(1!=1) throw new Exception("rollback");
}
}
复制代码
在上面的代码中,我们添加了@Transactional(rollbackFor = Exception.class)
注解以开启事务。该方法会将异常设置为回滚点,以保证在发生错误时事务回滚。另外,我们还需要确保Mybatis的Mapper接口使用了@Mapper
注解以便SpringBoot能够找到它们。
@Mapper
public interface UserMapper {
void insert(User user);
}
复制代码
三、分页查询
分页可以在不引入额外的解决方案的情况下很好地工作。Mybatis提供了一个分页插件,可以在Mapper文件(.xml)中使用分页插件来分页。需要引入com.github.pagehelper.PageHelper
插件依赖,将其添加到项目的pom.xml
文件中:
<!-- Mybatis Pagination Support -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>2.0.5</version>
</dependency>
复制代码
有了上述依赖,查询方法就可以使用分页查询了,例如:
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/list")
public String userList(Model model, @RequestParam(defaultValue = "1") int page) {
int pageSize = 2;
PageHelper.startPage(page, pageSize);
List<User> userList = userService.getUserList();
PageInfo<User> pageInfo = new PageInfo<User>(userList, pageSize);
model.addAttribute("pageInfo", pageInfo);
model.addAttribute("userList", userList);
return "user/list";
}
}
复制代码
除了控制器代码的修改,我们还可以添加以下内容到Mapper文件中,以实现数据的分页查询:
<select id="getUserList" resultType="User">
SELECT * FROM user
</select>
复制代码
四、多数据源配置
在一些项目开发中,我们需要将数据存储在不同的数据库中。这时我们就需要配置多数据源以便在需要时快速切换。在SpringBoot中,要实现多数据源的功能,我们需要通过定义多个数据源并使用@Qualifier
注解来装配不同的Mapper。
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.master", sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterDataSourceConfig {
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "masterSqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(masterDataSource);
return bean.getObject();
}
@Bean(name = "masterTransactionManager")
public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource masterDataSource) {
return new DataSourceTransactionManager(masterDataSource);
}
@Bean(name = "masterSqlSessionTemplate")
public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory masterSqlSessionFactory) throws Exception {
return new SqlSessionTemplate(masterSqlSessionFactory);
}
}
复制代码
在上面的代码中,我们创建了一个MasterDataSourceConfig类,用来配置主数据库的相关应用。其中,我们创建了一个被@Qualifier
注解引用的数据源的bean对象,用于与主Mapper解耦。db1实际上是application.properties
配置文件的一个前缀名。注解@MapperScan(basePackages = "com.example.demo.mapper.master")
和@Bean(name = "masterSqlSessionTemplate")
声明了Mapper对象需要引用主数据源。
从以上例子可以看出,我们还需要为每个不同的数据库配置一个类似的类,以便于不同数据源间的切换。
至此,介绍了如何使用SpringBoot整合Mybatis,并解决了一些常见问题,包括事务管理、分页查询、多数据源配置等等。总之,Mybatis作为一种高效的ORM框架,在很多Web开发项目中都有着重要的作用。而SpringBoot作为现代Java Web应用开发必备的框架,对于整合Mybatis也提供了良好的支持。使用这两者整合Mybatis,可以加快开发速度,同时提供复杂应用所需的稳定环境。