Skip to content

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 模板结构如下:

SQL Template

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: 非空的字符串

举例:

  1. eq null //等于空
  2. ne null //非空
  3. isnull //空
  4. eq for // 值等于 for
  5. gt 100 //大于100,传入参数必须是数值型
  6. isnotempty // field != null && field != ''