网上很多注解的动态sql语句都如下图:
一个个判断代码过于冗余,我稍微简化了下,下面贴出一个demo,展示重要的代码
首先是自定义一个生成动态sql的类,与上图类似,这里我只演示了查询,也有通用的删除添加和修改,都可以通过下面这种方式实现减少代码量的操作
package com.hw.util;
import org.apache.ibatis.jdbc.SQL;
import java.util.Map;
import java.util.Set;
public class EmployeeDynaSqlProvider {
public String selectWhitParamSql(String o,Map<String,Object> map){
String s = new SQL() {
{
SELECT("*");
//表名
FROM(o);
//使用循环拼接动态sql
Set<Map.Entry<String, Object>> entries = map.entrySet();
for (Map.Entry<String, Object> entry : entries) {
if (entry.getKey() != null) {
WHERE("" + entry.getKey() + " like '%" + entry.getValue() + "%'");
}
}
}
}.toString();
return s ;
}
}
对于查询的mapper接口
//第一个参数为生成sql的类,第二个为实现的方法
@SelectProvider(type = EmployeeDynaSqlProvider.class,method = "selectWhitParamSql")
public List<Student> getAllStudents(String o,Map<String,Object> map);
然后贴上Controller层的方法
@RequestMapping("/gets.action")
public void getS(HttpServletRequest request, HttpServletResponse response){
//第一个参数为页数,第二个为显示数
PageHelper.startPage( Integer.parseInt(request.getParameter("page")),
Integer.parseInt(request.getParameter("limit")));
//去数据库中查询数据
Map<String,Object> map=new HashMap<>();
//模拟前端传来了查询条件
map.put("sname","s");
map.put("sid","0"); //第一个参数为表名
List<Student> allStudents = studentsServices.getAllStudents("student",map);
//获取分页后的数据和信息
PageInfo pageInfo=new PageInfo(allStudents);
//pageInfo为分页的详细信息
Map<String,Object> object=new HashMap<>();
object.put("code", 0);
object.put("msg", "");
object.put("count", pageInfo.getTotal());
object.put("data", pageInfo.getList());
String str = JSON.toJSONString(object);
try {
//将数据返回到前端
print(str,response);
} catch (IOException e) {
e.printStackTrace();
}
}
最后贴上效果图,由于是模拟的查询,所以查询条件定义为死的,实际开发中查询条件当然是在页面上传来的
点赞或者评论是我最大的动力,有问题欢迎留言或者联系q:1559810637