zoukankan      html  css  js  c++  java
  • hibernate学习笔记6--Criteria查询方式、完整小练习(开发步骤)

    一、Criteria查询方式
    没有sql语了,因此更加面向对象一些。
    Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式:
     Criteria c = s.createCriteria(DomainClass.class);
     简单属性条件如:c.add(Restrictions.eq(propertyName, name));
     c.add(Restrictions.eqProperty(propertyName, otherpropertyName));

    1. package cn.itcast.hibernate;  
    2.   
    3. import java.util.Date;  
    4. import java.util.List;  
    5.   
    6. import org.hibernate.Criteria;  
    7. import org.hibernate.Session;  
    8. import org.hibernate.criterion.Restrictions;  
    9.   
    10. import cn.itcast.hibernate.domain.User;  
    11.   
    12. public class Cri {  
    13.   
    14.     /** 
    15.      * 使用Criteria根据name查询方法 
    16.      * @param entity 
    17.      */  
    18.     public static void Cri(String name){  
    19.           
    20.         Session s = null;  
    21.         try {  
    22.             s=HIbernateUtil.getSession();  
    23.             //使用Criteria接口  
    24.             Criteria c = s.createCriteria(User.class);  
    25.             //对查询添加限制条件,相当于where子句。"name"必须是类中具有的属性  
    26.             //Criteria相当于一个容器,约束可以一直加  
    27.             c.add(Restrictions.eq("name", name)); //等于  
    28. //          c.add(Restrictions.gt("birthday",new Date())); // 大于  
    29.             c.add(Restrictions.lt("birthday",new Date())); // 小于  
    30.             //以上条件之间是and的连接方式,当然也可以用一下的or连接方式  
    31. //          c.add(Restrictions.or(lhs, rhs));or 两个条件  
    32.               
    33.             //Criteria实现分页,hql的方法名基本相同  
    34.             c.setFirstResult(0);// 从哪条开始取  
    35.             c.setMaxResults(10);// 共取多少条  
    36.             List<User> list=c.list(); //executQuery();   
    37.             for(User user:list){  
    38.                 System.out.print(user.getName());  
    39.             }  
    40.               
    41.             //如果确定数据最多只有一条,可以使用一下的方法简化代码  
    42.             User u= (User)c.uniqueResult();  
    43.             System.out.print("只有一条数据"+u.getName());  
    44.         } finally {  
    45.             if(s!=null){  
    46.                 s.close();  
    47.             }  
    48.         }  
    49.     }  
    50.     /** 
    51.      * @param args 
    52.      */  
    53.     public static void main(String[] args) {  
    54.         Cri("你妹");  
    55.   
    56.     }  
    57.   
    58. }  


     

    二、小练习(一个各层的完整开发步骤)

    1.完整开发步骤

    2.实现功能(实现接口方法)

    下面具体例子代码:

    接口类:

    1. package cn.itcast.dao;  
    2.   
    3. import cn.itcast.domain.User;  
    4.   
    5. public interface UserDao {  
    6.     public void saveUser(User user);  
    7.     public User findUserByName(String name);  
    8.     public User findUserById(int id);  
    9.     public void updateUser(User user);  
    10.     public void remove(User user);  
    11. }  

    工具类:获取session

    1. package cn.itcast.dao;  
    2.   
    3. import org.hibernate.Session;  
    4. import org.hibernate.SessionFactory;  
    5. import org.hibernate.cfg.Configuration;  
    6. /** 
    7.  *(1)不想让其他类继承工具类 
    8.  *(2)不能让它创建对象,所以属性全部private,还得有个private的无参数构造 
    9.  * @author Mars 
    10.  * 
    11.  */  
    12. public final class HibernateUtil {  
    13.     private static SessionFactory sessionFactory;  
    14.       
    15.     private HibernateUtil(){  
    16.           
    17.     }  
    18.     /** 
    19.      * 细节1:Configuration:是一个配置类 
    20.      * Configuration的对象会找hibernate.cfg.xml,完成hibernate的初始化 
    21.      * 
    22.      * 细节2:hibernate的配置文件有两种hibernate.cfg.xml和hibernate.properties 
    23.      * 两种存在一种即可,当然如果都存在的话,hibernate.cfg.xml中的配置信息会覆盖hibernate.properties的配置信息 
    24.      */  
    25.     static{  
    26.         //1。读取并解析配置文件  
    27.         Configuration cfg = new Configuration();  
    28.         //如果hibernate.cfg.xml不是放在类路径下,就需要此时指定路径  
    29.         //cfg.configure("filename");  
    30.         cfg.configure();  
    31.         //可以使用代码来设置配置信息,但是不便于管理,不建议使用  
    32.         //cfg.setProperty("hibernate.connection.driver_class", "oracle.jdbc.driver.OracleDriver");  
    33.         //2。读取并解析映射信息,创建SessionFactory  
    34.         //所有的配置信息都可以在SessionFactory中找到,映射文件的信息都能找到  
    35.         sessionFactory = cfg.buildSessionFactory();  
    36.     }  
    37.     /** 
    38.      * 获取session 
    39.      * @return 
    40.      */  
    41.     public static Session getSession(){  
    42.         //  3。打开Session  
    43.         return sessionFactory.openSession();  
    44.     }  
    45.       
    46.     /** 
    47.      * 获取SessionFactory对象 
    48.      * @return 
    49.      */  
    50.     public static SessionFactory getSessionFactory(){  
    51.         return sessionFactory;  
    52.     }  
    53. }  

    接口的实现类:

    1. package cn.itcast.dao.imp;  
    2.   
    3.   
    4.   
    5. import org.hibernate.Criteria;  
    6. import org.hibernate.Query;  
    7. import org.hibernate.Session;  
    8. import org.hibernate.Transaction;  
    9. import org.hibernate.criterion.Restrictions;  
    10.   
    11. import cn.itcast.dao.HibernateUtil;  
    12. import cn.itcast.dao.UserDao;  
    13. import cn.itcast.domain.User;  
    14.   
    15. public class UserDaoHibernateImpl implements UserDao {  
    16.   
    17.     /** 
    18.      * 根据id查询user 
    19.      */  
    20.     public User findUserById(int id) {  
    21.         //因为是查询所以可以不用开启事务  
    22.         Session s = null;  
    23.         try {  
    24.             s = HibernateUtil.getSession();  
    25.             //User.class不可随便放,必须靠这个指定来找相应的映射文件  
    26.             //此处不能使用懒加载s.load(arg0, arg1),会报错,详见后续文章  
    27.             User user = (User)s.get(User.class, id);  
    28.             return user;  
    29.         } finally {  
    30.             if(s!=null){  
    31.                 s.close();  
    32.             }  
    33.         }  
    34.     }  
    35.   
    36.     /** 
    37.      * 根据姓名获取user 
    38.      */  
    39.     public User findUserByName(String name) {  
    40.         Session s = null;  
    41.         try {  
    42.             s=HibernateUtil.getSession();  
    43.             Criteria c =  s.createCriteria(User.class);  
    44.             c.add(Restrictions.eq("name", name));  
    45.             User user = (User)c.uniqueResult();  
    46.             return user;  
    47.         } finally{  
    48.             if(s!=null){  
    49.                 s.close();  
    50.             }  
    51.         }  
    52.           
    53.           
    54.     }  
    55.     /** 
    56.      * 通过hql根据姓名获取user 
    57.      */  
    58.     public User findUserByNamehql(String name) {  
    59.         Session s = null;  
    60.         try {  
    61.             s=HibernateUtil.getSession();  
    62.             String hql = "from User as user where user.name=:n";  
    63.             Query q =  s.createQuery(hql);  
    64.             q.setString("n",name);  
    65.             User user = (User)q.uniqueResult();  
    66.             return user;  
    67.         } finally{  
    68.             if(s!=null){  
    69.                 s.close();  
    70.             }  
    71.         }  
    72.           
    73.           
    74.     }  
    75.       
    76.     /** 
    77.      * 删除方法:必须开启事务 
    78.      */  
    79.     public void remove(User user) {  
    80.         Session s = null;  
    81.         Transaction tx =null;  
    82.           
    83.         try {  
    84.             s=HibernateUtil.getSession();  
    85.             tx=s.beginTransaction();  
    86.             s.delete(user);  
    87.             tx.commit();  
    88.         } finally{  
    89.             if(s!=null){  
    90.                 s.close();  
    91.             }  
    92.         }  
    93.     }  
    94.   
    95.     /** 
    96.      * 删除方法测试:只穿id的话能否成功删除 
    97.      */  
    98.     public void remove(int id) {  
    99.         Session s = null;  
    100.         Transaction tx =null;  
    101.         User user = new User();  
    102.         user.setId(id);  
    103.         try {  
    104.             s=HibernateUtil.getSession();  
    105.             tx=s.beginTransaction();  
    106.             s.delete(user);  
    107.             tx.commit();  
    108.         } finally{  
    109.             if(s!=null){  
    110.                 s.close();  
    111.             }  
    112.         }  
    113.     }  
    114.       
    115.     /** 
    116.      * 保存对象 
    117.      */  
    118.     public void saveUser(User user) {  
    119.         Session s = null;  
    120.         Transaction tx =null;  
    121.           
    122.         try {  
    123.             s=HibernateUtil.getSession();  
    124.             tx=s.beginTransaction();  
    125.             s.save(user);  
    126.             tx.commit();  
    127.         } finally{  
    128.             if(s!=null){  
    129.                 s.close();  
    130.             }  
    131.         }  
    132.     }  
    133.   
    134.     /** 
    135.      * 更新对象 
    136.      */  
    137.     public void updateUser(User user) {  
    138.         Session s = null;  
    139.         Transaction tx =null;  
    140.           
    141.         try {  
    142.             s=HibernateUtil.getSession();  
    143.             tx=s.beginTransaction();  
    144.             s.update(user);  
    145.             tx.commit();  
    146.         } finally{  
    147.             if(s!=null){  
    148.                 s.close();  
    149.             }  
    150.         }  
    151.   
    152.     }  
    153.   
    154.     /** 
    155.      * @param args 
    156.      */  
    157.     public static void main(String[] args) {  
    158.         // TODO Auto-generated method stub  
    159.   
    160.     }  
    161.   
    162. }  


    dimain:

    1. package cn.itcast.domain;  
    2.   
    3. import java.util.Date;  
    4.   
    5. public class User {  
    6.     private int id;  
    7.     private String name;  
    8.     private Date birthday;  
    9.     public int getId() {  
    10.         return id;  
    11.     }  
    12.     public void setId(int id) {  
    13.         this.id = id;  
    14.     }  
    15.     public String getName() {  
    16.         return name;  
    17.     }  
    18.     public void setName(String name) {  
    19.         this.name = name;  
    20.     }  
    21.     public Date getBirthday() {  
    22.         return birthday;  
    23.     }  
    24.     public void setBirthday(Date birthday) {  
    25.         this.birthday = birthday;  
    26.     }  
    27.       
    28. }  

    映射文件:

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE hibernate-mapping PUBLIC  
    3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    5. <hibernate-mapping package="cn.itcast.domain">  
    6.     <class name="User" table="tb_user">  
    7.         <!-- 对象标示符,类型可以不写,hibernate自己识别 -->  
    8.         <id name="id" column="id">  
    9.             <!-- 指定主键生成方式。  
    10.         native根据方言判定生成主键的方式  
    11.          -->  
    12.              <generator class="native"/>   
    13.         </id>  
    14.           
    15.         <property name="name" column="name" unique="true" not-null="true"/><!--标示name唯一性,非空的限制 -->  
    16.         <property name="birthday"  />  
    17.     </class>  
    18.   
    19.   
    20. </hibernate-mapping>  


    下面就是简单粗暴的测试类:

    1. package cn.itcast;  
    2.   
    3. import java.util.Date;  
    4.   
    5. import cn.itcast.dao.UserDao;  
    6. import cn.itcast.dao.imp.UserDaoHibernateImpl;  
    7. import cn.itcast.domain.User;  
    8.   
    9. public class DaoText {  
    10.   
    11.     /** 
    12.      * 模拟业务逻辑层在使用数据访问层的东西 
    13.      */  
    14.     public static void main(String[] args) {  
    15.         UserDao dao = new UserDaoHibernateImpl();  
    16.         UserDaoHibernateImpl daoimp = new UserDaoHibernateImpl();  
    17.         User user = new User();  
    18.         user.setName("nimei");  
    19.         user.setBirthday(new Date());  
    20.         System.out.println("1111");  
    21.         dao.saveUser(user);  
    22.           
    23.         int id = dao.findUserByName("nimei").getId();  
    24.         System.out.println("id: "+id);  
    25.         user.setName("new name");  
    26.         System.out.println("2222");  
    27.         dao.updateUser(user);  
    28.           
    29.         //User u = dao.findUserByName(user.getName());  
    30.           
    31.         System.out.println("3333");  
    32.         //dao.remove(user);  
    33.         //封装的对象只封装如id和非空字段,实施删除测试  
    34.         //daoimp.remove(id);  
    35.           
    36.         //封装的对象只封装如id和非空字段,实施更新测试  
    37.         User user2 = new User();  
    38.         user2.setId(id);  
    39.         user2.setName("涅米");  
    40.         dao.updateUser(user2);  
    41.     }  
    42.   
    43. }  

    备注:

    备注1:对于方言可以不添加,hibernate在启动时会自行进行测试匹配,一般都能识别出相应的数据库,但是最好还是加上。
    <property>节点中的name属性中不要有在结尾处有空格

    备注2:hibernante:不再是更新单列,完全面对的是对象,更新就是更新对象状态,删除就删除对象。
    所以对于删除来说删除是根据id,只要将id和映射文件中不为空的字段封装入user即可,之后就可以轻松的调用remove();
    例如:不满足映射文件
    <property name="name" column="name" unique="true" not-null="true"/><!--标示name唯一性 ,非空的限制-->
    则运行时报错。
    以上有关于删除的规则,更新同样适用

    备注3.hibernate对domain Object限制
    (1)默认构造方法(必须的)
    (2)有无意义的标示符id(主键)(可选)
    (3)非fianl的,对懒加载有影响(可选)

  • 相关阅读:
    Java学习笔记(二十三):final关键字
    Java学习笔记(二十二):打包程序
    Java框架spring Boot学习笔记(一):开始第一个项目
    Java学习笔记(二十一):类型转换和instanceof关键字
    Java学习笔记(二十):多态
    Java学习笔记(十二):java编译跨平台运行原理
    java学习笔记(十一):重写(Override)与重载(Overload)
    java学习笔记(十):scanner输入
    java学习笔记(九):Java 流(Stream)、文件(File)和IO
    java学习笔记(八):继承、extends、super、this、final关键字
  • 原文地址:https://www.cnblogs.com/tian830937/p/4495840.html
Copyright © 2011-2022 走看看