{"id":37020953,"url":"https://github.com/lightbatis/lightbatis","last_synced_at":"2026-01-14T02:27:30.727Z","repository":{"id":36564685,"uuid":"224137061","full_name":"lightbatis/lightbatis","owner":"lightbatis","description":"Lightbatis 增强 MyBatis 版Java 数据库持久层，更简洁并易用","archived":false,"fork":false,"pushed_at":"2023-06-14T22:31:48.000Z","size":7067,"stargazers_count":50,"open_issues_count":9,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-13T22:12:19.712Z","etag":null,"topics":["jdbc-orm-framework","mybatis","mybatis-generator","mybatis-springboot","mybatis3"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lightbatis.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-11-26T08:11:38.000Z","updated_at":"2024-04-19T02:00:04.000Z","dependencies_parsed_at":"2023-01-17T02:45:38.352Z","dependency_job_id":null,"html_url":"https://github.com/lightbatis/lightbatis","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lightbatis/lightbatis","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightbatis%2Flightbatis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightbatis%2Flightbatis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightbatis%2Flightbatis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightbatis%2Flightbatis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lightbatis","download_url":"https://codeload.github.com/lightbatis/lightbatis/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightbatis%2Flightbatis/sbom","scorecard":{"id":589051,"data":{"date":"2025-08-11","repo":{"name":"github.com/lightbatis/lightbatis","commit":"a4a144c99af6e2ca5b98c0f06373d97600372c5f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"21 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-5mg8-w23w-74h3","Warn: Project is vulnerable to: GHSA-7g45-4rm6-3mm3","Warn: Project is vulnerable to: GHSA-q446-82vq-w674","Warn: Project is vulnerable to: GHSA-6phf-73q6-gh87","Warn: Project is vulnerable to: GHSA-wxr5-93ph-8wr9","Warn: Project is vulnerable to: GHSA-6hgm-866r-3cjv","Warn: Project is vulnerable to: GHSA-fjq5-5j5f-mvxh","Warn: Project is vulnerable to: GHSA-3832-9276-x7gf","Warn: Project is vulnerable to: GHSA-78wr-2p64-hpwj","Warn: Project is vulnerable to: GHSA-gwrp-pvrq-jmwv","Warn: Project is vulnerable to: GHSA-j288-q9x7-2f5v","Warn: Project is vulnerable to: GHSA-6pcc-3rfx-4gpm","Warn: Project is vulnerable to: GHSA-hwj3-m3p6-hj38","Warn: Project is vulnerable to: GHSA-rhgr-952r-6p8q","Warn: Project is vulnerable to: GHSA-2f88-5hg8-9x2x","Warn: Project is vulnerable to: GHSA-5ggr-mpgw-3mgx","Warn: Project is vulnerable to: GHSA-7jw3-5q4w-89qg","Warn: Project is vulnerable to: GHSA-9848-v244-962p","Warn: Project is vulnerable to: GHSA-cvvx-r33m-v7pq","Warn: Project is vulnerable to: GHSA-59j4-wjwp-mw9m","Warn: Project is vulnerable to: GHSA-fh63-4r66-jc7v"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T21:21:41.822Z","repository_id":36564685,"created_at":"2025-08-20T21:21:41.823Z","updated_at":"2025-08-20T21:21:41.823Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["jdbc-orm-framework","mybatis","mybatis-generator","mybatis-springboot","mybatis3"],"created_at":"2026-01-14T02:27:30.010Z","updated_at":"2026-01-14T02:27:30.720Z","avatar_url":"https://github.com/lightbatis.png","language":"Java","readme":"```\n█████████████████████████████████████  \n█████████████████████████████████████  \n████ ▄▄▄▄▄ █▀█ █▄▄▀▀ ▀▄█ █ ▄▄▄▄▄ ████  \n████ █   █ █▀▀▀█ ▀▀ ████▄█ █   █ ████  \n████ █▄▄▄█ █▀ █▀▀▄▀▀▄ ▀█ █ █▄▄▄█ ████  \n████▄▄▄▄▄▄▄█▄▀ ▀▄█▄▀▄█ ▀ █▄▄▄▄▄▄▄████  \n████ ▄ ▄ ▀▄  ▄▀▄▀▄ █ █▀ █ ▀ ▀▄█▄▀████  \n████▄ ▄   ▄▄██▄█▀▄  ▄▄▀█ ▄▀  ▀█▀█████  \n████ ▀▄▄█ ▄▄▄ ▄█▄▄▀▄▄█▀ ▀▀▀▀▀▄▄█▀████  \n█████ ▀ ▄ ▄▄█▀  ▄██ █▄▄▀  ▄ ▀▄▄▀█████  \n████▀▄  ▄▀▄▄█▄▀▄▀█▄▀▀ ▄ ▀▀▀ ▀▄ █▀████  \n████ ██▄▄▄▄█▀▄▀█▀█▀▄▀█ ▀▄▄█▀██▄▀█████  \n████▄███▄█▄█▀▄ █▄▀▄▄▀▄██ ▄▄▄ ▀   ████  \n████ ▄▄▄▄▄ █▄█▄ ▄▄  ██▄  █▄█ ▄▄▀█████  \n████ █   █ █ ▀█▄ ▀ ▄▄▀▀█ ▄▄▄▄▀ ▀ ████  \n████ █▄▄▄█ █ ▄▀███▀▄▄▄▄▄ █▄▀  ▄ █████  \n████▄▄▄▄▄▄▄█▄███▄█▄▄▄▄▄██▄█▄▄▄▄██████  \n█████████████████████████████████████  \n█████████████████████████████████████ \n``` \n# Lightbatis 是什么 ?\n\n    lightbatis 是基于约定的命名规范和类型规范在 Mybatis 的基础上开发的，快速的、简洁的数据持久层工具包。\n\n# 为什么会有 Lightbatis ?\n传统的基于 Mybatis 的数据持久层，有以下的规律，先定义实体类，实体类有三分部分组成，XML 定义， Entity Bean 和表结构，如下图：  \n![关系图](./doc/6.jpeg)  \n进行数据访问的操作，也有三部分组成， Mapper XML 定义，Mapper 接口定义， Mapper 接口的实现，如下图：  \n![关系图](./doc/7.jpeg)    \n其流程是，定义XML，Entity, 定义接口，实现接口，如下图：  \n![关系图](./doc/8.jpeg)  \n\n我们真实需要什么呢？ 其实无非我们需要一个\"存数据的地方\" 和一个\"访问数据的方法\"，如下图：\n\n![关系图](./doc/12.jpeg)  \n\n我们希望我们的程序员更多关注在数据库设计、应用设计和架构设计上，为应用创造更多价值，少去做重复的工作，生活其实可以更美好，我们大胆地去掉了XML,和接口实现这两步，使用 Proxy 去代理，于是就有了以下：  \n\n![关系图](./doc/13.jpeg)  \n之前是这样的：  \n![关系图](./doc/17.jpeg)\n\n去掉 XML的定义 和 实现后，是这样的，如下图只有 Entity 和接口 ：  \n  \n![关系图](./doc/18.jpg)  \n\n# lightbatis 的设计理念是什么?\n    命名规范和类型规范\n## 什么是类型规范的编程\n在使用 MyBatis 时已经使用了类型规范，基于类型的不同，便执行不同的操作，如 MyBatis 的 Mapper 方法中，如果方法参数是 ```org.apache.ibatis.session.RowBounds``` 类型，MyBatis 在执行过程中便自动执行逻辑分页的操作，这里就是使用不同的类型，执行不同的操作，在这里 数据类型也是一种规范，也是一种标记。**我们放大了这种操作，让他在更多的地方出现**，于是就有了 Lightbatis。            \n如以下方法的定义：\n```java\n/**\n* 根据参数 id 获取单个 Member 对象。\n* 相当于执行的SQL 是 select * from member where id = ?\n*/\nMember getMember(Long id);\n```\n从以上方法的定义中，我们分析可知：方法的参数``` Long id ``` 可以表达这几个意思。1、参数的类型 Long。 2、 参数的名称 id。 3、 参数的值。   \n如果我们做以下约定：1、参数类型是 Long 类型，只能出现在查询条件里。 2、参数名称 id 等于数据库列名称。 3、参数的值等于本次查询的约束条件。如果本次操作 id 输入值是 5，那么可以表达的意思是 ``` id = 5 ```  \n基于此我们可以把返回值、查询条件、排序条件、分页条件等都定义起来。使用程序员最熟悉的方法来定义方法。  \n\n![基于类型规范的编程](./lightbatis-types.png)  \n\n# Lightbats 的使用步骤是什么？\n    1. 根据规范定义接口。\n    2. 使用接口。\n    \n## 关于表 -\u003e 实体类 -\u003e Mapper 之间的关联关系  \n在日常的数据库访问的操作中，我们经常遇到三个对象，分别是： 数据库表、实体类、 数据访问的 Mapper 类，以下图：  \n![关系图](./doc/lightbatis_members.png)  \n\n图中：1处的表结构中的列名 kind_id , 第2处的实体类Member 的属性 kindId 是通过驼峰命名转化过来的，同时@Column 的注释也指定了列名为 kind_id, 第3处的 listMemberByKindId 方法中的参数 kindId 与 Member 类的属性 kindId 同名且同类型。  \n由此他们三者之间存在着一系列的关联关系。我们就是把这种关联关系通过规范规定下来，形成默认的开发规则，基于这种常见的规则，便形成了统一数据访问的应用工具。\n    \n通过分析我们得到以下结论：  \n    **基于驼峰命名的规范通过属性、参数的名称形成表、实体类、Mapper 之间的关联关系。** 以上图为例\n    3处的 listMemberByKindId 方法 {kindId 参数} = {Member 属性 kindId} = {member 表 kind_id 列}。\n\nMapper 的执行过程 \n\n![类型的约定](./doc/mapper_invoke.png)  \n\n代码：\n``` List\u003cMember\u003e listMemberByKindId(Short kindId)``` 所表达的意思就是\n``` select * from member where kind_id = ? ``` 其中 kind_id = kindId, kindId 的值就是方法中 kindId 的值。基于此我们可以做以下的约定：  \n\n\n一、**SQL 查询条件约定**  \n    a) 简单类型  \n        1. 作用在 Mapper 方法的参数上.     \n        2. 类型为Java 的普通类型。（int,long,Integer,Long,String,Date等）   \n        3. 参数的名称与实体类的属性名称相同。  \n    b) 指定类型  \n        1. 作用在 Mapper 方法的参数上  \n        2. 类型为 com.querydsl.core.types.Predicate 如： ``` member.id.gt(1L).and(member.memberName.like(\"%慧慧慧%\")) ```  \n    c) 混合类型  \n        1. 作用在 Mapper 方法的参数上  \n        2. 可以是以上 a,b 两处的参数。  \n         \n二、 **SQL 查询字段约定**  \n    类型为 com.querydsl.core.types.Path 的方法参数\n\n三、 **SQL 排序字段约定**  \n     类型为 com.querydsl.core.types.OrderSpecifier 的方法参数\n\n# lightbatis 执行过程全貌  \n\n![约定总结](./lightbatis.png)  \n\n\n# 使用 Lightbatis, 使用 Maven 加入以下配置\n```mxml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.github.lightbatis\u003c/groupId\u003e\n  \u003cartifactId\u003elightbatis-core\u003c/artifactId\u003e\n  \u003cversion\u003e1.0.11-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n```\n如果使用控制台，加入以下配置\n```mxml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.github.lightbatis\u003c/groupId\u003e\n  \u003cartifactId\u003elightbatis-web\u003c/artifactId\u003e\n  \u003cversion\u003e1.0.11-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n\n# Mapper 的定义\n1. 定义你自己的 Mapper 的接口 并且 扩展 LightbatisMapper 接口。\n2. Mapper 接口必须指定泛型类型为本接口要操作的实体类。\n3. LightbatisMapper 接口默认有以下几个方法：\n\n# Entity 的定义 \n\n\n\nMapper 的定义示例：\n```java\n\n/**\n * MemberMapper 企业表 Mapper\n */\npublic interface MemberMapper extends LightbatisMapper\u003cMember\u003e {\n\n    /**\n     * 根据企业ID 获取指定的一条企业数据。\n     * 相当于执行了SQL语句：select * from member where id = ?\n     * @param id\n     * @return\n     */\n    Member getMember(Long id);\n\n    /**\n     * 根据 kindId 获取指定类型的企业。\n     * 相当于执行了SQL语句: select * from member where kind_id = ?\n     * @param kindId\n     * @return\n     */\n    List\u003cMember\u003e listMemberByKindId(Integer kindId);\n\n    /**\n     * 列出所有的企业\n     * @return\n     */\n    public List\u003cMember\u003e listMember();\n\n\n    /**\n     * SELECT id,member_name FROM member where kindId = ? ORDER BY id asc OFFSET ? LIMIT ?\n     *\n     * @param kindId\n     * @param id\n     * @param memberName\n     * @return\n     */\n    public PageList\u003cMember\u003e listMembers(Path id, Path memberName, Short kindId, OrderSpecifier id_asc, Page page);\n\n    /**\n     * SELECT id,member_name FROM member where kindId = ? and {predicate} ORDER BY id asc OFFSET ? LIMIT ?\n     *\n     * @param kindId\n     * @param id\n     * @param memberName\n     * @return\n     */\n    public PageList\u003cMember\u003e listMembersWithName(Path id, Path memberName, Short kindId , Predicate predicate, OrderSpecifier id_asc, Page page);\n\n    /**\n     * select * from member where kindId = ? and ${predicate} order by id asc OFFSET ? LIMIT ?\n     * @param kindId\n     * @param predicate\n     * @param id_asc\n     * @param page\n     * @return\n     */\n    public PageList\u003cMember\u003e listAllMembers(Short kindId, Predicate predicate, OrderSpecifier id_asc, Page page);\n\n    /**\n     * select * from member where ${predicates} order by id asc\n     * @param id_asc\n     * @param predicates\n     * @return\n     */\n    public PageList\u003cMember\u003e listPredicatesMembers(OrderSpecifier id_asc, Predicate... predicates);//\n\n    /**\n     * select {paths} from member\n     * @param paths\n     * @return\n     */\n    public List\u003cMember\u003e listMemberFields(Path... paths);\n}\n```\n调用时的代码:\n```java\n\n@Lightbatis()\n@EnableLightbatisWeb()\n@SpringBootApplication\npublic class SampleMapperApplication implements CommandLineRunner {\n\n\t@Autowired\n\tprivate MemberMapper memberMapper = null;\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SampleMapperApplication.class, args);\n\t}\n\n\t@Override\n\tpublic void run(String... args) throws Exception {\n\n//\t\tinsertMember();\n//\t\tinsertMemberWithId();\n//\t\tupdateMember();\n//\t\tlistMember();\n//\n//\t\tMember member = getMember();\n//\t\tdeleteMember();\n//\t\tqueryMember();\n//\t\tlistMembers();\n//\t\tlistAllMembers();\n//\t\tlistPredicatesMembers();\n//\t\tlistMemberFields();\n\t\tlistMemberByKindId();\n\t\tlistMembersWithName();\n\t}\n\n\tprivate void listMemberByKindId() {\n\t\tList\u003cMember\u003e memberList = memberMapper.listMemberByKindId(1);\n\t\tprintMembers(memberList);\n\t}\n\tprivate void queryMember() {\n\t\tQMember query = QMember.member;\n\t\tList\u003cMember\u003e members = memberMapper.query(query.kindId.eq(1));\n\t\tfor (Member member : members) {\n\t\t\tSystem.out.println(member);\n\t\t}\n\t}\n\tprivate void selectMember() {\n\t\tQMember member = QMember.member;\n\t\tmemberMapper.listMembers(member.id, member.memberName, 1, member.id.asc(),new Page(1,10));\n\t}\n\tprivate void insertMember() {\n\t\tMember member = new Member();\n\t\tint count = 1;\n\t\tfor (int i=0;i \u003c count; i++ ){\n\t\t\t//member.setId(new Long(250 + i));\n\t\t\tmember.setMemberName(\"慧 20191110 \" + i);\n\t\t\tmember.setKindId(1);\n\t\t\tmemberMapper.insert(member);\n\t\t\tSystem.out.println(\" insert id \" + member.getId());\n\t\t}\n\t}\n\n\tprivate void insertMemberWithId() {\n\t\tLong id = 643173508322426880L;\n\t\tMember member = memberMapper.getMember(id);\n\t\tif (member == null) {\n\t\t\tmember = new Member();\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tmember.setId(id);\n\t\tmember.setMemberName(\"INSERT 慧 20191110 AT \" + System.currentTimeMillis());\n\n\t\tmemberMapper.insert(member);\n\t}\n\n\tprivate void updateMember() {\n\t\tLong id = 643173508322426880L;\n\t\tMember member = memberMapper.getMember(id);\n\t\tmember.setId(id);\n\t\tmember.setKindId(1);\n\t\tmember.setMemberName(\"修改 慧 20191110 AT \" + System.currentTimeMillis());\n\n\t\tmemberMapper.updateByPrimaryKey(member);\n\t}\n\n\tprivate Member getMember() {\n\t\tLong id = 643173508322426880L;\n\t\tMember member = memberMapper.getMember(id);\n\t\treturn member;\n\t}\n\n\tprivate void deleteMember () {\n\t\tLong id = 643173508322426880L;\n\t\tMember member = new Member();\n\t\tmember.setId(id);\n\t\tint delCount = memberMapper.deleteByPrimaryKey(member);\n\t\tSystem.out.println(\"delete count = \" + delCount);\n\n\t\tmember = memberMapper.getMember(id);\n\t\tSystem.out.println(\" member is null \" + member);\n\n\t}\n\n\tprivate void listMember () {\n\t\tList\u003cMember\u003e members = memberMapper.listMember();\n\t\tfor (Member member : members) {\n\t\t\tSystem.out.println(member);\n\t\t}\n\t}\n\n\tprivate void listMembers() {\n\t\tQMember member = QMember.member;\n\t\tList\u003cMember\u003e members =memberMapper.listMembers(member.id, member.memberName, 1, member.id.asc(), new Page(5,1));\n\t\tfor (Member m : members) {\n\t\t\tSystem.out.println(m);\n\t\t}\n\t}\n\n\tprivate void listAllMembers() {\n\t\tQMember member = QMember.member;\n\t\tPageList\u003cMember\u003e members = memberMapper.listAllMembers(1, member.id.gt(1L).and(member.memberName.like(\"%慧慧慧%\")), member.id.asc(),new Page(5,1));\n\t\tfor (Member m : members) {\n\t\t\tSystem.out.println(m);\n\t\t}\n\n\t\tSystem.out.println(\"============= total size = \" + members.getTotalSize());\n\t}\n\n\tprivate  void listPredicatesMembers() {\n\n\t\tQMember member = QMember.member;\n\t\tPageList\u003cMember\u003e members = memberMapper.listPredicatesMembers(member.id.asc(), member.memberName.like(\"%慧%\"), member.kindId.eq(1));//\n\t\tprintMembers(members);\n\t}\n\n\tprivate void listMemberFields() {\n\t\tQMember member = QMember.member;\n\t\tList\u003cMember\u003e members = memberMapper.listMemberFields(member.id, member.memberName, member.kindId);\n\t\tprintMembers(members);\n\t}\n\tprivate void listMembersWithName() {\n\t\tQMember member = QMember.member;\n\t\tPageList\u003cMember\u003e members = memberMapper.listMembersWithName(member.id, member.memberName,1,member.memberName.like(\"%慧%\"), member.id.desc(),Page.newPage(1));\n\t\tprintMembers(members);\n\t}\n\tprivate void printMembers(List\u003cMember\u003e members) {\n\t\tfor (Member m : members) {\n\t\t\tSystem.out.println(m);\n\t\t}\n\t\tif (members instanceof  PageList) {\n\t\t\tPageList pageList = (PageList)members;\n\t\t\tSystem.out.println(\"=========== total size = \" + pageList.getTotalSize());\n\t\t}\n\t}\n\n\n}\n```\n\n\n## 关于类型规范\n\n\n# lightbatis 统一数据访问层\nlightbatis 统一数据层访问工具包，是在 Mybatis 的基础上，基于约定规范设计的增强功能集合。  \n基于规范的约定，不需要添加任务的注释。\n\n## 执行过程及原理\n    1. 自定义 Lightbatis  注释，同时默认 Mapper 的接口是 LightbatisMapper\n    2. Lightbatis 注释会 @import  LightbatisScannerRegistrar 扫描注册类。\n    3. LightbatisScannerRegistrar 类 指定 factoryBean 为 LightbatisFactoryBean\n    4. LightbatisScannerRegistrar 类 扫描到所有接口为 LightbatisMapper 的接口，该接口默认实现将由 LightbatisFactoryBean 代理\n    5. LightbatisFactoryBean 默认继承了 SqlSessionDaoSupport, 在 checkDaoConfig 方法，先有默认实现检查原来 Mybatis 的默认实现\n    6. LightbatisFactoryBean 的 checkDaoConfig 方法中，如果有 Mybatis 没有实现的方法，由 Lightbatis 来实现。\n    7. Lightbatis 实现的方法是，将没有系统默认注释(@Select, @Insert, @Update, @Delete, @SelectProvider, @InsertProvider, @UpdateProvider, @DeleteProvider )的方法，转化成 MappedStatement 并注册到 MyBatis 的 Configuration 中去。\n    \n## Lightbatis\n\n![lightbatis 导图](./lightbatis.png)  \n\n`\n@Lightbatis()\n`\n## 使用上的一些约定\n## SpringBoot 环境上使用 lightbatis \n    在 SpringBoot 的启动类上添加 @Lightbatis() 注释即可，如下：\n```java\n@Lightbatis()\n@EnableLightbatisWeb()\n@SpringBootApplication\npublic class SampleMapperApplication\n```\n### insert 操作\n与实体类相关的注释说明  \n@Id 与ID相关的操作\n```java\n    @Id\n    @ApiModelProperty(value=\"ID\", allowEmptyValue=true)\n    @Column(name=\"id\", length=19, nullable=false)\n    private Long id;\n```\n@AutoGenerated 列值的自动生成\n```java\n    @AutoGenerated\n    @ApiModelProperty(value=\"创建时间\", allowEmptyValue=true)\n    @Column(name=\"created_time\", length=29)\n    private java.sql.Timestamp createdTime;\n```\n### update 操作\n\n### select 操作\n\n## 简便易用的可视化代码生成控制台\nlightbatis 自带可视化的代码生成控制台，可以快速地生成 Entity, Mapper, Service 等代码。  \n在你的工程使用 Maven 加入以下依赖：\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.github.lightbatis\u003c/groupId\u003e\n  \u003cartifactId\u003elightbatis-web\u003c/artifactId\u003e\n  \u003cversion\u003e1.0.1-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n```\n启动你的 SpringBoot 应用，和你应用同一个端口下可以直接访问，如 application.yml 中定义接口为 8082, 可以直接 http://localhost:8082/dal.html 访问  ：\n```yml\nserver:\n  port: 8082\n```\n会出现以下界面   \n![控制台首页](./doc/lightbatis-web-01.png)  \n生成 Mapper 类代码  \n![控制台 Mapper 生成](./doc/lightbatis-web-mapper.png)  \n生成 Service 类代码  \n![控制台 Service 生成](./doc/lightbatis-web-service.png)  \n批量生成  \n![控制台首页](./doc/lightbatis-web-batch.png)  \n\n\n## 相关工程结构\n\n\n## 相关技术点\n### 使用 handlebars 用来动态生成 MyBatis SQL  \n\nHandlebars https://handlebarsjs.com/guide/\n\n# 版本说明：\n* 1.1.15\n  * 增加了一个重要功能，可以动态增加 SQL。","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flightbatis%2Flightbatis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flightbatis%2Flightbatis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flightbatis%2Flightbatis/lists"}