分页查询集成模糊条件查询的写法(SSM框架)提高代码重用性
pojo
public class Page<T> { //数据列表 private List<T> datas; //当前页 private int pageno; //当前页内数量 private int pagesize; //总共页数 private int totalno; //总共的数量 private int totalsize; //创建对象必须实现构造函数 public Page(int pageno, int pagesize) { super(); if(pageno>1) { this.pageno = pageno; }else { this.pageno=1; } if(pagesize>1) { this.pagesize = pagesize; }else { this.pagesize=10; } } public List<T> getDatas() { return datas; } public void setDatas(List<T> datas) { this.datas = datas; } public int getTotalno() { return totalno; } private void setTotalno(int totalno) { this.totalno = totalno; } public int getPageno() { return pageno; } public void setPageno(int pageno) { this.pageno = pageno; } public int getTotalsize() { return totalsize; } public void setTotalsize(int totalsize) { this.totalsize = totalsize; int pagesize=this.pagesize; //计算总共有多少页 int totalno=(totalsize%pagesize==0)?(totalsize/pagesize):(totalsize/pagesize+1); this.setTotalno(totalno); } public int getPagesize() { return pagesize; } public void setPagesize(int pagesize) { this.pagesize = pagesize; }
controller层
@RequestMapping("queryUserList") @ResponseBody public Object queryUserList( @RequestParam(value="pageno",required=false,defaultValue="1")Integer pageno, @RequestParam(value="pagesize",required=false,defaultValue="10")Integer pagesize, String queryText ){ AjaxResult result=new AjaxResult(); try { Map<String,Object> map=new HashMap<>(); map.put("pageno", pageno); map.put("pagesize", pagesize); //如果有条件查询 if(StringUtil.isNotEmpty(queryText)) { map.put("queryText", queryText); } Page<User> page=userService.queryUserList(map); result.setPage(page); result.setSuccess(true); result.setMessage("查询成功"); return result; } catch (Exception e) { e.printStackTrace(); result.setSuccess(false); result.setMessage("查询用户数据失败"); return result; } }
service层
@Override public Page<User> queryUserList(Map<String, Object> map) { Integer pageno=(Integer)map.get("pageno"); Integer pagesize=(Integer)map.get("pagesize"); Page<User> page=new Page<User>(pageno, pagesize); int startPage=(pageno-1)*pagesize; map.put("startPage", startPage); //执行查询 List<User> userList=userMapper.queryUserList(map); int count=userMapper.queryUserCount(map); //填充数据 page.setDatas(userList); page.setTotalsize(count); return page; }
mapper
List<User> queryUserList(Map<String, Object> map); int queryUserCount(Map<String, Object> map);
mapper.xml
<select id="queryUserCount" resultType="int"> select count(*) from t_user <where> <if test="queryText!=null"> loginacct like concat("%",#{queryText},"%") </if> </where> </select> <select id="queryUserList" resultMap="BaseResultMap"> select id, loginacct, userpswd, username, email, createtime from t_user <where> <if test="queryText!=null"> loginacct like concat("%",#{queryText},"%") </if> </where> limit #{startPage},#{pagesize} </select>
总结
- 页面向controller层传递三个参数
1.当前页数,
2.每页显示记录数
3.模糊查询条件 - 如果控制层判断查询条件为空则map集合中不会加入queryText
- service层获得dao层查到的数据和总记录数,并封装入page对象,当前页和每页记录数也需要封装
- dao层通过动态sql语句判断查询条件是否为空,决定查询时需不需要加入使用查询条件
注意的地方
1.控制层的参数queryText为非必须参数2.业务层调用持久层的方法时,需要计算从第几个开始查询(startPage,这里的名字没有取好,可以改为startIndex),并加入map集合。
3.在mapper.xml中为了避免sql注入的问题没有采用(like '%${queryText}%')
而是采用(like concat("%",#{queryText},"%"))函数
好处
controller-----》service-----》dao全部采用map集合封装参数,可重用性增强,即没有查询条件和有查询条件的查询都可以调用此方法。
在mapper.xml中使用动态sql,增强了代码端的可重用性
其他补充知识点
1.动态查询语句
2.SQL中占位符不能在单引号中,否则,会以?进行查询数据
‘%#{param}%’
‘%?%’
3.SQL中不能使用加号进行字符串拼接,加号是用来做运算的
‘%’+‘D’+’%’
4.MyBatis进行拼串,拼串会出现 SQL 注入情况 ,例如:“or 1=1”
‘%${param}%’
5.使用内置方法进行拼串
concat(’%’,#{param},’%’)
6.查询条件值本身为%,查询出所有的数据
concat(’%’,#{param},’%’) => ‘%%%’
‘%%%’ 使用转译字符再进行查询。
7.#和\是一个意思,表示转译。使用#代替
select * from t_user where username like ‘%#%%’ escape ‘#’
select * from t_user where loginacct like ‘%@%%’ escape ‘@’
SELECT * FROM t_user WHERE loginacct LIKE concat(’%’,’@%’,’%’) ESCAPE ‘@’
8.常见的SQL文,在Oracle中,使用两个竖线用来表示字符串拼接,MySQL中没有这样的语法。
select * from t_user where username like ‘%’|| #{param} ||’%’
有3个参数,但是只是指定了2个.
○ Select * from t_user where loginacct like ‘%#{loginacct}%’ limit?,?
org.springframework.dao.TransientDataAccessResourceException:
### Error querying database. Cause: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
### The error may exist in URL [jar:file:/F:/atcrowdfunding/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/atcrowdfunding-main/WEB-INF/lib/atcrowdfunding-user-0.0.1-SNAPSHOT.jar!/mybatis/mapper-user.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select * from t_user WHERE loginacct like ‘%?%’ limit ?, ?
### Cause: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
; SQL []; Parameter index out of range (3 > number of parameters, which is 2).; nested exception is java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
解决:
§ Java中转译
String queryText = “%”;
if(StringUtil.isNotEmpty(queryText)){
//斜线本身需要转译,regex中两个\表示一个\ ; Java中也是两个\表示一个;所以,需要四个斜线
queryText = queryText.replaceAll("%", “\\%”);
System.out.println("--------------"+queryText);
}
§ SQL语句中转译
□ 对特殊符号进行转译;斜杠本身也属于特殊符号,需要转译.
select * from t_user where loginacct like ‘%\%%’
○ 注意:
§ 尽量在保存数据时,验证数据的合法性,尽量避免存在的字符串中含有特殊符号.
- SSM框架 用ajax实现模糊查询分页和列表
- SSM框架中集成TKMybatis+PageHelper实现高效查询和分页
- 【java】spring-data-jpa 集成hibernate实现多条件分页查询
- SSM框架 Mybatis联合查询 多表查询 分页
- java开源框架集成常见错误之使用Criteria添加查询条件出现java.lang.ClassCastException异常
- ssm根据条件查询分页,后台分页
- 关于模糊查询时的索引问题.(了解一下,对提高代码效率非常有好处)
- springmvc+java+mysql分页条件查询自学代码
- 【ssm个人博客项目实战08】博客的分页显示以及模糊查询,删除。
- SSM框架实现分页和搜索分页的示例代码
- 表单form中2个submit2个action 和 hibernateTemplate模糊查询/多条件组合复合随机查询的写法
- Lucene代码备份之分页条件查询
- java ssm框架实现分页功能的示例代码(oracle)
- SSM框架jsp页面俩个参数作为查询条件查值显示在页面上
- EasyUi+Spring Data 实现按条件分页查询的实例代码
- 三大框架中模糊查询代码
- 按条件模糊查询及分页查询
- XMPP框架 微信项目开发之CoreData学习——CoreData的查询方式(模糊查询,嵌套查询,分页查询)
- 使用Ef框架进行分页..EF模糊查询..EF多表内连接查询
- java操作mongdb多条件复合查询(包括模糊查询和按时间段查询),分页