背景:查询前不确定操作的目标表格与查询的字段
目的:动态创建sql,整个sql语句都是由具体业务临时创建
好处:不受具体的限定绑死,灵活
简单式:
说明:直接把查询条件的值拼到sql中
优点:简单,程序可读性强
缺点:有sql注入的风险。每次查询只要有查询条件变更,底层都会当作新的sql重新解析,效率低
Dao
@Mapper
public interface DynamicDataDao {
@Select("${dynamicsql}")
List<LinkedHashMap<String, Object>> queryTable1(String dynamicsql);
}
Service
public List<LinkedHashMap<String, Object>> queryTable1(string tableName) {
String dynamicsql = "select * from " + tableName + " and name = '小明'"; //构造查询语句
return dynamicDataDao.queryTable1(dynamicsql);;
}
安全式:
说明:使用占位符的查询条件
优点:能有效避免sql注入的风险。条件变更不用解析,提升效率
缺点:代码复杂点,程序可读性略低
Dao
@Mapper
public interface DynamicDataDao {
@Select("${dynamicsql}")
List<LinkedHashMap<String, Object>> queryTable2(Map<String, Object> values);
}
Service
public List<LinkedHashMap<String, Object>> queryTable2(Map<String, Object> values, string tableName) {
String dynamicsql = "select * from " + tableName + " WHERE 1=1 "; //构造查询语句
for (Map.Entry<String, Object> entry : values.entrySet()) {
String key = entry.getKey();
// 此时key的值和表的字段相同
dynamicsql + = " AND " + key + " =#{" + key +"}";
}
// 这样组出来的sql 类似 select * from tableName WHERE 1=1 and name = #{name} and age=#{age};
// values 里面包含 name 和 age 的值,真正查询的时候,mybatis会根据占位符去自动映射
values.put("dynamicsql", dynamicsql);
return dynamicDataDao.queryTable2(values);
}