先附上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;
}
分享到:
相关推荐
它可以方便地处理复杂的查询逻辑,如子查询、连接查询、多条件组合等。同时,由于是面向对象的API,它能够避免SQL注入攻击,提高代码的安全性。 至于标签中的"源码",可能是指该文章深入探讨了Criteria API的底层...
在SSH分页中,我们通常利用Hibernate的Query或Criteria API来执行带有分页条件的SQL语句,获取指定范围的数据。 **分页实现步骤**: 1. **设计模型**:定义一个实体类,例如`Product`,并创建对应的Hibernate映射...
同时,为了避免SQL注入,应使用预处理语句或参数化查询。 总结来说,PHP的简单分页原理主要是通过获取用户请求的页数,计算出对应的偏移量,然后结合每页显示的记录数,构造带有`LIMIT`的SQL查询来实现数据分页。在...
* #{ }:用于参数的安全处理,防止 SQL 注入攻击。 * ${ }:用于字符串的拼接,需要手动处理参数的安全问题。 当实体类中的属性名和表中的字段名不一样,怎么办? 当实体类中的属性名和表中的字段名不一样,可以...
- 分页查询:避免一次性加载大量数据,采用分页策略减少内存消耗。 - 缓存机制:利用Hibernate的缓存策略,如一级缓存(Session级别)和二级缓存(SessionFactory级别),提高数据访问速度。 通过以上分析,我们...
5. **参数化查询**:为了防止SQL注入攻击,DBHelper类应支持参数化查询,即使用Command对象的Parameters属性添加参数,并在SQL语句中使用占位符(如@paramName)。 以下是一个简单的DBHelper类的代码实现: ```...
在MyBatis中,使用#{}和${}两种方式获取参数时,它们的差别主要在于:#{}是预编译处理,它会将参数预编译到SQL语句中,可以有效防止SQL注入,而${}是直接将参数拼接在SQL语句中,不推荐使用。当实体类属性与数据库...
虽然MyBatis能自动处理参数绑定,但使用`%${value}%`的方式仍然存在SQL注入的风险,因为用户可以直接输入`%`字符。为了提高安全性,可以使用MyBatis的`#{}`语法,它会将参数值转义并用单引号包围,如`LIKE '%' || #{...
5. **#{} 和 ${} 的区别**:#{} 表示占位符,预编译参数可以防止 SQL 注入;而 ${} 表示字符串替换,直接将参数内容拼接在 SQL 中,可能会引起 SQL 注入。 6. **属性名和字段名不一致的处理**:可以使用别名或者在 ...
在使用数组方式进行查询时,要注意防止SQL注入。当用户提交的数据参与查询时,应确保数据经过验证或过滤。例如,使用用户输入的变量时,像`['name', 'like', $name . '%']`,确保$name是安全的。如果包含动态条件,...
Mybatis-Plus在Mybatis的基础上提供了一套扩展机制,它通过插件的形式实现了各种功能的增强,比如分页插件、SQL注入等。这些插件可以在启动加载XML配置时注入,对单表SQL操作提供支持。Mybatis-Plus尽可能地不改变...
- #{}和${}区别:#{}是预编译处理,${}是字符串替换,前者更安全防止SQL注入。 - 属性名和字段名不同时的处理方法:使用别名映射。 - 模糊查询like语句写法:通配符为%(百分号)。 - Dao接口的工作原理:通过...
2. **参数绑定**:使用 `#{}` 语法绑定参数,避免 SQL 注入,同时也能提高 SQL 执行效率。 3. **分页查询**:当需要大量数据时,使用分页查询,可以减少内存消耗和提高响应速度。 4. **缓存机制**:MyBatis 提供了...
参数绑定是安全且高效的查询方式,可以防止SQL注入: ```php $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; $this->db->query($sql, array(3, 'live', 'Rick')); // 参数绑定 ``...
基于 MyBatis 的物理分页,只需简单配置,即可实现分页查询,与普通 List 查询写法一致。 10. **多数据库支持**: 分页插件兼容多种数据库,如 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、PostgreSQL、SQL ...
- 容易出现SQL注入等安全问题。 - 缺乏对对象模型的支持,需手动处理对象关系映射。 1.4 Hibernate的设计思想 Hibernate基于POJO(Plain Old Java Object)和面向对象的设计原则,遵循“贫血”模型,将数据操作封装...
为了防止 SQL 注入攻击,应该使用预处理语句或参数化查询,并且对用户输入的数据进行严格的过滤和转义。 #### 9. MySQL 数据库表关联的一般步骤是什么? 数据库表关联通常涉及 JOIN 操作,可以是 INNER JOIN、LEFT ...
比如,模糊查询like语句的写法,以及分页查询的实现,MyBatis的分页插件原理等。 4. **ORM框架**:MyBatis的映射方式包括Map映射、注解映射和XML映射,面试中可能会要求解释它们是如何将SQL结果封装为目标对象并...
{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....