前言
项目上遇到一个功能需要对用户输入的数据表进行各种操作,这个时候需要自己拼接SQL然后执行。
拼接方法有两种:
- 直接用字符串自己拼接,这种方法要特别注意前后空格。
- 使用org.apache.ibatis.jdbc.SQL进行拼接。
执行方法我现在发现两种:
- 放入mapper.xml中用
${sqlText}
进行执行。 - 使用mabtis的注解@SelectProvider等进行执行。
一、SQL拼接方法
1、直接字符串拼接
注意前后空格
StringBuilder sql = new StringBuilder("SELECT * ");
sql.append(columns.trim()).append(" ");
sql.append("from ").append(tableName.trim()).append(" ");
sql.append("where ").append(" 1 = 1");
String sqlText = sql.toString();
2、使用org.apache.ibatis.jdbc.SQL进行拼接
SQL sql = new SQL()
.SELECT(columns)
.FROM(tableName)
.WHERE("1=1");
String sqlText = sql.toString();
这个还有另一种写法,使用双大括号
String sqlText = new SQL(){{
SELECT(columns);
FROM(tableName);
WHERE("1=1");
}}.toString();
二、执行方式
1、使用xml文件
mapper.class
List<Map<String, Object>> executeSql(@Param("sqlText") String sqlText);
mapper.xml
<select id="executeSql" resultType="map">
${sqlText}
</select>
2、使用@SelectProvider注解
mapper.class
import org.apache.ibatis.annotations.SelectProvider;
@SelectProvider(type = SqlProvider.class, method = "selectSql")
List<Map<String, Object>> executeSql(String columns, String tableName);
需要新建一个SqlProvider.class类,并且包含selectSql方法,且参数为String columns, String tableName
public class SqlProvider {
public String selectSql(String columns, String tableName) {
SQL sql = new SQL()
.SELECT(columns)
.FROM(tableName)
.WHERE("1=1");
return sql.toString();
}
}
不用创建mapper.class对应的mapper.xml文件
其他
1、这里只展示了查询的SQL的注解,还有更新、插入\、删除的注解
@InsertProvider
@UpdateProvider
@DeleteProvider