Sharding-JDBC 框架集成指南
2025/8/15大约 3 分钟
Sharding-JDBC 框架集成指南
前置知识
在学习本教程前,请确保您已经:
- 掌握 Sharding-JDBC 的基本用法
- 了解 Spring Boot 的核心功能
- 熟悉 MyBatis 的使用方法
Spring Boot 集成
1. 添加依赖
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Sharding-JDBC Spring Boot Starter -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.3.2</version>
</dependency>
<!-- MyBatis Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
2. 配置数据源
spring:
shardingsphere:
mode:
type: Memory
datasource:
names: ds0,ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo_ds_0
username: root
password: root
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo_ds_1
username: root
password: root
3. 启动类配置
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ShardingJdbcDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ShardingJdbcDemoApplication.class, args);
}
}
MyBatis 集成
1. 实体类定义
package com.example.demo.entity;
import lombok.Data;
@Data
public class Order {
private Long orderId;
private Long userId;
private String status;
private LocalDateTime createTime;
}
2. Mapper 接口
package com.example.demo.mapper;
import com.example.demo.entity.Order;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface OrderMapper {
void insert(Order order);
Order findById(Long orderId);
List<Order> findByUserId(Long userId);
}
3. XML 映射文件
<?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.example.demo.mapper.OrderMapper">
<insert id="insert" parameterType="com.example.demo.entity.Order">
INSERT INTO t_order (user_id, status, create_time)
VALUES (#{userId}, #{status}, #{createTime})
</insert>
<select id="findById" resultType="com.example.demo.entity.Order">
SELECT * FROM t_order WHERE order_id = #{orderId}
</select>
<select id="findByUserId" resultType="com.example.demo.entity.Order">
SELECT * FROM t_order WHERE user_id = #{userId}
</select>
</mapper>
JPA 集成
1. 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2. 实体类定义
package com.example.demo.entity;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
@Table(name = "t_order")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderId;
private Long userId;
private String status;
@Column(name = "create_time")
private LocalDateTime createTime;
}
3. Repository 接口
package com.example.demo.repository;
import com.example.demo.entity.Order;
import org.springframework.data.jpa.repository.JpaRepository;
public interface OrderRepository extends JpaRepository<Order, Long> {
List<Order> findByUserId(Long userId);
}
事务管理
1. 注解方式
package com.example.demo.service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Service;
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Transactional
public void createOrder(Order order) {
orderMapper.insert(order);
// 其他业务逻辑
}
}
2. 编程式事务
@Service
public class OrderService {
@Autowired
private TransactionTemplate transactionTemplate;
public void createOrder(Order order) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
orderMapper.insert(order);
// 其他业务逻辑
}
});
}
}
最佳实践
开发规范
DAO 层设计
- 统一命名规范
- 合理使用注解
- 避免复杂 SQL
事务管理
- 合理设置事务边界
- 注意事务传播行为
- 避免事务嵌套
性能优化
连接池配置
- 合理设置连接池大小
- 配置连接超时时间
- 启用连接池监控
SQL优化
- 使用索引
- 避免全表扫描
- 合理使用批处理
常见问题
1. 如何处理分页查询?
分页查询的实现方案:
@Mapper
public interface OrderMapper {
List<Order> findByPage(@Param("offset") int offset, @Param("limit") int limit);
long count();
}
// XML配置
<select id="findByPage" resultType="com.example.demo.entity.Order">
SELECT * FROM t_order LIMIT #{offset}, #{limit}
</select>
<select id="count" resultType="long">
SELECT COUNT(*) FROM t_order
</select>
2. 如何处理复杂查询?
复杂查询的处理方案:
- 使用 MyBatis 动态 SQL
- 合理设计分片策略
- 考虑使用绑定表
- 适当冗余数据
总结
本文详细介绍了 Sharding-JDBC 与主流框架的集成方案:
- ✅ Spring Boot 集成:依赖配置和启动配置
- ✅ MyBatis 集成:实体类、Mapper 和 XML 配置
- ✅ JPA 集成:实体类和 Repository 配置
- ✅ 事务管理:注解方式和编程式事务
- ✅ 最佳实践:开发规范和性能优化
下一步学习
- 学习更多框架集成方案
- 探索性能优化技巧
- 了解分布式场景下的最佳实践
希望这篇文章能帮助您更好地在项目中集成和使用 Sharding-JDBC!如果您有任何问题,欢迎在评论区讨论。