{"id":24229481,"url":"https://github.com/zhuyb0614/graph-batis","last_synced_at":"2025-09-22T21:31:16.712Z","repository":{"id":40998986,"uuid":"260429342","full_name":"zhuyb0614/graph-batis","owner":"zhuyb0614","description":"GraphQL\u0026Mybatis的绝妙搭配","archived":false,"fork":false,"pushed_at":"2023-06-14T22:37:09.000Z","size":566,"stargazers_count":8,"open_issues_count":3,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2023-07-28T10:29:55.682Z","etag":null,"topics":["database-access","graphql","graphql-java","mybatis"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhuyb0614.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-05-01T10:10:12.000Z","updated_at":"2023-03-29T07:37:02.000Z","dependencies_parsed_at":"2022-08-27T08:21:55.679Z","dependency_job_id":null,"html_url":"https://github.com/zhuyb0614/graph-batis","commit_stats":null,"previous_names":[],"tags_count":1,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhuyb0614%2Fgraph-batis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhuyb0614%2Fgraph-batis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhuyb0614%2Fgraph-batis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhuyb0614%2Fgraph-batis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhuyb0614","download_url":"https://codeload.github.com/zhuyb0614/graph-batis/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":233891808,"owners_count":18746503,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database-access","graphql","graphql-java","mybatis"],"created_at":"2025-01-14T12:19:30.505Z","updated_at":"2025-09-22T21:31:11.359Z","avatar_url":"https://github.com/zhuyb0614.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# graph-batis 不是一个框架,而是一种开发模式\nGraphQL\u0026amp;Mybatis的绝妙搭配\n* [GraphQL 中文文档](https://graphql.cn/)\n\n## 场景痛点还原\n\n针对一些后台,我们可能需要很多列表.\n\n比如下面几个\n\n| 教师名 | 所授科目 |\n| ------ | -------- |\n| 老唐   | 政治     |\n| 老朱   | 音乐     |\n\n| 学生名 | 班级     |\n| ------ | -------- |\n| 老孙   | 高三一班 |\n| 老猪   | 高三一班 |\n| 老沙   | 高三一班 |\n\n| 班级     | 教师 | 学生 |\n| -------- | ---- | ---- |\n| 高三一班 | 老唐 | 老孙 |\n| 高三一班 | 老唐 | 老猪 |\n| 高三一班 | 老唐 | 老沙 |\n\n| 班级     | 教师 | 科目 |\n| -------- | ---- | ---- |\n| 高三一班 | 老唐 | 政治 |\n| 高三一班 | 老朱 | 音乐 |\n\n还有其他等等类型的查询\n\n小白:这么多列表,我们需要根据每个列表都写一个SQL吗?\n\n大佬:是的,每个列表我们都需要都写一个单独的SQL.要查询最少的数据,减少数据库压力.\n\n小白:写很多SQL好麻烦,占用了我很多开发时间,牺牲一下数据库,我写一个大SQL把所有数据都查出来吧?\n\n大佬:你这样有点缺少职业道德啊.\n\n小白:那让我怎么办?能不能写的又快,又能兼顾让数据库压力小一些?不想加班啊大哥.\n\n大佬:如果你能知道前端要什么数据,可不可以只查他要的数据呢?我了解GraghQL是可以把前端要的数据结构告诉后端的.我们写一个过滤器把不要的字段都去掉,不就行了!\n\n小白:完美!\n\n## 性能优势\n* 通过GraphQL前端可以向后台发送自己想要的数据结构,知道了前端具体要什么数据,我们就可以根据前端需要的结构查询最少的数据,减轻DB压力.\n## 开发优势\n* 开发时可以将所有(夸张比喻)关联关系的表统统写一个SQL里,graph-batis-core中的*CleanSqlInterceptor*,将根据前端发送的数据结构,将不需要的查询字段和表剔出.一次编写,处处使用!\n## 效果演示\n\n以下样例都只通过org.zhuyb.graphbatis.mapper.RoomDao#findAll方法定义的如下SQL,自动精简后查询.无需多次编写关联关系\n\n```sql\nSELECT\n   st.student_name,\n   st.student_id,\n   su.subject_id,\n   su.subject_name,\n   t.teacher_id,\n   t.teacher_name,\n   r.room_id,\n   r.room_name\nFROM\n   t_room AS r\nJOIN t_teacher_room AS tr ON tr.room_id = r.room_id\nJOIN t_student AS st ON st.room_id = r.room_id\nJOIN t_teacher AS t ON t.teacher_id = tr.teacher_id\nJOIN t_subject AS su ON su.subject_id = t.subject_id\n```\n\n进入graph-batis-example目录执行 mvn spring-boot:run启动服务后,打开下方链接打开graphiql\nhttp://localhost:8080/graphiql?query=%7B%0A%20%20findRooms%20%7B%0A%20%20%20%20roomId%0A%20%20%20%20roomName%0A%20%20%20%20teachers%7B%0A%20%20%20%20%20%20teacherName%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A\n\n\n\n\n![](./img/graphiQLV2.png)\n\n实际执行SQL\n\n```sql\nSELECT\n   t.teacher_id,\n   t.teacher_name,\n   r.room_id,\n   r.room_name\nFROM\n   t_room AS r\nJOIN t_teacher_room AS tr ON tr.room_id = r.room_id\nJOIN t_teacher AS t ON t.teacher_id = tr.teacher_id\n```\n\n\n\nhttp://localhost:8080/graphiql?query=%7B%0A%20%20findRooms%20%7B%0A%20%20%20%20roomId%0A%20%20%20%20roomName%0A%20%20%20%20students%7B%0A%20%20%20%20%20%20studentId%0A%20%20%20%20%20%20studentName%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A\n\n![](./img/graphiQL2V2.png)\n\n实际执行SQL\n\n```sql\nSELECT\n   st.student_name,\n   st.student_id,\n   r.room_id,\n   r.room_name\nFROM\n   t_room AS r\nJOIN t_student AS st ON st.room_id = r.room_id\n```\n\n\n\n## 启动引导\n\n### 目录介绍\n\n|-- graph-batis-core (Mybatis interceptor包,实际项目引用依赖)\n|-- graph-batis-dependencies (Maven dependencyManagement依赖包版本约束)\n|-- graph-batis-example (示例项目)\n|   |-- graph-batis-example-core (DAO层接口定义)\n|   |-- graph-batis-example-jooq (DAO层JOOQ实现示例)\n|   |-- graph-batis-example-mybatis (DAO层MyBatis实现示例)\n|-- graph-batis-generator (代码生成器)\n\n### 运行环境\n\n1. jdk1.8+\n2. mysql5.7+\n\n### 启动流程(以graph-batis-example-mybatis演示)\n\n打开application.properties修改spring.datasource各配置为本地数据库连接配置,项目已接入flayway无需手动初始化数据库数据.\n\n直接main方法启动或者在graph-batis-example-mybatis目录下使用maven命令mvn sprintboot:run启动都可以.\n\n首次正常启动后可以看到数据库中已经初始化数据.\n\n启动成功后日志将打印graphiql和voyager路径如下\n\n[Graphiql URL http://127.0.0.1:8080/graphiql] \n\n[Voyager URL http://127.0.0.1:8080/voyager] \n\n## TODO\n\n- [x]  代码生成器提供\n- [x]  去除VO,使其符合GraphQL规范\n- [x]  查询缓存\n- [x]  向上抽取抽象,使其通用化不局限GraphQL\n- [x]  接入JOOQ\n- [x]  扁平化查询\n- [ ]  提供Client\n- [ ]  接入Hibernate\n- [ ]  JDBC方式SQL改写\n- [ ]  中间表voyager\n- [ ]  分页\n- [ ]  复杂条件查询\n\n## MyBatis,JOOQ,Hibernate优缺点对比\n### MyBatis\n#### 优势\n1. 对象映射,通过collection,association标签可以很直观的映射关联关系\n2. SQL缓存,因为我们是直接解析的SQL所以很容易缓存固定的查询条件SQL\n\n#### 劣势\n\n1. 直接解析SQL无官方API\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhuyb0614%2Fgraph-batis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhuyb0614%2Fgraph-batis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhuyb0614%2Fgraph-batis/lists"}