分页查询集成模糊条件查询的写法(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>

总结

  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 ‘%\%%’
○ 注意:
§ 尽量在保存数据时,验证数据的合法性,尽量避免存在的字符串中含有特殊符号.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值