Hibernate(四)
==================================投影(查询)=============================
投影查询:查询一个持久化类的一个或多个属性值
1.将每条查询结果封装成Object对象
2.将每条查询结果封装成Object数组
3.将每条查询结果通过构造函数封装成对象
范例1:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.Elastic.HibernateDemo3.ivy.entity.Dept
[L:数组
1 package com.Elastic.HibernateDemo3.ivy.test; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import org.hibernate.Query; 6 import org.hibernate.SQLQuery; 7 import org.hibernate.Session; 8 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 9 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 10 public class Test { 11 public static void main(String[] args) { 12 Session session = HibernateUtil.getSession(); 13 14 String hql = "select deptName,location from Dept"; 15 16 Query query = session.createQuery(hql); 17 18 //2.将每条查询结果封装成Object数组 19 List<Dept> depts = query.list(); 20 for (Dept dept : depts) { 21 System.out.println(dept.getDeptName()); 22 } 23 } 24 }
范例2: Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: expecting OPEN, found '[' near line 1, column 16 [select new Dept[deptName,location] from com.Elastic.HibernateDemo3.ivy.entity.Dept]
1 package com.Elastic.HibernateDemo3.ivy.test; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import org.hibernate.Query; 6 import org.hibernate.SQLQuery; 7 import org.hibernate.Session; 8 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 9 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 10 public class Test { 11 public static void main(String[] args) { 12 Session session = HibernateUtil.getSession(); 13 14 //3.将每条查询结果通过构造函数封装成对象 15 String hql = "select new Dept[deptName,location] from Dept"; 16 17 Query query = session.createQuery(hql); 18 19 List<Dept> depts = query.list(); 20 for (Dept dept : depts) { 21 System.out.println(dept.getDeptName()); 22 } 23 } 24 }
范例3:Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: expecting OPEN, found '[' near line 1, column 16 [select new Dept[deptName,location] from com.Elastic.HibernateDemo3.ivy.entity.Dept]
1 package com.Elastic.HibernateDemo3.ivy.test; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import org.hibernate.Query; 6 import org.hibernate.SQLQuery; 7 import org.hibernate.Session; 8 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 9 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 10 public class Test { 11 public static void main(String[] args) { 12 Session session = HibernateUtil.getSession(); 13 14 String hql = "select new Dept[deptName,location] from Dept"; 15 16 Query query = session.createQuery(hql); 17 18 //2.将每条查询结果封装成Object数组 19 <Object> objs = query.list(); 20 for (Object object : objs) { 21 System.out.println(object); 22 } 23 } 24 }
范例4:Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: expecting OPEN, found '[' near line 1, column 16 [select new Dept[deptName,location] from com.Elastic.HibernateDemo3.ivy.entity.Dept]
1 package com.Elastic.HibernateDemo3.ivy.test; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import org.hibernate.Query; 6 import org.hibernate.SQLQuery; 7 import org.hibernate.Session; 8 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 9 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 10 public class Test { 11 public static void main(String[] args) { 12 Session session = HibernateUtil.getSession(); 13 //将每条查询结果封装成Object数组与将每条查询结果通过构造函数封装成对象只能选其一??? 14 String hql = "select new Dept[deptName,location] from Dept"; 15 Query query = session.createQuery(hql); 16 List<Object[]> depts = query.list(); 17 for (Object[] objects : depts) { 18 System.out.println(objects[0].toString() + objects[1]); 19 } 20 } 21 }
正确范例:
1 import java.util.HashMap; 2 import java.util.List; 3 import java.util.Map; 4 import org.hibernate.Query; 5 import org.hibernate.SQLQuery; 6 import org.hibernate.Session; 7 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 8 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 9 public class Test { 10 public static void main(String[] args) { 11 Session session = HibernateUtil.getSession(); 12 String hql = "select deptName,location from Dept"; 13 Query query = session.createQuery(hql); 14 List<Object[]> depts = query.list(); 15 for (Object[] objects : depts) { 16 System.out.println(objects[0].toString() + objects[1]); 17 } 18 } 19 }
========================================分页查询===============================================
范例:
1 package com.Elastic.HibernateDemo3.ivy.test; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import org.hibernate.Query; 6 import org.hibernate.SQLQuery; 7 import org.hibernate.Session; 8 import com.Elastic.HibernateDemo3.ivy.entity.Dept; 9 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 10 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 11 public class Test { 12 public static void main(String[] args) { 13 Session session = HibernateUtil.getSession(); 14 String hql = "from Dept"; 15 Query query = session.createQuery(hql); 16 17 //当前页码 18 int pageIndex = 1; 19 //每页显示的条数 20 int pageSize = 2; 21 22 //设置查询的起始位置 23 query.setFirstResult((pageIndex - 1) * pageSize); 24 //设置每页查询的(最大)条数 25 query.setMaxResults(pageSize); 26 27 List<Dept> depts = query.list(); 28 for (Dept dept : depts) { 29 System.out.println(dept.getDeptName()); 30 } 31 } 32 }
==================================连接查询==============================
内联:只显示互相有值的两表
左外联:左边全部显示,右边null
右外联:右边全部显示,左边null
连接类型 HQL语法
内连接 inner join 或 join
迫切内连接 inner join fetch或 join fetch
左外连接 left outer join或 left join
迫切左外连接 left outer join fetch或 left join fetch
右外连接 right outer join 或right join
注意:配置文件中的fetch属性效果不大,所以一般不在配置文件中使用这个属性。而是在业务有需求时,才在业务中使用
范例:Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.Elastic.HibernateDemo3.ivy.entity.Emp
迫切连接???
1 package com.Elastic.HibernateDemo3.ivy.test; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import org.hibernate.Query; 6 import org.hibernate.SQLQuery; 7 import org.hibernate.Session; 8 import com.Elastic.HibernateDemo3.ivy.entity.Dept; 9 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 10 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 11 public class Test { 12 public static void main(String[] args) { 13 Session session = HibernateUtil.getSession(); 14 String hql = "from Emp emp inner join emp.dept"; 15 List<Emp> emps = session.createQuery(hql).list(); 16 for (Emp emp : emps) { 17 System.out.println(emp.getEmpName() + emp.getDept().getDeptName()); 18 } 19 } 20 }
正确范例:
1 package com.Elastic.HibernateDemo3.ivy.test; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import org.hibernate.Query; 6 import org.hibernate.SQLQuery; 7 import org.hibernate.Session; 8 import com.Elastic.HibernateDemo3.ivy.entity.Dept; 9 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 10 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 11 public class Test { 12 public static void main(String[] args) { 13 Session session = HibernateUtil.getSession(); 14 String hql = "from Emp emp inner join emp.dept"; 15 List<Emp> emps = session.createQuery(hql).list(); 16 for (Emp emp : emps) { 17 System.out.println(emp.getEmpName() + emp.getDept().getDeptName()); 18 } 19 } 20 }
===================================子查询================================
子查询语句:应用在HQL查询语句的where子句中
关键字 说明
all 返回的所有记录
any 返回的任意一条记录
some 和“any”意思相同
in 与“=any”意思相同
exists 至少返回一条记录
范例:
a.查询所有员工工资都小于5000的部门
from Dept d where d.emps.size>0 and
5000>all(select e.salary from d.emps e)
b.查询至少有一位员工工资低于5000的部门
from Dept d where 5000>any(select e.salary from d.emps e)
c.查询员工工资正好是5000元的部门
from Dept d where 5000=any(select e.salary from d.emps e)
from Dept d where 5000=some(select e.salary from d.emps e)
d.查询至少有一位员工的部门
from Dept d where exists (from d.emps)
【技巧:size和exists可以表达一件事,优先考虑exists(效率高)】
====================================原生SQL查询================================
HQL 不能"统计"
SQL 提高性能,有相应数据库的优化语法
原生SQL查询:使用底层数据库的SQL特性,来生成一些特殊的查询语句
Hibernate使用★Session的createSQLQuery()方法创建SQLQuery对象★,用来执行原生SQL语句
范例1:
1 package com.Elastic.HibernateDemo3.ivy.test; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import org.hibernate.Query; 6 import org.hibernate.SQLQuery; 7 import org.hibernate.Session; 8 import com.Elastic.HibernateDemo3.ivy.entity.Dept; 9 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 10 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 11 public class Test { 12 public static void main(String[] args) { 13 Session session = HibernateUtil.getSession(); 14 //直接创建SQL 15 String sql = "select e.*,d.* from emp e inner join dept d on e.deptId = d.deptId"; 16 17 //创建SQLQuery对象,命名查询createSQLQuery() 18 SQLQuery sqlQuery = session.createSQLQuery(sql); 19 sqlQuery.addEntity(Emp.class); 20 21 List<Emp> emps = sqlQuery.list(); 22 for (Emp emp : emps) { 23 System.out.println(emp.getEmpName() + emp.getDept().getDeptName()); 24 } 25 26 //':name' 相当 SQL语句中的 '?'。其他like等语法HQL一样用 27 Query query = session 28 .createSQLQuery( 29 "select * from Emp where empName like :ename and Job = :job") 30 .addEntity(Emp.class).setString("ename", "%张%") 31 .setString("job", "工程师"); 32 List<Emp> list = query.list(); 33 } 34 }
=================================命名查询=========================
命名查询语句:在映射文件中定义★字符串形式★的查询语句
HQL查询语句的命名查询,存在★***.hbm.xml★
HQL命名查询
SQL命名查询
【技巧:表单 传入两个值name和value。所以 命名时,用Map做】
范例1:
1 <hibernate-mapping> 2 <class name="com.xuetang9.demo.entity.Emp" table="emp"> 3 ...... 4 </class> 5 <query name="findEmpByJob"> 6 <![CDATA[ 7 from Emp e where e.job = :job 8 ]]> 9 </query> 10 </hibernate-mapping>
范例2:
1.Emp.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <!-- 实体类路径:数据库表名--> 7 <class name="com.Elastic.HibernateDemo3.ivy.entity.Emp" table="emp"> 8 9 <!-- 主键UID(唯一标识) --> 10 <id name="empNo" column="empNo"><!-- column单独一行,属性更全 --> 11 12 <!-- 主键生成策略:increment,assigned,native等 --> 13 <generator class="increment"></generator> 14 </id> 15 16 <!-- 属性名(★★setDeptName★★):数据库表字段(如果是关键字,用``标志) --> 17 <property name="empName" column="empName"></property> 18 19 <!-- 这个字段进行新增和修改功能,要被Hibernate忽略。因为,与外键一样 --> 20 <property name="deptId" column="deptId" insert="false" update="false"></property> 21 22 23 <!-- 多对一的关系(多个员工属于一个部门) --> 24 <many-to-one name="dept" class="com.Elastic.HibernateDemo3.ivy.entity.Dept" column="deptId" lazy="proxy"></many-to-one> 25 <!-- fetch存在,懒加载没用。fetch不放在配置文件中 --> 26 27 </class> 28 29 <!-- 配置HQL命名查询 --> 30 <query name="findEmpByDeptName"> 31 <!-- 文本 --> 32 <![CDATA[ 33 from Emp e where e.dept.deptName = :deptname and e.empName = :ename 34 ]]> 35 </query> 36 37 <!-- 配置原生的SQL语句 --> 38 <sql-query name="findEmp"> 39 <return alias="e" class="com.Elastic.HibernateDemo3.ivy.entity.Emp"></return> 40 select * from emp e inner join dept d on e.deptId = d.deptId where e.empName = :ename and d.deptName = :deptname 41 </sql-query> 42 </hibernate-mapping>
2.Test类
1 package com.Elastic.HibernateDemo3.ivy.test; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import org.hibernate.Query; 6 import org.hibernate.SQLQuery; 7 import org.hibernate.Session; 8 import com.Elastic.HibernateDemo3.ivy.entity.Dept; 9 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 10 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 11 public class Test { 12 public static void main(String[] args) { 13 String name = "findEmp"; 14 //String name = "findEmpByDeptName"; 15 Map<String, Object> params = new HashMap<String, Object>(); 16 params.put("deptname", "销售部"); 17 params.put("ename", "李四"); 18 19 Session session = HibernateUtil.getSession(); 20 Query query = session.getNamedQuery(name); 21 query.setProperties(params); 22 List<Emp> emps = query.list(); 23 for (Emp emp : emps) { 24 System.out.println(emp.getEmpName() + emp.getDept().getDeptName()); 25 } 26 } 27 }
=================================综合范例==============================
1.实体类及其hbm.xml文件 -- entity包
a.Dept
1 package com.Elastic.HibernateDemo3.ivy.entity; 2 import java.io.Serializable; 3 import java.util.Set; 4 public class Dept implements Serializable { 5 private static final long serialVersionUID = 2261199233032137882L; 6 private Integer deptId; 7 private String deptName; 8 private String location; 9 10 //多对一:一个部门有多个员工 11 //set:唯一 12 private Set<Emp> emps; 13 14 public Set<Emp> getEmps() { 15 return emps; 16 } 17 public void setEmps(Set<Emp> emps) { 18 this.emps = emps; 19 } 20 21 public Integer getDeptId() { 22 return deptId; 23 } 24 public void setDeptId(Integer deptId) { 25 this.deptId = deptId; 26 } 27 public String getDeptName() { 28 return deptName; 29 } 30 public void setDeptName(String deptName) { 31 this.deptName = deptName; 32 } 33 public String getLocation() { 34 return location; 35 } 36 public void setLocation(String location) { 37 this.location = location; 38 } 39 }
b.Dept.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping> 7 <!-- 实体类路径:数据库表名--> 8 <class name="com.Elastic.HibernateDemo3.ivy.entity.Dept" table="dept"> 9 <!-- 主键OID(唯一标识) --> 10 <id name="deptId" column="deptid"><!-- column单独一行,属性更全 --> 11 <!-- 主键生成策略:increment,assigned,native等 --> 12 <generator class="increment"></generator> 13 </id> 14 15 <!-- 属性名(★★setDeptName★★):数据库表字段(如果是关键字,用``标志) --> 16 <property name="deptName" column="deptname"></property> 17 <property name="location" column="location"></property> 18 19 <!-- 多个员工 --> 20 <!-- <set name="emps" cascade="save-update"> --><!-- 新增部门的同时,新增员工(级联操作) --> 21 <!-- <set name="emps" cascade="all" inverse="true" order-by="empNo desc"> --><!-- 删除部门同时删除员工 --> 22 <set name="emps" cascade="all" inverse="true" order-by="empNo desc" lazy="extra"><!-- 删除部门同时删除员工 23 表dept中deptid --> 24 <key column="deptid"></key> 25 <one-to-many class="com.Elastic.HibernateDemo3.ivy.entity.Emp"></one-to-many> 26 </set> 27 28 </class> 29 </hibernate-mapping>
a1.Emp
1 package com.Elastic.HibernateDemo3.ivy.entity; 2 import java.io.Serializable; 3 public class Emp implements Serializable { 4 /** 5 * <p> 6 * <h3>作用:</h3> 7 * </p> 8 * @see long 9 * @see serialVersionUID 10 */ 11 private static final long serialVersionUID = -6182713107749938132L; 12 private Integer empNo; 13 private String empName; 14 private Integer deptId; 15 16 private Dept dept; 17 18 public Integer getDeptId() { 19 return deptId; 20 } 21 public void setDeptId(Integer deptId) { 22 this.deptId = deptId; 23 } 24 public Dept getDept() { 25 return dept; 26 } 27 public void setDept(Dept dept) { 28 this.dept = dept; 29 } 30 public Integer getEmpNo() { 31 return empNo; 32 } 33 public void setEmpNo(Integer empNo) { 34 this.empNo = empNo; 35 } 36 public String getEmpName() { 37 return empName; 38 } 39 public void setEmpName(String empName) { 40 this.empName = empName; 41 } 42 }
b1.Emp.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <!-- 实体类路径:数据库表名--> 7 <class name="com.Elastic.HibernateDemo3.ivy.entity.Emp" table="emp"> 8 9 <!-- 主键UID(唯一标识) --> 10 <id name="empNo" column="empNo"><!-- column单独一行,属性更全 --> 11 12 <!-- 主键生成策略:increment,assigned,native等 --> 13 <generator class="increment"></generator> 14 </id> 15 16 <!-- 属性名(★★setDeptName★★):数据库表字段(如果是关键字,用``标志) --> 17 <property name="empName" column="empName"></property> 18 19 <!-- 这个字段进行新增和修改功能,要被Hibernate忽略。因为,与外键一样 --> 20 <property name="deptId" column="deptId" insert="false" update="false"></property> 21 22 23 <!-- 多对一的关系(多个员工属于一个部门) --> 24 <many-to-one name="dept" class="com.Elastic.HibernateDemo3.ivy.entity.Dept" column="deptId" lazy="proxy"></many-to-one> 25 <!-- fetch存在,懒加载没用。fetch不放在配置文件中 --> 26 27 </class> 28 29 <!-- 配置HQL命名查询 --> 30 <query name="findEmpByDeptName"> 31 <!-- 文本 --> 32 <![CDATA[ 33 from Emp e where e.dept.deptName = :deptname and e.empName = :ename 34 ]]> 35 </query> 36 37 <!-- 配置原生的SQL语句 --> 38 <sql-query name="findEmp"> 39 <return alias="e" class="com.Elastic.HibernateDemo3.ivy.entity.Emp"></return> 40 41 select * from emp e inner join dept d on e.deptId = d.deptId where e.empName = :ename and d.deptName = :deptname 42 </sql-query> 43 </hibernate-mapping>
2.hibernate.cfg.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!DOCTYPE hibernate-configuration PUBLIC 4 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 5 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 6 7 <hibernate-configuration> 8 <session-factory> 9 <!-- 1.连接数据库 --> 10 <!-- 连接数据库名 --> 11 <property name="connection.url">jdbc:mysql://localhost:3306/hibernatedb</property> 12 13 <!-- 连接数据库的用户名 --> 14 <property name="connection.username">root</property> 15 16 <!-- 连接数据库的密码 --> 17 <property name="connection.password">root</property> 18 19 <!-- 数据库驱动类 --> 20 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 21 22 <!-- 2.数据库方言(不同的数据库) --> 23 <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 24 25 <!-- 3.其他属性 --> 26 <!-- 是否显示sql语句 --> 27 <property name="show_sql">true</property> 28 <!-- 是否显示格式化sql语句,如果要显示,★★★一定要先显示show_sql语句★★★ --> 29 <property name="format_sql">true</property> 30 31 <!-- 4.数据库对应的实体类的映射文件路径 --> 32 <mapping resource="com/Elastic/HibernateDemo3/ivy/entity/Dept.hbm.xml"></mapping> 33 <mapping resource="com/Elastic/HibernateDemo3/ivy/entity/Emp.hbm.xml"></mapping> 34 </session-factory> 35 </hibernate-configuration>
3.util包:HibernateUtil
1 package com.Elastic.HibernateDemo3.ivy.util; 2 import org.hibernate.Session; 3 import org.hibernate.SessionFactory; 4 import org.hibernate.cfg.Configuration; 5 public final class HibernateUtil { 6 private static Configuration cfg = null; 7 private static SessionFactory sessionFactory = null; 8 9 //本地线程 10 public static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 11 12 static{ 13 cfg = new Configuration().configure(); 14 sessionFactory = cfg.buildSessionFactory(); 15 } 16 17 public static Session getSession(){ 18 Session session = threadLocal.get(); 19 if (null == session || !session.isOpen()) { 20 session = sessionFactory.openSession(); 21 threadLocal.set(session); 22 } 23 return session; 24 } 25 }
4.filter包
a.EncodingFilter
1 package com.Elastic.HibernateDemo3.ivy.filter; 2 import java.io.IOException; 3 import javax.servlet.Filter; 4 import javax.servlet.FilterChain; 5 import javax.servlet.FilterConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.ServletRequest; 8 import javax.servlet.ServletResponse; 9 public class EncodingFilter implements Filter { 10 11 /* (non-Javadoc) 12 * @see javax.servlet.Filter#destroy() 13 */ 14 @Override 15 public void destroy() { 16 // TODO Auto-generated method stub 17 18 } 19 20 /* (non-Javadoc) 21 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 22 */ 23 @Override 24 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 25 throws IOException, ServletException { 26 request.setCharacterEncoding("utf-8"); 27 response.setCharacterEncoding("utf-8"); 28 chain.doFilter(request, response); 29 } 30 31 /* (non-Javadoc) 32 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 33 */ 34 @Override 35 public void init(FilterConfig arg0) throws ServletException { 36 // TODO Auto-generated method stub 37 38 } 39 }
b.OpenSessionInViewFilter
1 package com.Elastic.HibernateDemo3.ivy.filter; 2 import java.io.IOException; 3 import javax.servlet.Filter; 4 import javax.servlet.FilterChain; 5 import javax.servlet.FilterConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.ServletRequest; 8 import javax.servlet.ServletResponse; 9 import org.hibernate.HibernateException; 10 import org.hibernate.Session; 11 import org.hibernate.Transaction; 12 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 13 public class OpenSessionInViewFilter implements Filter{ 14 15 /* (non-Javadoc) 16 * @see javax.servlet.Filter#destroy() 17 */ 18 @Override 19 public void destroy() { 20 // TODO Auto-generated method stub 21 22 } 23 24 /* (non-Javadoc) 25 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 26 */ 27 @Override 28 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 29 throws IOException, ServletException { 30 31 /* 事务以及session的关闭 */ 32 33 //获取session 34 Session session = HibernateUtil.getSession(); 35 //开启事务 36 Transaction tx = session.beginTransaction(); 37 38 try { 39 chain.doFilter(request, response); 40 //提交事务 41 tx.commit(); 42 } catch (HibernateException e) { 43 tx.rollback(); 44 e.printStackTrace(); 45 } finally { 46 //关闭session 47 session.close(); 48 } 49 } 50 51 /* (non-Javadoc) 52 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 53 */ 54 @Override 55 public void init(FilterConfig arg0) throws ServletException { 56 // TODO Auto-generated method stub 57 58 } 59 }
5.dao包
a.IBaseDao
1 package com.Elastic.HibernateDemo3.ivy.dao; 2 import java.io.Serializable; 3 import java.util.List; 4 import java.util.Map; 5 import com.Elastic.HibernateDemo3.ivy.common.PageList; 6 public interface IBaseDao<T> { 7 void save(T record); 8 9 //不明确id的类型,就用Serializable 10 void delete(Serializable id); 11 12 void update(T record); 13 14 T findById(Serializable id); 15 16 List<T> find(Map<String, Object> params); 17 18 List<T> find(String hql,Map<String, Object> params); 19 20 PageList<T> findByPage(int pageIndex, int pageSize, Map<String, Object> params); 21 22 List<T> findByNamed(String queryName, Map<String, Object> params); 23 }
b.BaseDao
1 package com.Elastic.HibernateDemo3.ivy.dao; 2 import java.io.Serializable; 3 import java.lang.reflect.ParameterizedType; 4 import java.util.List; 5 import java.util.Map; 6 import org.hibernate.Query; 7 import org.hibernate.Session; 8 import com.Elastic.HibernateDemo3.ivy.common.PageList; 9 import com.Elastic.HibernateDemo3.ivy.util.HibernateUtil; 10 11 //忽略警告 12 @SuppressWarnings({ "rawtypes", "unchecked" }) 13 public class BaseDao<T> implements IBaseDao<T>{ 14 15 private Class entityClass; 16 17 public BaseDao(){ 18 entityClass = this.getEntityClass(); 19 } 20 21 /** 22 * 23 * <p> 24 * <h3>方法功能描述:根据反射得到实体类的类型</h3> 25 * </p> 26 * @return 27 * @procedure 执行过程 28 * @see BaseDao 29 */ 30 private Class getEntityClass(){ 31 try { 32 ParameterizedType paramsType = (ParameterizedType)this.getClass().getGenericSuperclass(); 33 return (Class)paramsType.getActualTypeArguments()[0]; 34 } catch (Exception e) { 35 e.printStackTrace(); 36 } 37 return null; 38 } 39 40 public Session getSession(){ 41 return HibernateUtil.getSession(); 42 } 43 44 @Override 45 public void save(T record){ 46 this.getSession().save(record); 47 } 48 49 @Override 50 public void delete(Serializable id){ 51 this.getSession().delete(this.findById(id)); 52 } 53 54 @Override 55 public void update(T record){ 56 this.getSession().update(record); 57 } 58 59 60 @Override 61 public T findById(Serializable id){ 62 return (T)this.getSession().get(entityClass, id); 63 } 64 65 @Override 66 public List<T> find(Map<String, Object> params){ 67 StringBuffer hql = new StringBuffer("from "); 68 hql.append(entityClass.getName()); 69 hql.append(" where 1 = 1 "); 70 if (null != params) { 71 for (String key : params.keySet()) { 72 hql.append(" and "); 73 hql.append(key); 74 hql.append(" = :"); 75 hql.append(key); 76 } 77 } 78 Query query = this.getSession().createQuery(hql.toString()); 79 if (null != params) { 80 query.setProperties(params); 81 } 82 return query.list(); 83 } 84 85 @Override 86 public List<T> find(String hql, Map<String, Object> params) { 87 Query query = this.getSession().createQuery(hql.toString()); 88 if (null != params) { 89 query.setProperties(params); 90 } 91 return query.list(); 92 } 93 94 @Override 95 public PageList<T> findByPage(int pageIndex, int pageSize, Map<String, Object> params) { 96 StringBuffer hql = new StringBuffer("from "); 97 hql.append(entityClass.getName()); 98 hql.append(" where 1 = 1 "); 99 if (null != params) { 100 for (String key : params.keySet()) { 101 hql.append(" and "); 102 hql.append(key); 103 hql.append(" = :"); 104 hql.append(key); 105 } 106 } 107 Query query = this.getSession().createQuery(hql.toString()); 108 if (null != params) { 109 query.setProperties(params); 110 } 111 112 //查询总条数 113 Query queryTotal = this.getSession().createQuery("select count(*)" + hql.toString()); 114 if (null != params) { 115 queryTotal.setProperties(params); 116 } 117 int total = Integer.parseInt(queryTotal.uniqueResult().toString()); 118 119 //设置分页 120 query.setFirstResult((pageIndex - 1) * pageSize); 121 query.setMaxResults(pageSize); 122 return new PageList<T>(query.list(), pageIndex, pageSize, total); 123 } 124 125 /* (non-Javadoc) 126 * @see com.Elastic.HibernateDemo3.ivy.dao.IBaseDao#findByNamed(java.lang.String, java.util.Map) 127 */ 128 @Override 129 public List<T> findByNamed(String queryName, Map<String, Object> params) { 130 Query query = this.getSession().getNamedQuery(queryName); 131 return query.setProperties(params).list(); 132 } 133 }
c.DeptDao
1 package com.Elastic.HibernateDemo3.ivy.dao; 2 import com.Elastic.HibernateDemo3.ivy.entity.Dept; 3 public interface DeptDao extends IBaseDao<Dept>{ 4 5 }
d.EmpDao
1 package com.Elastic.HibernateDemo3.ivy.dao; 2 import java.util.List; 3 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 4 public interface EmpDao extends IBaseDao<Emp> { 5 List<Emp> findEmp(); 6 }
6.dao.impl包
a.DeptDaoImpl
1 package com.Elastic.HibernateDemo3.ivy.dao.impl; 2 import com.Elastic.HibernateDemo3.ivy.dao.BaseDao; 3 import com.Elastic.HibernateDemo3.ivy.dao.DeptDao; 4 import com.Elastic.HibernateDemo3.ivy.entity.Dept; 5 public class DeptDaoImpl extends BaseDao<Dept> implements DeptDao { 6 7 }
b.EmpDaoImpl
1 package com.Elastic.HibernateDemo3.ivy.dao.impl; 2 import java.io.Serializable; 3 import java.util.List; 4 import java.util.Map; 5 import com.Elastic.HibernateDemo3.ivy.dao.BaseDao; 6 import com.Elastic.HibernateDemo3.ivy.dao.EmpDao; 7 import com.Elastic.HibernateDemo3.ivy.entity.Emp; 8 public class EmpDaoImpl extends BaseDao<Emp> implements EmpDao { 9 10 /* (non-Javadoc) 11 * @see com.Elastic.HibernateDemo3.ivy.dao.EmpDao#findEmp() 12 */ 13 @Override 14 public List<Emp> findEmp() { 15 this.getSession().getNamedQuery("findEmp"); //配置文件中命名查询的name值 16 return null; 17 } 18 }
7.service包
a.DeptService
1 package com.Elastic.HibernateDemo3.ivy.service; 2 import java.util.List; 3 import java.util.Map; 4 import com.Elastic.HibernateDemo3.ivy.common.PageList; 5 import com.Elastic.HibernateDemo3.ivy.entity.Dept; 6 public interface DeptService{ 7 List<Dept> searchALLDept(); 8 9 List<Dept> searchDeptsByName(String name); 10 11 List<Dept> searchDeptByCondition(Map<String, Object> condition); 12 13 PageList<Dept> searchDeptByPage(int pageIndex, int pageSize, Map<String, Object> condition); 14 }
8.service.impl包
a.DeptServiceImpl
1 package com.Elastic.HibernateDemo3.ivy.service.impl; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import com.Elastic.HibernateDemo3.ivy.common.PageList; 6 import com.Elastic.HibernateDemo3.ivy.dao.DeptDao; 7 import com.Elastic.HibernateDemo3.ivy.dao.impl.DeptDaoImpl; 8 import com.Elastic.HibernateDemo3.ivy.entity.Dept; 9 import com.Elastic.HibernateDemo3.ivy.service.DeptService; 10 public class DeptServiceImpl implements DeptService { 11 12 private DeptDao deptDao = new DeptDaoImpl(); 13 14 /* 15 * (non-Javadoc) 16 * 17 * @see com.Elastic.HibernateDemo3.ivy.service.DeptService#searchALLDept() 18 */ 19 @Override 20 public List<Dept> searchALLDept() { 21 return deptDao.find(null); 22 } 23 24 /* 25 * (non-Javadoc) 26 * 27 * @see 28 * com.Elastic.HibernateDemo3.ivy.service.DeptService#searchDeptsByName(java 29 * .lang.String) 30 */ 31 @Override 32 public List<Dept> searchDeptsByName(String name) { 33 Map<String, Object> params = new HashMap<String,Object>(); 34 params.put("deptName", name); 35 36 return deptDao.find(params); 37 } 38 39 @Override 40 public List<Dept> searchDeptByCondition(Map<String, Object> condition) { 41 42 return deptDao.find(condition); 43 } 44 45 @Override 46 public PageList<Dept> searchDeptByPage(int pageIndex, int pageSize, Map<String, Object> condition) { 47 return deptDao.findByPage(pageIndex, pageSize, condition); 48 } 49 }
9.servlet包
a.DeptServlet
1 package com.Elastic.HibernateDemo3.ivy.controller; 2 import java.io.IOException; 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 import com.Elastic.HibernateDemo3.ivy.entity.Dept; 11 import com.Elastic.HibernateDemo3.ivy.service.DeptService; 12 import com.Elastic.HibernateDemo3.ivy.service.impl.DeptServiceImpl; 13 /** 14 * Servlet implementation class DeptServlet 15 */ 16 public class DeptServlet extends HttpServlet { 17 private static final long serialVersionUID = 1L; 18 19 /** 20 * @see HttpServlet#HttpServlet() 21 */ 22 public DeptServlet() { 23 super(); 24 // TODO Auto-generated constructor stub 25 } 26 27 /** 28 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 29 */ 30 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 31 String oper = request.getParameter("oper"); 32 DeptService deptService = new DeptServiceImpl(); 33 switch (oper) { 34 case "all": 35 List<Dept> depts = deptService.searchALLDept(); 36 request.setAttribute("depts", depts); 37 38 //转发 39 request.getRequestDispatcher("/dept.jsp").forward(request, response); 40 break; 41 case "byName": 42 request.setAttribute("depts", deptService.searchDeptsByName(request.getParameter("name"))); 43 44 //转发 45 request.getRequestDispatcher("/dept.jsp").forward(request, response); 46 break; 47 case "byCondition": 48 //获取页面提交的参数 49 String deptName = request.getParameter("deptName"); 50 String location = request.getParameter("location"); 51 String id = request.getParameter("deptId"); 52 53 //创建保存参数的map集合 54 Map<String, Object> condition = new HashMap<String, Object>(); 55 if (null != deptName && deptName.trim().length() != 0) { 56 //【属性名和页面参数一样要写对!!!】 57 condition.put("deptName", deptName); 58 } 59 if (null != location && location.trim().length() != 0) { 60 //【属性名和页面参数一样要写对!!!】 61 condition.put("location", location); 62 } 63 if (null != id && id.trim().length() != 0) { 64 //【属性名和页面参数一样要写对!!!】 65 condition.put("deptId", Integer.parseInt(id)); 66 } 67 68 String pageIndexString = request.getParameter("pageIndex"); 69 String pageSizeString = request.getParameter("pageSize"); 70 71 int pageIndex = 1; 72 int pageSize = 2; 73 74 if (pageIndexString != null && pageIndexString.trim().length() != 0) { 75 pageIndex = Integer.parseInt(pageIndexString); 76 } 77 78 if (pageSizeString != null && pageSizeString.trim().length() != 0) { 79 pageSize = Integer.parseInt(pageSizeString); 80 } 81 82 request.setAttribute("pageList", deptService.searchDeptByPage(pageIndex, pageSize, condition)); 83 84 //转发 85 request.getRequestDispatcher("/dept.jsp").forward(request, response); 86 break; 87 88 default: 89 break; 90 } 91 } 92 93 /** 94 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 95 */ 96 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 97 this.doGet(request, response); 98 } 99 }
10.common包
a.PageList
1 package com.Elastic.HibernateDemo3.ivy.common; 2 import java.util.List; 3 public class PageList<T> { 4 private List<T> data; 5 private Integer pageIndex; 6 private Integer pageSize; 7 private Integer total; 8 private Integer pageTotal; 9 private Boolean next; 10 private Boolean prev; 11 12 public PageList(List<T> data, Integer pageIndex, Integer pageSize, Integer total) { 13 super(); 14 this.data = data; 15 this.pageIndex = pageIndex; 16 this.pageSize = pageSize; 17 this.total = total; 18 19 this.pageTotal = (int)Math.ceil((double)total / pageSize); 20 this.next = this.pageIndex < this.pageTotal; 21 this.prev = this.pageIndex > 1; 22 } 23 24 public List<T> getData() { 25 return data; 26 } 27 public Integer getPageIndex() { 28 return pageIndex; 29 } 30 public Integer getPageSize() { 31 return pageSize; 32 } 33 public Integer getTotal() { 34 return total; 35 } 36 public Integer getPageTotal() { 37 return pageTotal; 38 } 39 public Boolean getNext() { 40 return next; 41 } 42 public Boolean getPrev() { 43 return prev; 44 } 45 }
11.jsp
a.dept.jsp
1 <%-- 引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%-- 引入JSTL标签指令 --%> 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 6 <!DOCTYPE html> 7 <html language="zh-CN"> 8 <head> 9 <meta charset="utf-8"> 10 <!-- 设置浏览器渲染的引擎 --> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 <!-- 设置支持移动设备 --> 13 <meta name="viewport" content="width=device-width, initial-scale=1"> 14 <title>网页标题</title> 15 <!-- 引用bootstrap样式 --> 16 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 17 </head> 18 <body> 19 <div class="container-fluid"> 20 <div class="panel panel-primary"> 21 <div class="panel-heading"><span class="h3">部门信息</span></div> 22 <div class="panel-body"> 23 <form action="<%=request.getContextPath()%>/dept/search?oper=byCondition" method="post"> 24 <label>部门编号</label> 25 <input name="deptId" type="text"/> 26 <label>部门名称</label> 27 <!-- name与Dept类的属性名一样 --> 28 <input name="deptName" type="text"/> 29 <label>部门位置</label> 30 <input name="location" type="text"/> 31 32 <input type="hidden" name="pageIndex" value="1"/> 33 34 <input type="submit" value="搜索" data-toggle="search"/> 35 </form> 36 </div> 37 38 <table class="table table-bordered"> 39 <thead> 40 <tr> 41 <td>部门编号</td> 42 <td>部门名称</td> 43 <td>部门位置</td> 44 <td>操作</td> 45 </tr> 46 </thead> 47 <tbody> 48 <c:forEach items="${requestScope.pageList.data }" var="dept"> 49 <tr> 50 <td>${dept.deptId }</td> 51 <td>${dept.deptName }</td> 52 <td>${dept.location }</td> 53 <td><a class="btn btn-primary btn-xs" href="javascript:;">删除</a></td> 54 </tr> 55 56 </c:forEach> 57 </tbody> 58 </table> 59 <div class="panel-footer"> 60 <nav> 61 <ul id="deptPage" class="pagination" style="margin: 0px;"> 62 <li <c:if test="${not requestScope.pageList.prev }">class="disabled"</c:if>> 63 <a href="#" aria-label="Previous" > 64 <span aria-hidden="true">«</span> 65 </a> 66 </li> 67 <c:forEach begin="1" end="${requestScope.pageList.pageTotal }" step="1" varStatus="status"> 68 <li <c:if test="${status.index eq requestScope.pageList.pageIndex}">class="active"</c:if>> 69 <a href="#">${status.index }</a> 70 </li> 71 </c:forEach> 72 <li <c:if test="${not requestScope.pageList.next }">class="disabled"</c:if>> 73 <a href="#" aria-label="Next"> 74 <span aria-hidden="true">»</span> 75 </a> 76 </li> 77 </ul> 78 <div class="pull-right" style="line-height: 34px;">当前第${requestScope.pageList.pageIndex }页,总共${requestScope.pageList.pageTotal }页</div> 79 </nav> 80 </div> 81 </div> 82 83 </div> 84 85 <!-- 引用外部JS文件 --> 86 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 87 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 88 89 <script type="text/javascript"> 90 $(function() { 94 95 $('#deptPage').on('click','li > a', function() { 96 if ($(this).closest('li').hasClass('disabled')) { 97 return; 98 } 99 var pageIndex; 100 if ($(this).attr('aria-label') == 'Previous') { 101 pageIndex = parseInt($('#deptPage > li.active > a').text()) - 1; 102 } else if ($(this).attr('aria-label') == 'Next') { 103 pageIndex = parseInt($('#deptPage > li.active > a').text()) + 1; 104 } else { 105 pageIndex = $(this).text(); 106 } 107 $('[name="pageIndex"]').val(pageIndex); 108 $('[data-toggle="search"]').trigger('click'); 109 }); 110 }); 111 </script> 112 113 </body> 114 </html>