# 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
- 导入依赖
```
* 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
* SELECT *
* FROM
* T
* WHERE
* status={status}
* AND id <> {ignoreId} -- if(ignoreId != null)
* AND (
* name LIKE {'%'+keyword+'%'} OR notes LIKE {'%'+keyword+'%'}
* )-- if(keyword != null)
*
*/
List
* 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
* SELECT COUNT(*) -- COUNT SQL
* SELECT root.id,root.name -- LIST SQL
* FROM
* T root
* WHERE 1 = 1
* AND title like {'%'+nameKeyword+'%'} -- if(nameKeyword)
*
*/
Page
* SELECT COUNT(*) -- COUNT SQL
* SELECT root.id,root.name -- LIST SQL
* FROM
* T root
* WHERE 1 = 1
*
* AND title like concat('%',#{nameKeyword})
*
*
*/
@MSQL
Page
* SELECT COUNT(*) -- COUNT SQL
* SELECT root.id,root.name -- LIST SQL
* FROM
* T root
* WHERE 1 = 1
* AND title like {'%'+nameKeyword+'%'} -- if(nameKeyword)
*
*/
Page
* SELECT COUNT(*) -- COUNT SQL
* FROM
* T root
* WHERE 1 = 1
* AND title like {'%'+nameKeyword+'%'} -- if(nameKeyword)
*
*/
Page