`
citygu
  • 浏览: 27632 次
  • 性别: Icon_minigender_1
  • 来自: CZ
社区版块
存档分类
最新评论

多条件参数查询防SQL注入分页写法

    博客分类:
  • JAVA
 
阅读更多

先附上DAO方法:有两个方法构成。一个查询一页内的数据记录,一个查询记录总数。

map里存放这查询条件和参数值 还有第几页,一页多少行

@Override
	@SuppressWarnings("unchecked")
	public List selectStudentsList(Map map) {
		/**
		*对方法功能的描述
		*@param参数1
		*@param参数2
		*@return 返回类型
		*@throws这个方法所抛出的异常
		*/
		StringBuffer sb=new StringBuffer("SELECT s.NO_ as return1,u.NAME_ as return2,u.SEX_ as return3,sub.SHORT_TITLE_ as return4,g.NAME_ as return5,c.NAME_ as return6 FROM users_ u,login_ l, students_ s LEFT JOIN spe_subject_ sub ON s.PRO_ID_ = sub.ID_ LEFT JOIN grade_ g ON s.GRADE_ = g.ID_ LEFT JOIN classes_ c ON s.CLASS_ID_ = c.ID_ WHERE s.NO_=u.ID_ AND l.ID_=s.NO_ ");
		Vector vector=new Vector();
		if(map.get("no")!=null){
			sb.append(" and s.NO_ like ?");
			vector.add("%"+(String)map.get("no")+"%");
		}
		if(map.get("name")!=null){
			sb.append(" and u.NAME_ like ?");
			vector.add("%"+(String)map.get("name")+"%");
		}
		if(map.get("sex")!=null){
			sb.append(" and u.SEX_=?");
			vector.add((String)map.get("sex"));
		}
		if(map.get("proId")!=null){
			sb.append(" and s.PRO_ID_=?");
			vector.add((String)map.get("proId"));
		}
		if(map.get("grade")!=null){
			sb.append(" and s.GRADE_=?");
			vector.add((String)map.get("grade"));
		}
		if(map.get("classId")!=null){
			sb.append(" and s.CLASS_ID_ =?");
			vector.add((String)map.get("classId"));
		}
		sb.append(" and (l.ACCOUNT_STATUS_!='5' or l.ACCOUNT_STATUS_ is NULL)");
		sb.append(" order by s.NO_ asc limit "+(Integer)map.get("begin")+","+(Integer)map.get("size"));
//		System.out.println(sb.toString());
		List list=getJdbcTemplate().queryForList(sb.toString(),vector.toArray());
		List resList=new ArrayList();
		for(Map imap:(List<Map>)list){
			ReturnBean rb=new ReturnBean();
			rb.setReturn1((String)imap.get("return1"));
			rb.setReturn2((String)imap.get("return2"));
			rb.setReturn3((String)imap.get("return3"));
			rb.setReturn4((String)imap.get("return4"));
			rb.setReturn5((String)imap.get("return5"));
			rb.setReturn6((String)imap.get("return6"));
			resList.add(rb);
		}
		return resList;
	}
 
@Override
	@SuppressWarnings("unchecked")
	public int selectStudentsLength(Map map) {
		StringBuffer sb=new StringBuffer("SELECT count(s.NO_) FROM users_ u,login_ l, students_ s  WHERE s.NO_=u.ID_ AND l.ID_=s.NO_ ");
		Vector vector=new Vector();
		if(map.get("no")!=null){
			sb.append(" and s.NO_ like ?");
			vector.add("%"+(String)map.get("no")+"%");
		}
		if(map.get("name")!=null){
			sb.append(" and u.NAME_ like ?");
			vector.add("%"+(String)map.get("name")+"%");
		}
		if(map.get("sex")!=null){
			sb.append(" and u.SEX_=?");
			vector.add((String)map.get("sex"));
		}
		if(map.get("proId")!=null){
			sb.append(" and s.PRO_ID_=?");
			vector.add((String)map.get("proId"));
		}
		if(map.get("grade")!=null){
			sb.append(" and s.GRADE_=?");
			vector.add((String)map.get("grade"));
		}
		if(map.get("classId")!=null){
			sb.append(" and s.CLASS_ID_ =?");
			vector.add((String)map.get("classId"));
		}

		sb.append(" and (l.ACCOUNT_STATUS_!='5' or l.ACCOUNT_STATUS_ is NULL)");
		return getJdbcTemplate().queryForInt(sb.toString(),vector.toArray());
	}

 查询的业务方法:查询结果会包装到PageInfo的Bean中

@Override
	public PageInfo findStudentsToPage(Map map) {
		PageInfo pageInfo=new PageInfo();
		pageInfo.setPageIndex((Integer)map.get("pageIndex"));
		map.put("begin", (pageInfo.getPageIndex()-1)*pageInfo.getPageSize());
		map.put("size", pageInfo.getPageSize());
		pageInfo.setPageList(studentsDAO.selectStudentsList(map));
		pageInfo.setTotalNum(studentsDAO.selectStudentsLength(map));
		pageInfo.countPageNum();
		return pageInfo;
	}
 

 

分享到:
评论

相关推荐

    Hibernate中,利用Criteria查询容器实现sql的写法

    它可以方便地处理复杂的查询逻辑,如子查询、连接查询、多条件组合等。同时,由于是面向对象的API,它能够避免SQL注入攻击,提高代码的安全性。 至于标签中的"源码",可能是指该文章深入探讨了Criteria API的底层...

    SSH分页技术详解与实例

    在SSH分页中,我们通常利用Hibernate的Query或Criteria API来执行带有分页条件的SQL语句,获取指定范围的数据。 **分页实现步骤**: 1. **设计模型**:定义一个实体类,例如`Product`,并创建对应的Hibernate映射...

    php 的简单分页原理

    同时,为了避免SQL注入,应使用预处理语句或参数化查询。 总结来说,PHP的简单分页原理主要是通过获取用户请求的页数,计算出对应的偏移量,然后结合每页显示的记录数,构造带有`LIMIT`的SQL查询来实现数据分页。在...

    1000道互联网Java架构师面试题

    * #{ }:用于参数的安全处理,防止 SQL 注入攻击。 * ${ }:用于字符串的拼接,需要手动处理参数的安全问题。 当实体类中的属性名和表中的字段名不一样,怎么办? 当实体类中的属性名和表中的字段名不一样,可以...

    HibernateDAO的写法

    - 分页查询:避免一次性加载大量数据,采用分页策略减少内存消耗。 - 缓存机制:利用Hibernate的缓存策略,如一级缓存(Session级别)和二级缓存(SessionFactory级别),提高数据访问速度。 通过以上分析,我们...

    asp.net DBHelper类的写法实例

    5. **参数化查询**:为了防止SQL注入攻击,DBHelper类应支持参数化查询,即使用Command对象的Parameters属性添加参数,并在SQL语句中使用占位符(如@paramName)。 以下是一个简单的DBHelper类的代码实现: ```...

    MyBatis的27道面试题

    在MyBatis中,使用#{}和${}两种方式获取参数时,它们的差别主要在于:#{}是预编译处理,它会将参数预编译到SQL语句中,可以有效防止SQL注入,而${}是直接将参数拼接在SQL语句中,不推荐使用。当实体类属性与数据库...

    MyBatis中的模糊查询语句

    虽然MyBatis能自动处理参数绑定,但使用`%${value}%`的方式仍然存在SQL注入的风险,因为用户可以直接输入`%`字符。为了提高安全性,可以使用MyBatis的`#{}`语法,它会将参数值转义并用单引号包围,如`LIKE '%' || #{...

    1000道 互联网大厂Java工程师面试题(1)(1)(1).pdf

    5. **#{} 和 ${} 的区别**:#{} 表示占位符,预编译参数可以防止 SQL 注入;而 ${} 表示字符串替换,直接将参数内容拼接在 SQL 中,可能会引起 SQL 注入。 6. **属性名和字段名不一致的处理**:可以使用别名或者在 ...

    tp5.1 框架数据库高级查询技巧实例总结

    在使用数组方式进行查询时,要注意防止SQL注入。当用户提交的数据参与查询时,应确保数据经过验证或过滤。例如,使用用户输入的变量时,像`['name', 'like', $name . '%']`,确保$name是安全的。如果包含动态条件,...

    mybatis-plus 实践及架构原理

    Mybatis-Plus在Mybatis的基础上提供了一套扩展机制,它通过插件的形式实现了各种功能的增强,比如分页插件、SQL注入等。这些插件可以在启动加载XML配置时注入,对单表SQL操作提供支持。Mybatis-Plus尽可能地不改变...

    2021最新Java程序员面试题

    - #{}和${}区别:#{}是预编译处理,${}是字符串替换,前者更安全防止SQL注入。 - 属性名和字段名不同时的处理方法:使用别名映射。 - 模糊查询like语句写法:通配符为%(百分号)。 - Dao接口的工作原理:通过...

    针对mybatis3 基本环境搭建优化(一) .

    2. **参数绑定**:使用 `#{}` 语法绑定参数,避免 SQL 注入,同时也能提高 SQL 执行效率。 3. **分页查询**:当需要大量数据时,使用分页查询,可以减少内存消耗和提高响应速度。 4. **缓存机制**:MyBatis 提供了...

    Codeigniter操作数据库表的优化写法总结

    参数绑定是安全且高效的查询方式,可以防止SQL注入: ```php $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; $this-&gt;db-&gt;query($sql, array(3, 'live', 'Rick')); // 参数绑定 ``...

    mybatis-plus快速入门手册,包含源代码样例Demo以及数据库源文件,带你快速上手CRUD,项目中不求人!

    基于 MyBatis 的物理分页,只需简单配置,即可实现分页查询,与普通 List 查询写法一致。 10. **多数据库支持**: 分页插件兼容多种数据库,如 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、PostgreSQL、SQL ...

    Java相关课程系列笔记之十四Hibernate学习笔记

    - 容易出现SQL注入等安全问题。 - 缺乏对对象模型的支持,需手动处理对象关系映射。 1.4 Hibernate的设计思想 Hibernate基于POJO(Plain Old Java Object)和面向对象的设计原则,遵循“贫血”模型,将数据操作封装...

    PHP新浪面试题,面试必看。

    为了防止 SQL 注入攻击,应该使用预处理语句或参数化查询,并且对用户输入的数据进行严格的过滤和转义。 #### 9. MySQL 数据库表关联的一般步骤是什么? 数据库表关联通常涉及 JOIN 操作,可以是 INNER JOIN、LEFT ...

    程序员面试秘籍.docx

    比如,模糊查询like语句的写法,以及分页查询的实现,MyBatis的分页插件原理等。 4. **ORM框架**:MyBatis的映射方式包括Map映射、注解映射和XML映射,面试中可能会要求解释它们是如何将SQL结果封装为目标对象并...

    Java学习笔记-个人整理的

    {13.5}分页查询}{196}{section.13.5} {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {13.6.1}Wrapper}{199}{subsection.13.6.1} {13.7}DAO}{199}{section.13.7} {13.8}java.util....

Global site tag (gtag.js) - Google Analytics