# xlmkit-springboot **Repository Path**: xlmkit/xlmkit-springboot ## Basic Information - **Project Name**: xlmkit-springboot - **Description**: xlmkit提供操作数据库包 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2021-03-16 - **Last Updated**: 2021-06-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # xlmkit-springboot xlmkit提供操作数据库包 ## xlmkit-spring-data ### 简介 一款能利用java注释来写sql的插件 - 兼容jpa,mybatis-plus - 支持hsql,mybatis脚本(mapper.xml内的语法) ### 优点 - 把接口的sql语句写在注释,可以快速写数据层的实现 - 一个类搞定数据层,传统需要两个文件一个DaoMapper.java 和 mapper.xml - 保留sql格式,可以格式化。传统是利用xml标记 - 支持page双sql优化。 - 支持条件(-- if) - 支持SQL占位符( { xxx } ) - 支持循环( {@for xxx } ) - 支持自定义标签(-- 标签) - 支持自定义魔法变量 - 支持自定义源,当前是实现jpa(可以支持mybatis、jdbctemplate等) ### 原理 - springboot启动时,为每个Dao接口生成代理实现类 ``` //激活插件 @EnableCommentDao //dao代理实现类 DaoInvocationHandler.java ``` - 在调用dao接口时,读取xx.comment.properties文件中的脚本 - ScriptEngine 加载脚本 - ScriptEngine 调用脚本,生成sql - CommentDaoManager 根据方法上下文 获取database处理器 - database处理器执行操作,返回结果 ### 使用 - 激活注解处理器:https://gitee.com/xlmkit/annotation-processor-comment-helper - 导入依赖 ``` com.github.xlmkit annotation-processor-comment-helper 1.0.1 xlmkit-springboot-data com.github.xlmkit 1.0.1 com.alibaba fastjson org.springframework.boot spring-boot-starter-data-jpa com.baomidou mybatis-plus-boot-starter 3.4.1 ``` - 入口激活插件 ``` @SpringBootApplication @EnableCommentDao(value = XXXDao.class) public class StartupApplication { } ``` - 编写XXXDao.java ``` @Model(Object.class) @GenerateCommentFile public interface UserDao { /** *
     *     SELECT * FROM User WHERE id = { id }
     * 
*/ public JSONObject findById(long id); } ``` - 测试 ``` @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = StartupApplication.class) public class UserDaoImplTest { @Autowired public UserDao userDao; @Test public void testFindById(){ System.out.println(userDao.findById(2)); //返回 {"username":"admin","status":1,"id":2} } } ``` ### 全局参数 ```properties ## 数据库框架类型,默认jpa ## jpa ## mybatis xlmkit.springboot.data.type=jpa ## 查询结果参数名称规则,默认NoChange ## NoChange=不做处理 ## CamelCase=驼峰 xlmkit.springboot.data.query.result.JSONObject.propertyNamingStrategy=NoChange ## 调试模式,开启后sql每次都会重新加载 xlmkit.springboot.data.debug=false ``` ### pre 内 -- [指令] 语法 `放置在一行最末端` #### -- LIST SQL与-- COUNT SQL - 一个dao方法实现分页查询 - 方法需要一个Pageable对象(页码和结果数量) ``` /** *
     * SELECT COUNT(*) -- COUNT SQL
     * SELECT id,name -- LIST SQL
     * FROM T
     * 
*/ Page page(Pageable pageable); ``` #### -- if([条件]) 当条件满足,将当前行追加到sql ``` /** *
     * SELECT *
     * FROM
     * T
     * WHERE 
     * status={status}
     * AND id <> {ignoreId} -- if(ignoreId != null)
     * AND (
     *  name LIKE {'%'+keyword+'%'} OR notes LIKE {'%'+keyword+'%'} 
     *  )-- if(keyword != null)
     * 
*/ List listByStatus(int status,String keyword,Long ignoreId); ``` 当ignoreId=null时:`AND id <> {ignoreId}` 不会追加到sql中 当keyword=null时:`AND ( name LIKE {'%'+keyword+'%'} OR notes LIKE {'%'+keyword+'%'} )` 不会追加到sql中 #### -- javacode [java代码] 直接写代码操作sql ### 魔法变量 #### {[参数]} 占位符 ``` /** *
     *     SELECT * FROM User WHERE id = { id }
     * 
*/ public JSONObject findById(long id); ``` #### {@text [text]} 注入文本 #### {@insert [sql]} 追加sql #### {@for '[list参数],[jdbc属性],[属性连接词],[where连接词]'} for循环 ### 注解 #### @GenerateCommentFile DAO类注解 在`target`文件夹对应包下生成 `xx.comment.properties`,文件中存储方法和注释信息。 如: src/test/java/com/xlmkit/apps/demo/dao/ApplicationDao.java ``` java package com.xlmkit.apps.demo.dao; import com.xlmkit.apps.demo.model.Application; import com.xlmkit.springboot.data.annotation.Model; import org.xlmkit.annotation.processor.comment.helper.GenerateCommentFile; @GenerateCommentFile @Model(Application.class) public interface ApplicationDao { /** * 按ID查找 * * @param id * @return Application *
     * SELECT *
     * FROM
     * T
     * WHERE
     * id = { id }
     * 
*/ Application findById(long id); } ``` 生成:target/test-classes/com/xlmkit/apps/demo/dao/ApplicationDao.comment.properties ```properties ## 按ID查找 ## ## @param id ## @return Application ##
##   SELECT *
##   FROM
##   T
##   WHERE
##   id = { id }
##   
findById##long=IOaMiUlE5p+l5om+CgogQHBhcmFtIGlkCiBAcmV0dXJuIEFwcGxpY2F0aW9uCiA8cHJlPgogU0VMRUNUICoKIEZST00KIFQKIFdIRVJFCiBpZCA9IHsgaWQgfQogPC9wcmU+Cg== parameter.names#findById##long=id, ``` #### @MaxResults Model方法注解 将`pre`内容中的`T`字符自动转换成Model的值(表名或实体名) #### @ExecuteUpdate DAO方法注解 方法默认执行查询查找,要执行`insert`、`detete`、`update`等写操作,需用此注解 #### @HQL DAO方法注解 方法默认采用原始sql执行,此注解使用jpa hql语法执行。 #### @MaxResults DAO方法注解 设置最大查询条数 #### @MSQL DAO方法注解 方法默认采用原始sql执行,此注解使用mybatis script语法执行。 [mybatis XML select](https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#select) [mybatis XML insert_update_and_delete](https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#insert_update_and_delete) ``` /** * 按ID查找 * * @param id * @return Application *
     * SELECT * FROM T WHERE id = #{id}
     * 
*/ @MSQL Application findById(long id); /** * 更新 * *
     * update T set name=#{name},type=#{type} WHERE id = #{id}
     * 
*/ @MSQL @ExecuteUpdate int update(Application application); /** * * 批量插入 *
     * insert into T (name,type) values
     *   
     *             (#{item.name}, #{item.type})
     *   
     * 
*/ @MSQL @ExecuteUpdate int betchInsert(List apps); ``` ### mybatis下的分页 方式一:默认语法 ``` /** * * 默认 分页测试 *
     * SELECT COUNT(*) -- COUNT SQL
     * SELECT root.id,root.name -- LIST SQL
     * FROM
     *  T root
     * WHERE 1 = 1
     *  AND title like {'%'+nameKeyword+'%'} -- if(nameKeyword)
     * 
*/ Page defaultPage(String nameKeyword, Pageable pageable); ``` 方式二:mybatis 动态sql ``` /** * * mysql 分页测试 *
     * SELECT COUNT(*) -- COUNT SQL
     * SELECT root.id,root.name -- LIST SQL
     * FROM
     *  T root
     * WHERE 1 = 1
     *  
     *     AND title like concat('%',#{nameKeyword})
     *   
     * 
*/ @MSQL Page mPage(String nameKeyword, Pageable pageable); ``` ### jpa下的分页 方式一:默认语法 ``` /** * * 默认 分页测试 *
     * SELECT COUNT(*) -- COUNT SQL
     * SELECT root.id,root.name -- LIST SQL
     * FROM
     *  T root
     * WHERE 1 = 1
     *  AND title like {'%'+nameKeyword+'%'} -- if(nameKeyword)
     * 
*/ Page defaultPage(String nameKeyword, Pageable pageable); ``` 方式二:hsql ``` /** * * HQL 分页测试 *
     * SELECT COUNT(*) -- COUNT SQL
     * FROM
     *  T root
     * WHERE 1 = 1
     *  AND title like {'%'+nameKeyword+'%'} -- if(nameKeyword)
     * 
*/ Page defaultPage(String nameKeyword, Pageable pageable); ```