Mybatis注解-通过provider类实现动态SQL语句

电磁加热中需要用到根据IOT平台传来的属性动态拼接SQL进行写入数据库,在此记录一下解决办法。

新增provider类

提供CRUD对应的SQL语句。这里的SQL语句使用SQL类的方式构建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.how2java;

import org.apache.ibatis.jdbc.SQL;

public class CategoryDynaSqlProvider {
public String list() {
return new SQL()
.SELECT("*")
.FROM("category_")
.toString();

}
public String get() {
return new SQL()
.SELECT("*")
.FROM("category_")
.WHERE("id=#{id}")
.toString();
}

public String add(){
return new SQL()
.INSERT_INTO("category_")
.VALUES("name", "#{name}")
.toString();
}
public String update(){
return new SQL()
.UPDATE("category_")
.SET("name=#{name}")
.WHERE("id=#{id}")
.toString();
}
public String delete(){
return new SQL()
.DELETE_FROM("category_")
.WHERE("id=#{id}")
.toString();
}

}

动态拼接SQL

1
2
3
4
5
6
7
8
9
10
11
12
public String queryOrderByParam(OrderPara param) {
SQL sql = new SQL().SELECT("*").FROM(TBL_ORDER);
String room = param.getRoom();
if (StringUtils.hasText(room)) {
sql.WHERE("room LIKE #{room}");
}
Date myDate = param.getMyDate();
if (myDate != null) {
sql.WHERE("mydate LIKE #{mydate}");
}
return sql.toString();
}

关于SQL类

SQL类是用于进行动态SQL生成的,如下代码是一个相对复杂的SQL类的使用举例,以后需要用到的时候,再来参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private String selectPersonSql() {
return new SQL() {{
SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
FROM("PERSON P");
FROM("ACCOUNT A");
INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
WHERE("P.ID = A.ID");
WHERE("P.FIRST_NAME like ?");
OR();
WHERE("P.LAST_NAME like ?");
GROUP_BY("P.ID");
HAVING("P.LAST_NAME like ?");
OR();
HAVING("P.FIRST_NAME like ?");
ORDER_BY("P.ID");
ORDER_BY("P.FULL_NAME");
}}.toString();
}

修改mapper

原手写SQL语句:

1
2
@Insert(" insert into category_ ( name ) values (#{name}) ")  
public int add(Category category);

改为通过注解配合provider类中对应的方法:

1
2
@InsertProvider(type=CategoryDynaSqlProvider.class,method="add")  
public int add(Category category);

其他注解包括:@SelectProvider@UpdateProvider@DeleteProvider

:转载文章请注明出处,谢谢~