BFT75采用JPA ORM开发,为了支持后续的多知识库,迁移了元数据75中使用的SQL模板技术。使用方法基本和元数据75中一致。
1. SQL 模板定义
sql 模板文件,必须是以 ${name}Sql.xml 为结尾(Sql.xml), 如:forSql.xml/ barSql.xml。模板文件必须放置在工程的 META-INF/sqlxml/${dbtype}/ 目录下,dbtype 为小写数据库的字符串,如:mysql、oracle、sqlserver、dm。 sql 模板结构如下:
Statement SQL 支持 #paramName#, $paramName$ 的参数:
sql
select a.instance_code as INSTANCE_CODE ,
a.instance_name as INSTANCE_NAME,
a.instance_id as INSTANCE_ID
from t_md_instance a
where a.instance_code
not in ($code$)
and a.parent_id = #parentId#
and a.classifier_id='Column'
#
类型的参数,支持 SQL ?作为变量插入, 因此建议使用此种方式,可以防止SQL注入的攻击风险。 $
类型的参数直接解析为字符串。如 for=bar, $for$ = 'bar'。
2. SQL模板使用
在任意 Controller 中通过导入 IDAOService。
java
@RestController
@RequestMapping(value = "/for/bar")
public class TestController {
/**
* 数据库 SQL 执行工具
*/
@Autowired
IDAOService daoService;
@GetMapping("/test")
public Map<String, Object> test() {
final HashMap<String, Object> map = new HashMap<>();
map.put("success", true);
map.put("datetime", System.currentTimeMillis());
map.put("message", "OK");
map.put("sql", daoService.queryById("onlyOneEnd"));
return map;
}
}
常规开发如下:
java
public List queryById("onlyOneEnd")); // 执行 onlyOneEnd 查询,返回 Map
public List queryById("onlyOneEnd"), (Map)params); // 执行 onlyOneEnd 查询,使用 params 参入参数
public List queryById(String id, Map<String, Object> params, Class entityClass);
public <T> T queryForObject(String sql, Object[] params, Class<T> entityClass);
List queryForMap(String sql); //执行任意 sql,返回 Map
List queryForMap(String sql, Object[] params); //执行任意 sql,返回 Map
List queryForMap(String sql, Object[] params, int firstResult, int maxResult); //分页
int count(String queryString, Object[] parameters); //count
List query(String sql, Object[] params, Class entityClass); //任意查询,返回 Entity
public List queryForEntity(String sql, Object[] params, Class entityClass)
int updateById("statementId"); //执行 id 为 statementId 的 更新sql,update,insert,delete
int updateById("statementId", params); //执行 id 为 statementId 的sql, 传入参数
int batchUpdateSQL(sqls) // 批量执行更新SQL
int execute(String updateSql, Object[] params); //执行任意跟新sql,update,insert,delete
String getSQL(String name, Object voOrMap); // 根据 id 返回 sql 模板;
String getParam(String name, Object voOrMap); // 根据 id 返回 sql 模板参数;
public List query(String sql, Object[] params, ResultTransformer rt); //自定义结果转换
不希望返回结果是Map,直接转为为 DO,如何使用 ResultTransformer:
java
new DOResultTransformer(StudentDTO.class)
3. 动态SQL表达式
动态SQL模板,除了支持 $for$ 和 #bar# 类型的参数引用,也支持一些判断。使用方法:
xml
select * from table
where 1=1
<compare-field compareProperty="fieldName" compare="gt" compareValue="100">
and sql condition
</compare-field>
compare 支持如下:
txt
eq: 等于
ne: 不等于
gt: 大于
ge: 大于或等于
lt: 小于
le: 小于或等于
isnull: 空判断
isnotnull: 非空
isempty: 空字符串
isnotempty: 非空的字符串
举例:
- eq null //等于空
- ne null //非空
- isnull //空
- eq for // 值等于 for
- gt 100 //大于100,传入参数必须是数值型
- isnotempty // field != null && field != ''