Springboot 整合mybatis 实战详解

在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.propertiesapplication.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>

在实体类中,需要覆盖equalshashCode方法,以确保缓存的有效性。

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的整合可以极大地简化数据库操作的开发流程,同时提供强大的功能,如事务管理、分页查询和缓存策略。通过上述步骤,你可以构建出稳定、高效的数据访问层。然而,对于更复杂的业务需求,可能还需要考虑更高级的功能,如分布式事务、读写分离、数据库连接池优化等,这些都需要根据项目的具体情况进行设计和实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值