# jqlquery
**Repository Path**: albb0608/jqlquery
## Basic Information
- **Project Name**: jqlquery
- **Description**: 基于javascript配置查询sql(类似mybatis的xml)并通过接口声明调用的数据库查询工具
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 6
- **Created**: 2023-02-04
- **Last Updated**: 2023-02-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# jqlquery
#### 介绍
基于javascript配置查询sql(类似mybatis的xml)并通过接口调用的数据库查询框架。
适用项目:基于springboot jpa的项目
#### 使用步骤
在jpa的基础上:
1.添加依赖
```xml
cc.iotkit
jqlquery
0.0.1-SNAPSHOT
```
2.初始化配置对象和配置扫描包
```java
@Configuration
public class AutoBeanConfiguration {
@Bean
public JqlQueryConfiguration getJqlQueryConfiguration() {
return new JqlQueryConfiguration("cc.iotkit.sws.dao");
}
}
```
3.添加sql配置
在resources目录中创建第2步中配置的扫描包文件夹:
cc/iotkit/sws/dao
创建文件: WorkFlowQuery.js
添加sql配置
```javascript
function getWorkFlows(id){
var sql=`
SELECT a.id,a.title,a.status,b.work_result
from work_order a JOIN work_flow b ON a.id=b.work_id
where a.id=:id
`;
return sql;
}
function getWorkFlows2(param){
var sql=`
SELECT a.id,a.title,a.status,b.work_result
from work_order a JOIN work_flow b ON a.id=b.work_id
where a.id=:id
`;
return sql;
}
function getWorkFlowTotal(id){
var sql=`
SELECT count(*) from work_order a JOIN work_flow b ON a.id=b.work_id
where a.id=:id
`;
return sql;
}
```
##### 注:可根据入参使用js语法,任意构造动态组合条件的sql,画面请自行脑补 :smirk:
**举个例子:**
mybatis写法:
```xml
```
js写法:
```javascript
function findSqlWhere(user){
var sql="select * from demo_user where 1=1 ";
sql+=user.id?"and id=:id":"";
sql+=user.name?"and name=:name":"";
sql+=user.age?"and age=:age":"";
sql+=user.sex?"and sex=:sex":"";
return sql;
}
```
4.在扫描包中添加接口类
WorkFlowQuery.java
```java
@JqlQuery
public interface WorkFlowQuery {
List getWorkFlows(String id);
List getWorkFlows2(WorkFlowVo param);
long getWorkFlowTotal(String id);
}
```
5.调用
在需要调用的类中注入WorkFlowQuery调用:
```java
@Autowired
private WorkFlowQuery workFlowQuery;
workFlowQuery.getWorkFlows("1")
WorkFlowVo param = new WorkFlowVo();
param.setId("1");
workFlowQuery.getWorkFlows2(param);
workFlowQuery.getWorkFlowTotal("1")
```
## 示例
### 动态条件+分页
JS: AlarmQuery.js
```javascript
function getAlarmWhere(alarm){
var where=" where 1=1 ";
where+=alarm.state?" and state=:state":"";
where+=alarm.projectName?" and project_name like :projectName":"";
where+=alarm.level?" and level=:level":"";
return where;
}
function queryAlarms(alarm,start,size){
var sql=`
select * from alarm ${this.getAlarmWhere(alarm)}
order by create_at desc
limit :start,:size
`;
return sql;
}
function countAlarms(alarm){
var sql="select count(*) from alarm ${this.getAlarmWhere(alarm)}";
return sql;
}
```
sql写法示例2:
```javascript
function getBuildingEpidemics(tour_code, return_hometown, community_id, page_size, page_num){
var cond="";
cond+=tour_code?"tour_code=:tour_code and ":"";
cond+=return_hometown?"return_hometown=:return_hometown and":"";
var sql=`
select
a.id,a.tour_code,a.temperature,a.return_hometown,a.created_at,
b.type,b.area,b.building,b.unit,b.number
from ejyy_epidemic a left join ejyy_building_info b on a.building_id=b.id
where ${cond} a.community_id=:community_id
order by a.id desc
limit ${(page_num-1)*page_size},${page_size}
`;
return sql;
}
```
java:AlarmQuery.java
```java
@JqlQuery
public interface AlarmQuery {
List queryAlarms(Alarm param, int start, int size);
long countAlarms(Alarm param);
}
```
java:controller
```
@PostMapping("/alarms/{size}/{page}")
public Paging getAlarms(
@PathVariable("size") int size,
@PathVariable("page") int page,
int level,
String state,
String projectName) {
Alarm param = Alarm.builder()
.level(level)
.state(state)
.projectName("%" + projectName + "%")
.build();
return new Paging<>(alarmQuery.countAlarms(param),
alarmQuery.queryAlarms(param, (page - 1) * size, size));
}
```