第六次作业 基于Hibernate的增删改查操作

1.Session的save()方法

Session是Hibernate所有接口中最重要的接口,提供了对数据保存,更新,查询和删除的方法。

Session的save()方法可以使临时态或游离态转换为持久态。例如,保存一个Customer对象:

[java]  view plain  copy
  1. <span style="color:#000000;">SessionFactory sessionFactory;  
  2. Configuration configuration = new Configuration().configure();  
  3. sessionFactory = configuration.buildSessionFactory();  
  4. Session session = sessionFactory.openSession();  
  5. Transaction tr = session.beginTransaction();  
  6. //1.创建Customer对象  
  7. Customer c1 = new Customer();  
  8. c1.setId(new Long(1));  
  9. c1.setName("test");  
  10. c1.setEmail("123456789@qq.com");  
  11. c1.setPassword("123456");  
  12. c1.setAddress("世外桃源");  
  13. //2.调用Session的save()方法,将Customer对象持久化  
  14. session.save(c1);  
  15. tr.commit();  
  16. session.close();  
  17. </span>  
Save()方法主要做了以下三件事:

(1)将new创建的临时态的Customer对象放入缓存,使其持久化。

(2)同时根据对象关系映射文件中设置的OID生成器,即主键生成方式给该对象生成一个唯一的OID。

             <!-- 设置主键 -->
            <id name="id" column="ID" type="long">
                <!-- 主键生成方式-->
                <generator class="increment"/>
            </id>

  在这个地方有一个疑问,创建对象时setId()方法是否是为该对象持久化生成主键,其实不是,setId并没有按照我们设定的那样生成主键,而是靠

  对象关系映射文件配置的主键生成方式生成主键,可以多运行几次,主键自增长,从数据库可以看到多条数据,主键从1开始,所以可以知道setId()

  没有设置主键,否则数据库主键唯一性校验都过不去。

  我们也可以手动设置主键值,必须重载save()方法,使用重载方法save(c1,new Long(1)),每次手动设置。

(3)计划执行insert语句。注意,insert语句并没有立刻执行,只有当Session清理缓存时,才会执行insert语句。tr.commit()事务提交。

2.Session的update()方法

使游离态对象变成持久态对象。例如:

[java]  view plain  copy
  1. SessionFactory sessionFactory;  
  2. Configuration configuration = new Configuration().configure();  
  3. sessionFactory = configuration.buildSessionFactory();  
  4. Session session1 = sessionFactory.openSession();  
  5. Transaction tr1 = session1.beginTransaction();  
  6. //1.创建Customer对象  
  7. Customer c1 = new Customer();  
  8. c1.setId(new Long(1));  
  9. c1.setName("test");  
  10. c1.setEmail("123456789@qq.com");  
  11. c1.setPassword("123456");  
  12. c1.setAddress("世外桃源");  
  13. //2.调用Session的save()方法,将Customer对象持久化  
  14. session1.save(c1);  
  15. tr1.commit();  
  16. session1.close();  
  17. //3.将游离态的对象更新,发现改变,执行update语句  
  18. Session session2 = sessionFactory.openSession();  
  19. Transaction tr2 = session2.beginTransaction();  
  20. c1.setAddress("测试update");  
  21. session2.update(c1);  
  22. tr2.commit();  
  23. session2.close();</span>  
Session的update()注意做以下事:

(1)把游离态的Customer对象从新加入Session缓存中,使其变成持久化对象。

(2)执行update语句。跟save()执行insert语句一样,并不是立刻执行update语句,需要等缓存清空时,把Customer对象组装成update语句,

然后再执行。

注意,即使Customer没有改变,默认情况下,缓存清除时也会组装Update语句,如果需要设置成改变成才执行update语句,需要设置对象关系映射文件。

3.Session的saveOrUpdate()方法

saveOrUpdate()方法包含save()和update()方法的功能,根据传入参数状态,调用不同方法。传入临时态对象调用save()方法,如果传入游离态对象调用

update()方法。传入持久态对象返回。所以,每次我们只需传入对象,saveOrUpdate()方法,自动判断传入对象状态的状态,动态调用处理方法。

该方法如何判断传入对象的状态?当满足以下任意一个条件时,就是临时态:

(1)java对象的OID为null,说明该对象没有别实例化,即使被实例化,也是游离态被删除后变成临时态的对象,这种情况下的对象为临时态。

(2)如果java对象具有版本控制(version),版本号为null的,也就是没有该对象的版本号。

(3)自定义拦截器,调用isUnsaved()返回值为true。

4.Session的load()和get()方法

这两个方法都是根据OID,从数据库中加载一个持久化对象。持久化对象放在Session缓存中,可以根据不同的需要操作该持久化对象。

两者区别:

当数据库中OID没有对应记录时,load()抛异常,get()返回null。

5.Session的delete()方法

delete()顾名思义删除,用于从数据库中删除java对象对应的记录。

delete()如果传入持久化对象,组装delete语句,执行删除;如果传入游离态对象,hibernate先把游离态关联到session,变成持久态,再生成delete语句,

执行删除。

都是只有当session缓存清空时,才执行。

以上执行都是一个对象,对应一条记录。

可以用session.delete("from Customer where ....");后面加上条件删除多条数据。

[java]  view plain  copy
  1. SessionFactory sessionFactory;  
  2. Configuration configuration = new Configuration().configure();  
  3. sessionFactory = configuration.buildSessionFactory();  
  4. Session session1 = sessionFactory.openSession();  
  5. Transaction tr1 = session1.beginTransaction();  
  6. //1.创建Customer对象  
  7. Customer c1 = new Customer();  
  8. c1.setId(new Long(1));  
  9. c1.setName("test");  
  10. c1.setEmail("123456789@qq.com");  
  11. c1.setPassword("123456");  
  12. c1.setAddress("世外桃源");  
  13. //2.调用Session的save()方法,将Customer对象持久化  
  14. session1.save(c1);  
  15. tr1.commit();  
  16. session1.close();  
  17. //3.将游离态的对象关联到session,持久化后清除缓存,执行delete语句;放入持久态的直接删除;  
  18. Session session2 = sessionFactory.openSession();  
  19. Transaction tr2 = session2.beginTransaction();  
  20. session2.delete(c1);  
  21. tr2.commit();  
  22. session2.close();  



User对象

[java]  view plain  copy
  1. public class User {  
  2.   
  3.     private Integer id;  
  4.     private String userName;  
  5.     private String password;  
  6.   
  7.     /*以下省略getter与setter*/  
  8. }  


配置User.hbm.xml文件。

[html]  view plain  copy
  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. <!-- 该文件用于配置,domain跟表的映射关系 -->   
  6. <hibernate-mapping package="com.mahaochen.hibernate.domain">  
  7.     <class name="User" table="mhc_user">  
  8.         <!-- id元素用于指定主键属性 -->    
  9.         <id name="id" column="id" type="integer">  
  10.             <!-- 用于指定主键生成策略 -->    
  11.             <generator class="increment"></generator>  
  12.         </id>  
  13.           
  14.         <!-- 对其他属性进行配置 -->   
  15.         <property name="userName" type="string">  
  16.             <column name="username" not-null="false" ></column>  
  17.         </property>  
  18.         <property name="password" type="string">  
  19.             <column name="password" not-null="false"></column>  
  20.         </property>  
  21.     </class>  
  22.       
  23. </hibernate-mapping>  

 Hibernate映射文件配置完成,以下将具体实现增删改查的操作。
增加操作

[java]  view plain  copy
  1. /** 
  2.      * insert 插入操作 
  3.      */  
  4.     public static void insert() {  
  5.         Session session = Hibernate4Util.getCurrentSession();  
  6.         User user = new User();  
  7.         user.setUserName("Insert");  
  8.         user.setPassword(new Date().getTime() + "");  
  9.         Transaction transaction = session.beginTransaction();  
  10.         session.save(user);  
  11.         transaction.commit();  
  12.         Hibernate4Util.closeSession(session);  
  13.     }  

删除操作

[java]  view plain  copy
  1. /** 
  2.      * delete 删除操作 
  3.      */  
  4.     public static void delete() {  
  5.         Session session = Hibernate4Util.getCurrentSession();  
  6.         User user = new User();  
  7.         user.setId(8); // ID值  
  8.         user.setUserName("Insert");  
  9.         user.setPassword(new Date().getTime() + "");  
  10.         Transaction transaction = session.beginTransaction();  
  11.         session.delete(user);  
  12.         transaction.commit();  
  13.         Hibernate4Util.closeSession(session);  
  14.     }  

修改操作

[java]  view plain  copy
  1. /** 
  2.      * update 更新操作 
  3.      */  
  4.     public static void update() {  
  5.         Session session = Hibernate4Util.getCurrentSession();  
  6.         Transaction transaction = session.beginTransaction();  
  7.         User user = new User();  
  8.         user = (User) session.get(User.class8);  
  9.         if (null != user) {  
  10.             user.setUserName("Insert0000");  
  11.             user.setPassword(new Date().getTime() + "");  
  12.             session.update(user);  
  13.         }  
  14.         transaction.commit();  
  15.         Hibernate4Util.closeSession(session);  
  16.     }  

查询操作

[java]  view plain  copy
  1. /** 
  2.      * select 查询操作 
  3.      */  
  4.     public static void select() {  
  5.         Session session = Hibernate4Util.getCurrentSession();  
  6.         User user = new User();  
  7.         Transaction transaction = session.beginTransaction();  
  8.         user = (User) session.get(User.class1);  
  9.         System.out.println(user.toString());  
  10.         transaction.commit();  
  11.   
  12.         Hibernate4Util.closeSession(session);  
  13.     }  


以下是参考别人的博客

1、加入junit.jar

2、新建一个工具类HibernateUtils.Java把一些对session的公共操作封装起来

[java]  view plain  copy
  1. import org.hibernate.Session;  
  2. import org.hibernate.SessionFactory;  
  3. import org.hibernate.cfg.Configuration;  
  4.   
  5. public class HibernateUtils {  
  6. /* 
  7.   *读取Hibernate.cfg.xml文件 
  8. */  
  9.     private static SessionFactory factory;  
  10.       
  11.     static {  
  12.         try {  
  13.             //读取hibernate.cfg.xml文件  
  14.             Configuration cfg = new Configuration().configure();  
  15.               
  16.             //建立SessionFactory  
  17.             factory = cfg.buildSessionFactory();  
  18.         }catch(Exception e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22.     /* 
  23.       *打开Session 
  24.     */  
  25.       
  26.     public static Session getSession() {  
  27.         return factory.openSession();  
  28.     }   
  29.     /* 
  30.       *关闭Session 
  31.     */  
  32.       
  33.     public static void closeSession(Session session) {  
  34.         if (session != null) {  
  35.             if (session.isOpen()) {  
  36.                 session.close();  
  37.             }  
  38.         }  
  39.     }  
  40.       
  41.     public static SessionFactory getSessionFactory() {  
  42.         return factory;  
  43.     }  
  44. }  


3、新建一个test类继承TestCase(Junit包里面的)然后下面就利用test类对User对象的增、删、改、查。

[java]  view plain  copy
  1. import java.util.Date;  
  2.   
  3. import org.hibernate.Session;  
  4.   
  5. import com.bjpowernode.hibernate.HibernateUtils;  
  6.   
  7. import com.bjpowernode.hibernate.User;  
  8.   
  9. import junit.framework.TestCase;  
  10.   
  11. public class test extends TestCase {  
  12. /* 
  13.  * 增加User 
  14.  */  
  15.     public void testSave() {  
  16.           
  17.         Session session = null;  
  18.         try {  
  19.             session = HibernateUtils.getSession();  
  20.             session.beginTransaction();  
  21.               
  22.             User user = new User();  
  23.             user.setName("李四");  
  24.             user.setPassword("123");  
  25.             user.setCreateTime(new Date());  
  26.             user.setExpireTime(new Date());  
  27.             session.save(user);  
  28.             session.getTransaction().commit();  
  29.         }catch(Exception e) {  
  30.             e.printStackTrace();  
  31.             session.getTransaction().rollback();  
  32.         }finally {  
  33.             HibernateUtils.closeSession(session);  
  34.         }  
  35.     }  
  36.     /** 
  37.      * 删除 
  38.      */  
  39.     public void testDel(){  
  40.         Session session = null;  
  41.         try {  
  42.             session = HibernateUtils.getSession();  
  43.             session.beginTransaction();  
  44.               
  45.             User user=(User)session.load(User.class"4028989545a244640145a24466300001");  
  46.               
  47.             session.delete(user);  
  48.             session.getTransaction().commit();  
  49.         }catch(Exception e) {  
  50.             e.printStackTrace();  
  51.             session.getTransaction().rollback();  
  52.         }finally {  
  53.             HibernateUtils.closeSession(session);  
  54.         }  
  55.     }  
  56.       
  57.     /** 
  58.      * 修改 
  59.      */  
  60.     public void testUpdate(){  
  61.         Session session = null;  
  62.         try {  
  63.             session = HibernateUtils.getSession();  
  64.             session.beginTransaction();  
  65.               
  66.             User user=(User)session.load(User.class"4028989545a243ca0145a243cbf80001");  
  67.             user.setName("王五");  
  68.             session.update(user);  
  69.             session.getTransaction().commit();  
  70.         }catch(Exception e) {  
  71.             e.printStackTrace();  
  72.             session.getTransaction().rollback();  
  73.         }finally {  
  74.             HibernateUtils.closeSession(session);  
  75.         }  
  76.     }  
  77.       
  78.     /** 
  79.      * 查询 
  80.      */  
  81.     public void testLoad(){  
  82.         Session session = null;  
  83.         try {  
  84.             session = HibernateUtils.getSession();  
  85.             session.beginTransaction();  
  86.               
  87.             User user=(User)session.load(User.class"4028989545a243ca0145a243cbf80001");  
  88.             System.out.println(user.getName());  
  89.             System.out.println(user.getId());  
  90.             System.out.println(user.getPassword());  
  91.             System.out.println(user.getClass());  
  92.             System.out.println(user.getCreateTime());  
  93.             System.out.println(user.getExpireTime());  
  94.             session.getTransaction().commit();  
  95.         }catch(Exception e) {  
  96.             e.printStackTrace();  
  97.             session.getTransaction().rollback();  
  98.         }finally {  
  99.             HibernateUtils.closeSession(session);  
  100.         }  
  101.     }  
  102. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值