您的位置:首页 > 编程语言

分页查询集成模糊条件查询的写法(SSM框架)提高代码重用性

2018-12-01 21:51 1446 查看

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>

总结

  1. 页面向controller层传递三个参数
    1.当前页数,
    2.每页显示记录数
    3.模糊查询条件
  2. 如果控制层判断查询条件为空则map集合中不会加入queryText
  3. service层获得dao层查到的数据和总记录数,并封装入page对象,当前页和每页记录数也需要封装
  4. 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 ‘%\%%’
○ 注意:
§ 尽量在保存数据时,验证数据的合法性,尽量避免存在的字符串中含有特殊符号.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: