zoukankan      html  css  js  c++  java
  • 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">&laquo;</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">&raquo;</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>
















  • 相关阅读:
    PerfDog WEB端使用手册
    PerfDog4.0探索,支持用户自建web云
    无AI不测试:人工智能时代背景下,如何发展与应用自动化测试?
    性能测试实践 | PerfDog助力微信小游戏/小程序性能调优
    mysql面向过程学习
    阿里云操作记录
    socket网络编程
    学习慕课广告系统
    xinhuadouxxx总结
    maven+springboot+mybatis快速搭建简单使用
  • 原文地址:https://www.cnblogs.com/ivy-xu/p/5596780.html
Copyright © 2011-2022 走看看