.. juice documentation master file, created by sphinx-quickstart on Sat Nov 5 19:15:50 2022. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Juice 简介 ============================== juice 是一个基于 golang 的 sql mapper 框架,它的目标是提供一个简单易用的 sql mapper 框架,让开发者可以更专注于业务逻辑的开发。 如果你是一个 golang 开发者,或者你正在寻找一个简单易用的 sql mapper 框架,那么 juice 可能是你的不二之选。 项目主页 ------------------------------ https://github.com/go-juicedev/juice **文档链接** - 简体中文: https://juice-doc.readthedocs.io/en/latest/ - English: https://juice-doc.readthedocs.io/projects/juice-doc-en/en/latest/ 为什么选择 Juice ------------------------------ 设计理念 ~~~~~~~~~~~~~~ Juice 的设计遵循以下核心理念: - **简单优于复杂**:API 设计简洁直观,学习曲线平缓 - **显式优于隐式**:SQL 语句清晰可见,行为可预测 - **性能至上**:零依赖、对象池、预分配等多重优化 - **类型安全**:充分利用 Go 泛型,编译期类型检查 - **可扩展性**:中间件机制支持灵活扩展 与其他框架对比 ~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 :widths: 20 15 15 15 15 20 * - 特性 - Juice - GORM - sqlx - ent - 说明 * - 零依赖 - ✅ - ❌ - ❌ - ❌ - 仅依赖 Go 标准库 * - 动态 SQL - ✅ - 部分 - ❌ - ❌ - 完整的 MyBatis 风格动态 SQL * - 泛型支持 - ✅ - ❌ - ❌ - ✅ - Go 泛型 * - SQL 可见性 - ✅ - ❌ - ✅ - ❌ - SQL 语句集中管理 * - 学习成本 - 低 - 中 - 低 - 高 - 类 MyBatis 设计 * - 性能 - 🚀 优秀 - 良好 - 🚀 优秀 - 良好 - 接近原生 database/sql * - 代码生成 - ✅ - ✅ - ❌ - ✅ - 可选的代码生成工具 * - 中间件 - ✅ - ✅ - ❌ - ✅ - 灵活的拦截器机制 适用场景 ~~~~~~~~~~~~~~ Juice 特别适合以下场景: ✅ **复杂查询场景** - 需要编写复杂的 SQL 查询 - 需要动态构建查询条件 - 需要精确控制 SQL 执行 ✅ **高性能要求** - 对性能有严格要求的应用 - 高并发场景 - 需要接近原生性能的场景 ✅ **团队协作** - DBA 和开发人员分工明确 - SQL 需要集中管理和审查 - 需要 SQL 版本控制 ✅ **微服务架构** - 轻量级,适合容器化部署 - 零依赖,减少供应链风险 - 启动快速,资源占用少 ❌ **不太适合的场景** - 简单 CRUD 为主的应用(GORM 可能更合适) - 需要自动迁移的场景(ent 可能更合适) - 不熟悉 SQL 的团队 特性 ------------------------------ - 🚀 **轻量级,高性能,无第三方依赖** 仅依赖 Go 标准库,二进制体积小,启动快速 - 🔧 **动态 SQL 支持,灵活构建复杂查询** 完整支持 if、where、set、foreach、choose 等动态标签 - 🗄️ **支持多数据源,主从数据库切换** 轻松实现读写分离和多数据源管理 - 🎯 **泛型结果集映射,类型安全** 充分利用 Go 泛型特性,编译期类型检查 - 🔗 **中间件机制,可扩展架构** 内置调试、超时中间件,支持自定义扩展 - 📝 **自定义表达式和函数** 支持在动态 SQL 中使用自定义函数和表达式 - 🛠️ **代码生成工具** 可选的代码生成工具,提升开发效率 - 🔒 **事务管理** 简洁的事务 API,支持事务复用语义与隔离级别控制 - 🔍 **SQL 调试和性能监控** 内置 SQL 日志和执行时间统计 - 📊 **多种数据库支持** MySQL, PostgreSQL, SQLite, Oracle 等主流数据库 - 🔧 **连接池管理** 灵活的连接池配置,优化资源使用 性能特性 ~~~~~~~~~~~~~~ Juice 在设计时特别注重性能优化: **零依赖设计** - 仅依赖 Go 标准库 - 减少依赖链,降低风险 - 二进制体积更小 **对象池优化** - 使用 sync.Pool 复用 strings.Builder - 减少内存分配和 GC 压力 - 提升高并发场景性能 **预分配策略** - 切片容量预分配 - 字符串构建器容量预估 - 减少内存重新分配 **智能缓存** - 预编译语句缓存 - 反射结果缓存 - 表达式编译缓存 **批量优化** - 智能批次处理 - 预编译语句复用 - 减少数据库往返 安装 ------------------------------ **版本要求** - go 1.25+ .. code-block:: bash go get -u github.com/go-juicedev/juice 快速开始 ------------------------------ 1. 编写sql mapper配置文件 .. code-block:: html root:qwe123@tcp(localhost:3306)/database mysql .. attention:: 注意:`dataSource` 的格式跟用 `sql.Open()` 函数的格式相同。 2. 编写代码 .. code-block:: go package main import ( "context" "fmt" "github.com/go-juicedev/juice" _ "github.com/go-sql-driver/mysql" ) func HelloWorld() {} func main() { cfg, err := juice.NewXMLConfiguration("config.xml") if err != nil { fmt.Println(err) return } engine, err := juice.Default(cfg) if err != nil { fmt.Println(err) return } defer engine.Close() message, err := juice.NewGenericManager[string](engine).Object(HelloWorld).QueryContext(context.Background(), nil) if err != nil { fmt.Println(err) return } fmt.Println(message) } .. attention:: 注意:虽然 `juice` 不依赖第三方库,但是它需要依赖数据库驱动,所以在使用 juice 之前,你需要先安装数据库驱动,比如要使用mysql, 那么你需要先安装 `github.com/go-sql-driver/mysql` 如果运行报错,那么可能是因为你的数据库没有启动,或者你的数据库配置有误,检查一下数据库配置是否正确。 3. 运行代码 .. code-block:: bash go run . 4. 输出结果 .. code-block:: bash [juice] 2022/11/05 19:56:49 [main.HelloWorld] select "hello world" as message [] 5.3138ms hello world 如果你看到了上面的输出结果,那么恭喜你,你已经成功运行了 juice。 更多示例 ------------------------------ 用户查询示例 ~~~~~~~~~~~~~~ **配置文件 (user_mapper.xml)** .. code-block:: text INSERT INTO users (name, email, age) VALUES (#{user.name}, #{user.email}, #{user.age}) UPDATE users name = #{name}, email = #{email}, age = #{age}, WHERE id = #{id} **Go 代码** .. code-block:: go package repository import ( "context" "github.com/go-juicedev/juice" ) type User struct { ID int64 `column:"id"` Name string `column:"name"` Email string `column:"email"` Age int `column:"age"` CreatedAt string `column:"created_at"` } type UserRepository interface { GetUserByID(ctx context.Context, id int64) (*User, error) SearchUsers(ctx context.Context, name string, minAge, maxAge int) ([]*User, error) BatchInsertUsers(ctx context.Context, users []*User) error UpdateUser(ctx context.Context, id int64, name, email string, age int) error } type userRepositoryImpl struct { engine juice.Manager } func NewUserRepository(engine juice.Manager) UserRepository { return &userRepositoryImpl{engine: engine} } func (r *userRepositoryImpl) GetUserByID(ctx context.Context, id int64) (*User, error) { params := juice.H{"id": id} return juice.NewGenericManager[*User](r.engine). Object(r.GetUserByID). QueryContext(ctx, params) } func (r *userRepositoryImpl) SearchUsers(ctx context.Context, name string, minAge, maxAge int) ([]*User, error) { params := juice.H{ "name": name, "minAge": minAge, "maxAge": maxAge, } return juice.NewGenericManager[[]*User](r.engine). Object(r.SearchUsers). QueryContext(ctx, params) } func (r *userRepositoryImpl) BatchInsertUsers(ctx context.Context, users []*User) error { params := juice.H{"users": users} _, err := r.engine.Object(r.BatchInsertUsers).ExecContext(ctx, params) return err } func (r *userRepositoryImpl) UpdateUser(ctx context.Context, id int64, name, email string, age int) error { params := juice.H{ "id": id, "name": name, "email": email, "age": age, } _, err := r.engine.Object(r.UpdateUser).ExecContext(ctx, params) return err } 常见问题 ------------------------------ **Q: Juice 和 MyBatis 有什么区别?** A: Juice 借鉴了 MyBatis 的设计理念,但针对 Go 语言特性进行了优化: - 充分利用 Go 泛型,提供类型安全的 API - 零依赖设计,更轻量 - 更符合 Go 语言习惯 **Q: 为什么选择 XML 而不是注解?** A: Go 语言不支持注解,XML 配置有以下优势: - SQL 集中管理,便于审查和版本控制 - DBA 可以独立优化 SQL - 支持复杂的动态 SQL - IDE 插件支持(语法高亮、自动完成) **Q: Juice 的性能如何?** A: Juice 的性能接近原生 database/sql: - 零依赖,无额外开销 - 对象池优化,减少 GC 压力 - 预分配策略,减少内存分配 **Q: 如何调试 SQL 语句?** A: Juice 提供了多种调试方式: - 使用 DebugMiddleware 打印 SQL 和参数 - 在配置中启用 debug 模式 - 使用 IDEA 插件查看 SQL - 查看生成的 SQL 日志 **Q: 支持哪些数据库?** A: Juice 支持所有 database/sql 兼容的数据库: - MySQL / MariaDB - PostgreSQL - SQLite - Oracle - SQL Server - 其他支持 database/sql 的数据库 社区与支持 ------------------------------ **获取帮助** - GitHub Issues: https://github.com/go-juicedev/juice/issues - 文档: https://juice-doc.readthedocs.io/ - 示例代码: https://github.com/go-juicedev/juice/tree/main/examples **贡献代码** 欢迎提交 Pull Request 和 Issue! **IDEA 插件** 安装 Juice 插件获得更好的开发体验: - 语法高亮 - 自动完成 - SQL 导航 - 错误检查 插件地址: https://plugins.jetbrains.com/plugin/26401-juice 详细文档 ------------------------------ .. toctree:: :maxdepth: 2 :caption: 核心功能 configuration mappers security result_mapping tx tx_semantics multi_source_tx dynamic_sql expr raw_sql middleware .. toctree:: :maxdepth: 2 :caption: 高级功能 e2e_best_practice code_generate extension idea-plugin .. toctree:: :maxdepth: 2 :caption: 其他 eatmoreapple