經過多年生產環境打磨,spring-mysqlclient 正式開源發布。這是一個專注於 MySQL 場景的輕量級數據訪問庫,在 Spring 生態中提供比 MyBatis 更簡潔、比 JdbcTemplate 更強大的體驗,核心特性包括動態 SQL 模板、自動分頁、讀寫分離路由、類型安全構建器等。
io.github.risedragon:spring-mysqlclient:1.0.0 (假設)| 維度 | 設計選擇 | 理由 |
|---|---|---|
| 專注 MySQL | 不支援多數據庫方言 | 利用 MySQL 獨特特性 (JSON、CTE、Hint、分區表) 發揮極致性能 |
| 輕量級 | 核心依賴 < 200KB,零第三方強依賴 | 啟動快、內存佔用低、適合微服務/Serverless |
| 類型安全 | 構建器模式 + Lambda 表達式 | 編譯期發現錯誤,重構友好,告別字符串拼接 |
| 約定優於配置 | 實體類註解映射,無 XML | 減少樣板代碼,領域模型貧血化 |
| Spring 原生整合 | Starter 自動配置、Bean 管理、事務傳播 | 零侵入接入 Spring Boot 生態 |
@Repository
public interface UserRepository extends MysqlClientRepository<User, Long> {
// 方法名解析 + 註解 SQL 模板
@Select("""
SELECT * FROM `user`
WHERE 1=1
#if(:name) AND `name` LIKE CONCAT('%', :name, '%') #end
#if(:status) AND `status` = :status #end
ORDER BY `create_time` DESC
""")
Page<User> findByCondition(@Param("name") String name,
@Param("status") Integer status,
Pageable pageable);
}
#if(...)、#else、#foreach、#include 完整控制流List<User> users = mysqlClient.selectFrom(User.class)
.where(User::getName, like("%張%"))
.and(User::getStatus, eq(1))
.or(User::getEmail, isNotNull())
.orderByDesc(User::getCreateTime)
.limit(10)
.fetch();
User::getName 映射列名,重構安全eq/ne/gt/lt/ge/le/like/in/between/isNull// 只需傳入 Pageable,自動拼接 LIMIT/OFFSET 並執行 COUNT
Page<User> page = repository.findByCondition("張", 1, PageRequest.of(0, 20));
// 高性能優化:COUNT 查詢自動去除 ORDER BY、JOIN、SELECT 列
// 原查詢:SELECT * FROM user WHERE ... ORDER BY create_time DESC
// Count 查詢:SELECT COUNT(1) FROM user WHERE ...
@Configuration
public class DataSourceConfig {
@Bean
@Primary
@ConfigurationProperties("spring.mysqlclient.master")
DataSource masterDataSource() { return DataSourceBuilder.create().build(); }
@Bean
@ConfigurationProperties("spring.mysqlclient.slave")
DataSource slaveDataSource() { return DataSourceBuilder.create().build(); }
}
// 使用
@Transactional(readOnly = true) // 自動路由到 Slave
public List<User> findAll() { ... }
@ReadOnly // 顯式註解路由 Slave
public User getById(Long id) { ... }
@WriteRouting // 強制路由 Master
public void insertBatch(List<User> users) { ... }
// 批量插入 (自動分批、參數佔位符優化)
mysqlClient.batchInsert(users, 1000); // 每批 1000 條
// Upsert:主鍵/唯一鍵衝突時更新
mysqlClient.upsert(user)
.onDuplicateKeyUpdate(User::getName, User::getEmail)
.execute();
@Table("order")
class Order {
@Id Long id;
@Column("ext_info") // JSON 類型列
JSONObject extInfo; // 自動序列化/反序列化
}
// 查詢 JSON 字段
List<Order> orders = mysqlClient.selectFrom(Order.class)
.whereJsonContains("ext_info", "$.tags", "促銷")
.fetch();
<!-- Spring Boot 2.7+ / 3.x -->
<dependency>
<groupId>io.github.risedragon</groupId>
<artifactId>spring-mysqlclient-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
spring:
mysqlclient:
master:
url: jdbc:mysql://master:3306/mydb?useUnicode=true&characterEncoding=utf8
username: root
password: 123456
slave:
url: jdbc:mysql://slave1:3306/mydb,slave2:3306/mydb
username: reader
password: 123456
# 分頁默認配置
page:
default-size: 20
max-size: 100
| 特性 | spring-mysqlclient | MyBatis | JdbcTemplate | JPA/Hibernate |
|---|---|---|---|---|
| 學習曲線 | 低 (註解+構建器) | 中 (XML/註解映射) | 低 | 高 (實體映射/狀態管理) |
| 動態 SQL | 模板引擎 + 構建器 | OGNL/XML 標籤 | 手動拼接 | Criteria/JPQL |
| 類型安全 | 高 (方法引用) | 低 (字符串鍵) | 無 | 高 (實體屬性) |
| 分頁支援 | 自動物理分頁 | 插件/手動 | 手動 | Pageable 原生 |
| 讀寫分離 | 註解/事務自動路由 | 插件/手動 | 手動 | 需額外配置 |
| JSON 支援 | 原生映射/查詢 | 需 TypeHandler | 手動 | AttributeConverter |
| 啟動速度 | 極快 (無掃描) | 中 (Mapper 掃描) | 快 | 慢 (元數據構建) |
「不造輪子,只磨利刃。」spring-mysqlclient 致力於成為 MySQL 專屬場景下最銳利的數據訪問利器。