基于 SSH 框架的 Criteria 和 DetachedCriteria 多条件查询
Hibernate 定义了 CriteriaSpecification 接口规范用来完成面向对象的条件查询,Criteria 和 DetachedCriteria 就是 CriteriaSpecification 的子接口。
在进行本篇的内容之前,我们先来大致说一说 Criteria 和 DetachedCriteria 的主要区别:
Criteria 和 DetachedCriteria 的创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需 Session。
本篇完整实现如下:
一、导 jar 包
antlr-2.7.6.jar
asm-commons-3.3.jar
commons-collections-3.1.jar
commons-fileupload-1.3.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
commons-logging-1.1.3.jar
dom4j-1.6.1.jar
freemarker-2.3.19.jar
hibernate3.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
mysql-connector-java-5.0.8-bin.jar
ognl-3.0.6.jar
slf4j-api-1.6.1.jar
spring-beans-4.3.8.RELEASE.jar
spring-context-4.3.8.RELEASE.jar
spring-core-4.3.8.RELEASE.jar
spring-expression-4.3.8.RELEASE.jar
spring-jdbc-4.3.8.RELEASE.jar
spring-orm-4.3.8.RELEASE.jar
spring-tx-4.3.8.RELEASE.jar
spring-web-4.3.8.RELEASE.jar
struts2-core-2.3.15.3.jar
struts2-spring-plugin-2.3.15.3.jar
xwork-core-2.3.15.3.jar
二、配置 Struts2 核心过滤器 (web.xml)
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
三、Jsp 表单查询页 (list.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()
+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
<form action="${pageContext.request.contextPath}/queryCourseByCondition.action"
method="post">
<table width="88%" border="" class="emp_table" style="width:80%;"> <tr>
<td width="20%">姓名:</td>
<td><input type="text" name="userName" size="" value="" /></td>
</tr> <tr>
<td >性别:</td>
<td > <select name="gender" id="sex">
<option value="">--选择性别--</option>
<option value="男">男</option>
<option value="女">女</option>
</select>
</td>
</tr> <tr>
<td >年龄:</td>
<td ><input type="text" name="ageStart" size="" value="" /> 至 <input
type="text" name="ageEnd" size="" value="" /></td>
</tr> <tr>
<td>是否上传简历:</td>
<td ><select name="isUpload" id="isUpload">
<option value="">--请选择--</option>
<option value="">有</option>
<option value="">无</option>
</select>
</td>
</tr> <tr>
<td>信息备注:</td>
<td><input type="text" name="remark" size="" value="" /></td>
</tr> </table><br>
<input type="submit" value="查询"/>
<hr>
<table width="97%" border="" > <tr class="henglan" style="font-weight:bold;">
<td width="14%" align="center">姓名</td>
<td width="13%" align="center">性别</td>
<td width="13%" align="center">年龄</td>
<td width="18%" align="center">简历</td>
<td width="20%" align="center">备注</td>
</tr> <%--数据展示 --%>
<s:iterator>
<tr class="tabtd1">
<td align="center"><s:property value="userName"/> </td>
<td align="center"><s:property value="gender"/></td>
<td align="center"><s:property value="age"/></td>
<td align="center"><s:property value="fileName"/></td>
<td align="center"><s:property value="remark"/></td>
</tr>
</s:iterator>
</table>
</form>
</body>
</html>
四、封装 UserBean (User.java)
package com.fhcq.bean; import java.io.Serializable; public class User implements Serializable { private Integer userID;
private String userName;
private String gender;
private Integer age;
private String fileName;
private String remark; public Integer getUserID() {
return userID;
}
public void setUserID(Integer userID) {
this.userID = userID;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
} }
五、配置数据库表生成策略 (User.hbm.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.fhcq.bean"> <!-- name是类名 如果有包就不用写全类名,否则要写。 table 表示对应的表名 。建议都要写 -->
<class name="User" table="user"> <!--使用Id配置主键 必须配置 -->
<id name="userID" column="userID">
<!--目前照常,主键生成策略 -->
<generator class="native"></generator>
</id> <property name="userName" column="userName"></property>
<property name="gender" column="gender"></property>
<property name="age" column="age"></property>
<property name="filename" column="filename"></property>
<property name="remark" column="remark"></property> </class>
</hibernate-mapping>
六、设置数据库连接参数 (hibernate.cfg.xml)
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory name="foo"> <!-- 配置数据库驱动 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- 要连接数控的用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 密码 -->
<property name="hibernate.connection.password">123456</property>
<!-- 连接数据库的路径 那个服务器 那个数据库 -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/usermanager
</property> <!-- 操作的时候显示操做过程中的sql语句 -->
<property name="show_sql">true</property>
<!-- 格式化它要显示的sql语句 -->
<property name="format_sql">true</property>
<!-- 是否要自动创建表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 事务自动提交 -->
<property name="connection.autocommit">true</property> <!-- 优化选项 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 导入映射文件 -->
<mapping resource="com/fhcq/bean/User.hbm.xml" /> </session-factory>
</hibernate-configuration>
七、配置 Struts (struts.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!--修改struct2称为开发模式,修改配置之后会自动加载 -->
<constant name="struts.devMode" value="true"></constant> <package name="package1" extends="struts-default">
<!-- 多条件查询 -->
<action name="queryCourseByCondition"
class="com.fhcq.action.QueryUserByConditionAction"
method="queryCourseByCondition">
<result name="success">/index.jsp</result>
</action>
</package> </struts>
八、表示层
8.1、QueryUserByConditionAction
package com.fhcq.action; import java.util.List; import com.fhcq.bean.User;
import com.fhcq.service.IUserService;
import com.fhcq.service.UserServiceImpl;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack; public class QueryUserByConditionAction extends ActionSupport implements
ModelDriven<User>{ User user= new User();
private String ageStart;
private String ageEnd;
private String isUpload;
IUserService service; public String queryCourseByCondition(){ String userName = user.getUserName();
String gender = user.getGender();
String remark = user.getRemark(); List<User> userlist = service.queryUserByCondition
(userName,gender,ageStart,ageEnd,isUpload,remark);
System.out.println("QueryUserByConditionAction queryUser() userlist=
"+userlist); ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
valueStack.push(userlist); return SUCCESS;
} @Override
public User getModel() {
// TODO Auto-generated method stub
return user;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public String getIsUpload() {
return isUpload;
} public void setIsUpload(String isUpload) {
this.isUpload = isUpload;
} public String getAgeStart() {
return ageStart;
} public void setAgeStart(String ageStart) {
this.ageStart = ageStart;
} public String getAgeEnd() {
return ageEnd;
} public void setAgeEnd(String ageEnd) {
this.ageEnd = ageEnd;
} public IUserService getService() {
return service;
} public void setService(IUserService service) {
this.service = service;
} }
九、业务层
9.1、QueryUserService
package com.fhcq.service; import java.util.List; import com.fhcq.bean.User; public interface IUserService { List<User> queryUserByCondition(String userName, String gender,String ageStart,
String ageEnd, String isUpload,String remark);
}
9.2、QueryUserServiceImpl
package com.fhcq.service; import java.util.List; import com.fhcq.bean.User;
import com.fhcq.dao.IUserDao;
import com.fhcq.dao.UserDaoImpl; public class UserServiceImpl implements IUserService{ IUserDao dao; @Override
public List<User> queryUserByCondition(String userName, String gender,
String ageStart, String ageEnd, String isUpload,String remark) {
// TODO Auto-generated method stub
List<User> queryUserByCondition = dao.queryUserByCondition
(userName,gender,ageStart,ageEnd,isUpload,remark);
return queryUserByCondition;
} public IUserDao getDao() {
return dao;
} public void setDao(IUserDao dao) {
this.dao = dao;
} }
十、数据持久化层
10.1、QueryUserDao
package com.fhcq.dao; import java.util.List; import com.fhcq.bean.User; public interface IUserDao { List<User> queryUserByCondition(String userName, String gender, String ageStart,
String ageEnd, String isUpload, String remark); }
Criteria 在线实现多条件查询:
10.2、配置 Spring (applicationContext.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myUserDaoImpl" class="com.fhcq.dao.UserDaoImpl"></bean> <bean id="service" class="com.fhcq.service.UserServiceImpl" >
<property name="dao" ref="myUserDaoImpl"></property>
</bean> </beans>
10.3、HibernateUtils 方法封装
package com.fhcq.utils; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtils { static SessionFactory sessionFactory;
static {
Configuration configure = new Configuration().configure();
sessionFactory = configure.buildSessionFactory();
//增加 关闭虚拟机的时候自动释放
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("当运行结束的时候执行!");
sessionFactory.close();
}
}));
} public static Session getSession(){
Session openSession = sessionFactory.openSession();
return openSession;
} public static Session getCurrentSession(){
Session openSession = sessionFactory.getCurrentSession();
return openSession;
}
}
10.4、QueryUserDaoImpl
package com.fhcq.dao; import java.util.List; import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.fhcq.bean.User;
import com.fhcq.utils.HibernateUtils; public class UserDaoImpl implements IUserDao{ @Override
public List<User> queryUserByCondition(String userName, String gender,
String ageStart, String ageEnd, String isUpload, String remark) {
// TODO Auto-generated method stub //如果查询页所有条件都没未填选的话,点击查询按钮则查询所有用户
if(StringUtils.isBlank(userName) && StringUtils.isBlank(gender) &&
StringUtils.isBlank(ageStart) && StringUtils.isBlank(ageEnd) &&
StringUtils.isBlank(isUpload) && StringUtils.isBlank(remark)){ Session session = HibernateUtils.getSession();
session.beginTransaction();
//-----------------------------
Query createQuery = session.createQuery("from User");
List<User> userlist = createQuery.list();
//------------------------------
session.getTransaction().commit();
session.close();
return userlist; }else{ Configuration configure = new Configuration().configure();
SessionFactory sessionFactory = configure.buildSessionFactory();
Session openSession = sessionFactory.openSession();
//------------------------------ Criteria createCriteria = openSession.createCriteria(User.class); if(StringUtils.isNotBlank(userName)){
createCriteria.add(Restrictions.like("userName", userName.replace
("", "")));
}
if(StringUtils.isNotBlank(gender)){
createCriteria.add(Restrictions.eq("gender", gender));
}
if(StringUtils.isNotBlank(ageStart)){
Integer ageStart1 =Integer.parseInt(ageStart);
createCriteria.add(Restrictions.ge("age", ageStart1));
}
if(StringUtils.isNotBlank(ageEnd)){
Integer ageEnd1 =Integer.parseInt(ageEnd);
createCriteria.add(Restrictions.le("age", ageEnd1));
}
if(StringUtils.isNotBlank(isUpload)){ if("".equals(isUpload)){ createCriteria.add(Restrictions.isNotNull("fileName")); }else{ createCriteria.add(Restrictions.isNull("fileName"));
} }
if(StringUtils.isNotBlank(remark)){
createCriteria.add(Restrictions.like("remark",
remark.replace("", "")));
} List userlist = createCriteria.list(); //------------------------------
openSession.close();
sessionFactory.close();
return userlist; }
}
}
DetachedCriteria 离线实现多条件查询:
10.2、配置 Spring (applicationContext.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="mysessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- hibernate.cfg.xml 告诉springHibernate的配置文件在哪 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml">
</property>
</bean> <bean id="myHibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="mysessionFactory"></property>
</bean> <bean id="myuserDaoImpl" class="com.fhcq.dao.UserDaoImpl">
<property name="hibernateTemplate" ref="myHibernateTemplate"></property>
</bean> <bean id="service" class="com.fhcq.service.UserServiceImpl" >
<property name="dao" ref="myuserDaoImpl"></property>
</bean> </beans>
10.3、QueryUserDaoImpl
package com.fhcq.dao; import java.util.List; import org.apache.commons.lang3.StringUtils;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.MatchMode;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.fhcq.bean.User; public class UserDaoImpl extends HibernateDaoSupport implements IUserDao{ List<User> findByCriteria ; @Override
public List<User> queryUserByCondition(String userName, String gender,
String ageStart, String ageEnd,String isUpload, String remark) {
// TODO Auto-generated method stub
//如果查询页所有条件都没未填选的话,点击查询按钮则查询所有用户
if(StringUtils.isBlank(userName) && StringUtils.isBlank(gender) &&
StringUtils.isBlank(ageStart) && StringUtils.isBlank(ageEnd) &&
StringUtils.isBlank(isUpload) && StringUtils.isBlank(remark)){ findByCriteria = (List<User>) getHibernateTemplate().findByCriteria
(DetachedCriteria.forClass(User.class)); }else{ DetachedCriteria forClass = DetachedCriteria.forClass(User.class);
if(StringUtils.isNotBlank(userName)){
forClass.add(Restrictions.like("userName", userName.replace
("", ""), MatchMode.ANYWHERE));
}
if(StringUtils.isNotBlank(gender)){
forClass.add(Restrictions.eq("gender", gender));
}
if(StringUtils.isNotBlank(ageStart)){
Integer ageStart1 =Integer.parseInt(ageStart);
forClass.add(Restrictions.ge("age", ageStart1));
}
if(StringUtils.isNotBlank(ageEnd)){
Integer ageEnd1 =Integer.parseInt(ageEnd);
forClass.add(Restrictions.le("age", ageEnd1));
}
if(StringUtils.isNotBlank(isUpload)){ if("".equals(isUpload)){ forClass.add(Restrictions.isNotNull("fileName"));
}else{ forClass.add(Restrictions.isNull("fileName"));
}
}
if(StringUtils.isNotBlank(remark)){
forClass.add(Restrictions.like("remark",remark.replace
("", ""), MatchMode.ANYWHERE));
} findByCriteria = (List<User>) getHibernateTemplate().findByCriteria
(forClass);
}
if(findByCriteria.size()>0){
return findByCriteria;
}
return null;
} }
基于 SSH 框架的 Criteria 和 DetachedCriteria 多条件查询的更多相关文章
- 基于SSH框架的学生公寓管理系统的质量属性
系统名称:学生公寓管理系统 首先介绍一下学生公寓管理系统,在学生公寓管理方面,针对学生有关住宿信息问题进行管理,学生公寓管理系统主要包含了1)学生信息记录:包括学号.姓名.性别.院系.班级:2)住宿信 ...
- 基于ssh框架的在线考试系统开发的质量属性
我做的系统是基于ssh框架的在线考试系统.在线考试系统有以下几点特性:(1)系统响应时间需要非常快,可以迅速的出题,答题.(2)系统的负载量也需要非常大,可以支持多人在线考试(3)还有系统的安全性也需 ...
- 基于SSH框架的考勤管理系统的设计与实现
基于SSH框架的考勤管理系统的设计与实现
- 基于SSH框架的在线考勤系统开发的质量属性
我要开发的是一个基于SSH框架的在线考勤系统. 质量属性是指影响质量的相关因素,下面我将分别从6个系统质量属性(可用性,易用性,可修改性,性能,安全性,可测试性)来分析我的系统,以及如何实现这些质量属 ...
- 基于SSH框架开发的《高校大学生选课系统》的质量属性的实现
基于SSH框架开发的<高校大学生选课系统>的质量属性的实现 对于可用性采取的是错误预防战术,即阻止错误演变为故障:在本系统主要体现在以下两个方面:(1)对于学生登录模块,由于初次登陆,学生 ...
- 如何实现基于ssh框架的投票系统的的质量属性
如何实现基于ssh框架的投票系统的的质量属性: 项目 :网上考试系统 我做的是网上考试系统,因为标准化的考试越来越重要,而通过计算机进行标准化判卷,系统会自动判卷出成绩,组织考试的人不用组织人员打印试 ...
- 基于SSH框架的学生选课质量属性分析
系统:学生选课系统 框架:SSH(Struts2+Spring+Hibernate) 我做的是基于SSH框架的学生选课系统.学生选课系统的特性:①系统响应时间短,能够快速调出课程数据供学生选课提交.② ...
- 基于SSH框架的网上书店系统开发的质量属性
基于SSH框架的网上书店系统开发的质量属性 对于我的基于SSH框架的网上书店系统的开发要实现的质量属性有可用性.可修改性.性能.安全性.易用性和可测试性. 1.对于可用性方面的战术: 可用性(Avai ...
- 文献综述十八:基于SSH框架的进销存管理系统设计与实现
一.基本信息 标题:基于SSH框架的进销存管理系统设计与实现 时间:2017 出版源:内蒙古科技与经济 文件分类:对框架的研究 二.研究背景 进销存管理系统在各企业中广泛应用,使用SSH框架,很大程度 ...
随机推荐
- SourceTree使用SSH克隆码云项目
SourceTree使用SSH克隆码云项目 觉得有用的话,欢迎一起讨论相互学习~Follow Me SourceTree使用SSH克隆码云项目 参考文献 https://blog.csdn.net/q ...
- [SDOI2016 Round1] 数字配对
COGS 2221. [SDOI2016 Round1] 数字配对 http://www.cogs.pro/cogs/problem/problem.php?pid=2221 ★★★ 输入文件:m ...
- ASP.NET项目与IE10、IE11不兼容的解决办法
1.解决办法 机器级别修复, 服务器所有ASP.NET程序受益 需要去微软下载对应asp.NET版本的修补程序 .NET 4 -http://support.microsoft.com/kb/2600 ...
- HDU 1259 ZJUTACM
解题报告:就用了一个swap函数就行了. #include<cstdio> #include<iostream> int main() { int x,y,T,n; scanf ...
- python练习-Socket实现远程cmd命令
需求:基于tcp的套接字实现远程执行命令的操作 代码示例: # 编辑者:闫龙 #Client端部分 import socket #导入骚凯特模块 CmdObj = socket.socket(sock ...
- python进阶之函数和类内建魔法属性
前言 关于对象的魔法方法我们已经讲得太多,但是对于类或函数内建的魔法属性和功能我们涉及较少,下面系统了解一下类和函数的内建属性. 查看内建属性 class Person(object): pass d ...
- Linux堆内存管理深入分析 (上半部)【转】
转自:http://www.cnblogs.com/alisecurity/p/5486458.html Linux堆内存管理深入分析(上半部) 作者:走位@阿里聚安全 0 前言 近年来,漏洞挖掘越来 ...
- vue总结 06组件
组件基础 基本示例 这里有一个 Vue 组件的示例: // 定义一个名为 button-counter 的新组件Vue.component('button-counter', { data: func ...
- 通过field:global给子元素添加css样式
{dede:arclist row=5 typeid=200} <li [field:global runphp=’yes’ name=autoindex](@me==1)?@me=”class ...
- thinkphp5与thinkphp3.X对比
原文https://www.cnblogs.com/wupeiky/p/5850108.html 首先声明本章节并非是指导升级旧的项目到5.0,而是为了使用3.X版本的开发者更快的熟悉并上手这个全新的 ...