在Spring Boot中整合MyBatis涉及到几个关键步骤,包括添加依赖、配置数据源、配置MyBatis、创建实体类、编写Mapper接口和XML映射文件,以及在服务层使用这些组件。
步骤1:添加依赖
在pom.xml
中添加MyBatis和MyBatis-Spring-Boot-Starter的依赖。MyBatis-Spring-Boot-Starter包含了MyBatis和Spring Boot的整合所需的所有依赖。
<dependencies>
<!-- MyBatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version> <!-- 根据实际情况选择合适的版本 -->
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Spring Boot JPA依赖,如果不需要可以移除 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<scope>provided</scope>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
步骤2:配置数据源
在application.properties
或application.yml
中配置数据源信息。
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
步骤3:配置MyBatis
在Spring Boot的配置文件中,可以配置MyBatis的映射文件位置和其他配置。默认情况下,MyBatis会扫描@MapperScan
标注的包下的接口。
# application.properties
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity
步骤4:创建实体类
创建实体类,这些类通常对应数据库中的表。
package com.example.demo.entity;
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String name;
private String email;
// Getters and Setters
}
步骤5:创建Mapper接口和XML映射文件
创建Mapper接口,它将与XML映射文件关联。
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(Integer id);
}
然后,在resources/mapper
目录下创建相应的XML映射文件。
<!-- resources/mapper/UserMapper.xml -->
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="findById" resultType="com.example.demo.entity.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
步骤6:在服务层使用Mapper
在服务层注入Mapper接口,然后调用其方法。
package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserMapper userMapper;
@Autowired
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User getUserById(Integer id) {
return userMapper.findById(id);
}
}
进阶主题
事务管理
在Spring Boot中,你可以使用@Transactional注解来管理事务。这可以保证一系列数据库操作要么全部成功,要么全部失败。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void createUserAndAddress(User user, Address address) {
userMapper.insertUser(user);
userMapper.insertAddress(address);
}
}
分页查询
MyBatis提供了多种方式进行分页查询,包括使用SQL语句中的LIMIT关键字或MyBatis的插件。
<!-- resources/mapper/UserMapper.xml -->
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="findUsersByPage" parameterType="map" resultType="com.example.demo.entity.User">
SELECT * FROM users LIMIT #{offset}, #{pageSize}
</select>
</mapper>
在服务层调用时,需要传递一个包含分页参数的Map。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> findUsersByPage(int offset, int pageSize) {
Map<String, Object> params = new HashMap<>();
params.put("offset", offset);
params.put("pageSize", pageSize);
return userMapper.findUsersByPage(params);
}
}
缓存策略
MyBatis支持二级缓存,可以在Mapper接口级别开启缓存。
<!-- resources/mapper/UserMapper.xml -->
<mapper namespace="com.example.demo.mapper.UserMapper">
<cache type="org.apache.ibatis.cache.decorators.SynchronizedCache"/>
<select id="findById" resultType="com.example.demo.entity.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
在实体类中,需要覆盖equals
和hashCode
方法,以确保缓存的有效性。
public class User implements Serializable {
// fields...
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
User other = (User) obj;
return Objects.equals(this.id, other.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
单元测试
在Spring Boot中,可以使用Spring Test和Mockito来编写单元测试,以确保MyBatis的正确性和性能。
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTests {
@Autowired
private UserService userService;
@MockBean
private UserMapper userMapper;
@Test
public void testFindUserById() {
User expectedUser = new User();
given(userMapper.findById(1)).willReturn(expectedUser);
User actualUser = userService.getUserById(1);
assertEquals(expectedUser, actualUser);
}
}
总结
Spring Boot与MyBatis的整合可以极大地简化数据库操作的开发流程,同时提供强大的功能,如事务管理、分页查询和缓存策略。通过上述步骤,你可以构建出稳定、高效的数据访问层。然而,对于更复杂的业务需求,可能还需要考虑更高级的功能,如分布式事务、读写分离、数据库连接池优化等,这些都需要根据项目的具体情况进行设计和实现。