# GyJdbc
**Repository Path**: bigfacecat-zhouning/GyJdbc
## Basic Information
- **Project Name**: GyJdbc
- **Description**: 🔨基于Spring JdbcTemplate的轻量级ORM框架,提供链式SQL构建能力,支持动态查询、多表关联、分页、事务及 SQL/方法/类级别动态数据源切换
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://github.com/SpringStudent/GyJdbc
- **GVP Project**: No
## Statistics
- **Stars**: 8
- **Forks**: 0
- **Created**: 2019-10-22
- **Last Updated**: 2026-08-02
## Categories & Tags
**Categories**: database-dev
**Tags**: None
## README
[English](README.md) | [中文](README_zh.md)
# GyJdbc
> 基于 Spring JdbcTemplate 的轻量级持久层框架:保留 SQL 的表达力,减少 DAO 层样板代码,让 Java 项目更快写出清晰、可维护的数据访问逻辑。
GyJdbc 适合那些不想引入重型 ORM、又不想反复手写 DAO 和 SQL 拼接代码的项目。它在 JdbcTemplate 之上提供了类 JPA 的实体 DAO、链式 SQL 构建器、Lambda 字段引用、Criteria 条件拼装,以及多数据源绑定和负载均衡能力。
## 为什么选择 GyJdbc
- **DAO 层更轻**:通用增删改查、分页、批量操作、SQL 查询等能力由 `EntityDao` 提供,业务 DAO 不再堆重复代码。
- **SQL 仍然可控**:不是把 SQL 藏起来,而是用链式 API 把 SQL 写得更安全、更清楚。
- **接近原生 SQL 的表达力**:支持 `select`、`insert`、`update`、`delete`、`join`、`union`、子查询、分组、排序、分页、聚合函数等大部分 SQL 场景。
- **字段引用更稳**:支持 `TbUser::getName` 这类 Lambda 字段引用,减少字符串字段名带来的拼写风险。
- **动态条件友好**:`Criteria` 支持 `where`、`and`、`or`、`in`、`like`、`between`、嵌套条件、`xxxIfAbsent` 等常用条件拼装。
- **多数据源内置支持**:可以通过注解、DAO 方法绑定指定数据源,也可以按数据源组使用负载均衡策略。
- **学习成本低**:API 贴近 SQL 语义,熟悉 SQL 和 Spring JdbcTemplate 的开发者可以很快上手。
## 适用场景
GyJdbc 很适合:
- Spring / Spring Boot 项目中需要快速实现数据访问层;
- 业务以 SQL 为中心,不希望被复杂 ORM 映射规则束缚;
- 需要动态拼接查询条件、分页、批量操作;
- 需要在主从库、读写库、多个业务库之间灵活切换;
- 希望保留 JdbcTemplate 的简单直接,同时减少重复 DAO 代码。
如果你的项目需要完整的对象关系管理、复杂实体状态跟踪、一级缓存或自动脏检查,Hibernate / JPA 可能更适合。GyJdbc 的定位更直接:让你用更少代码写出更清晰的 SQL 数据访问层。
## 安装
```xml
io.github.springstudent
GyJdbc
12.0.0.RELEASE
```
当前版本基于 Java 8 和 Spring JDBC 4.3.x。
## 快速开始
### 1. 定义实体
使用 `@Table` 声明实体与数据库表的关系,`pk` 指定主键字段。
```java
import com.gysoft.jdbc.annotation.Table;
import java.util.Date;
@Table(name = "tb_user", pk = "id")
public class TbUser {
private String id;
private String name;
private String realName;
private String pwd;
private String email;
private String mobile;
private Date birth;
private Integer age;
private String career;
private Integer isActive = 0;
private Integer roleId;
// getter / setter
}
```
### 2. 定义 DAO
业务 DAO 继承 `EntityDao`,实现类继承 `EntityDaoImpl`。
```java
import com.gysoft.jdbc.dao.EntityDao;
import com.gysoft.jdbc.dao.EntityDaoImpl;
import org.springframework.stereotype.Repository;
public interface TbUserDao extends EntityDao {
}
@Repository
public class TbUserDaoImpl extends EntityDaoImpl implements TbUserDao {
}
```
### 3. 在 Service 中使用
```java
import com.gysoft.jdbc.bean.Criteria;
import com.gysoft.jdbc.bean.Page;
import com.gysoft.jdbc.bean.PageResult;
import com.gysoft.jdbc.bean.SQL;
import java.util.Arrays;
import java.util.List;
public class UserService {
private TbUserDao tbUserDao;
public int createUser(TbUser user) throws Exception {
return tbUserDao.save(user);
}
public List queryActiveUsers() throws Exception {
return tbUserDao.queryWithCriteria(
new Criteria()
.where(TbUser::getIsActive, 1)
.in(TbUser::getName, Arrays.asList("zhouning", "yinhw"))
);
}
public PageResult pageUsers(int pageNo, int pageSize) throws Exception {
return tbUserDao.pageQueryWithCriteria(
new Page(pageNo, pageSize),
new Criteria().where(TbUser::getIsActive, 1)
);
}
public int updateEmail(String name, String email) throws Exception {
return tbUserDao.updateWithSql(
new SQL()
.update(TbUser.class)
.set(TbUser::getEmail, email)
.where(TbUser::getName, name)
);
}
}
```
## EntityDao 常用能力
`EntityDao` 覆盖了多数常见数据访问操作:
```java
int save(T entity) throws Exception;
void batchSave(List list) throws Exception;
void saveOrUpdate(T entity) throws Exception;
int saveAll(List list) throws Exception;
int update(T entity) throws Exception;
void batchUpdate(List list) throws Exception;
int updateWithSql(SQL sql) throws Exception;
int delete(Id id) throws Exception;
int batchDelete(List ids) throws Exception;
int deleteWithCriteria(Criteria criteria) throws Exception;
int deleteWithSql(SQL sql) throws Exception;
T queryOne(Id id) throws Exception;
T queryOne(Criteria criteria) throws Exception;
List queryAll() throws Exception;
List queryWithCriteria(Criteria criteria) throws Exception;
PageResult pageQuery(Page page) throws Exception;
PageResult pageQueryWithCriteria(Page page, Criteria criteria) throws Exception;
Result queryWithSql(Class type, SQL sql) throws Exception;
List