zoukankan      html  css  js  c++  java
  • 框架 Hibernate 2

    持久化类百度百科 

    http://baike.baidu.com/link?url=gNus-8jhK0Mi401aIR-16YUAnWKzOJfeMagUV8_t5iG8235JyjMrmZPd7rIT35KyqbFHnnvlntYXhmt9tm-d4NnplTjPXTEAHO-QbbahHXXjwuAcxBGq1ZwoAzPVHY-X

    首先持久化作用是将程序数据在持久状态和瞬时状态间转换的机制。即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。 

    一般来说,持久化类(persistent class):可以被hibernate保存到数据库,并且从数据库读取的类。
    持久化类:是指其实例需要被Hibernate持久化到数据库中的类。持久化类符合JavaBean的规范,包含一些属性,以及与之对应的getXXX()和setXXX()方法。而持久化对象就是把对象保存至数据库或者文件中。
    区别就是:持久化类是能够实现持久化的类-也就是该类符合JavaBean的规范和持久化标准的一些操作。而持久化对象就是:持久化类的实例对象,并且将至保存到数据库或者文件中。
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                             "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
     <session-factory>
     <!--数据库连接  -->
      <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
      <property name="hibernate.connection.password">123456</property>
      <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
      <property name="hibernate.connection.username">test0816</property>
     <!--数据库方案  -->
      <property name="hibernate.default_schema">TEST0816</property>
     <!--数据库方言 -->
      <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
     <!--调试--> 
      <property name="hibernate.show_sql">true</property>
      <property name="hibernate.format_sql">true</property>
     <!--自动建表方式  --> 
      <property name="hibernate.hbm2ddl.auto">update</property>
     <!--映射文件  -->     
          <mapping resource="com/hanqi/entity/User.hbm.xml"/>
     </session-factory>
    </hibernate-configuration>
    package com.hanqi.test;
    
    import static org.junit.Assert.*;
    
    import java.util.Date;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.hanqi.entity.User;
    
    public class Test01 {
        
        private Session se=null;
        private SessionFactory sf=null;
        private Transaction ts=null;
        //定义特殊方法
        //在测试用例方法被执行之前自动执行的方法
        //一般用来初始化公用的对象
        //前置方法
        @Before
        public void init()
        {
            //1获取配置文件
            Configuration cfg=new Configuration().configure();
            //2注册配置
            ServiceRegistry sr=new StandardServiceRegistryBuilder()
                .applySettings(cfg.getProperties()).build();
            //3获取SessionFactory  (相当于jdbc的连接connection) 
            sf=cfg.buildSessionFactory(sr);
            System.out.println(sf);
                        
            //4产生Session 保存    跟jsp session没关系     叫会话而已  真正干活的
             se=sf.openSession();
                        
            //5启动事务
             ts=se.beginTransaction();
        }
        
        //后置方法
        //一般用来释放资源
        @After
        public void destory()
        {
            //7提交事务
            ts.commit();//提交事务,不然没有真正的放到数据库  在这里执行了insert语句才写进数据库
                    
            //8释放资源
            se.close();
            sf.close();
        }
        
        
        
        
        //测试Hibernate连接
        
        @Test
        public void test() {
        
            //6操作数据库
            //添加数据
            
            //实例化新对象,处于临时状态
            User u1=new User();
            u1.setBirthday(new Date());//创建当地时间
            u1.setMoney(2000);
            u1.setPassword("123456");
            u1.setUserName("测试1");
            //u1.setUserID(2);//自然主键
            
            //保存数据
            //通过save方法把对象从临时状态转成持久化状态
            se.save(u1);//不用操心insert语句,但不在这执行语句,也会有主键,hibernate自动生成
            System.out.println(u1);
            
            
        }
        
        //测试查询
        @Test
        public void test1()
        {
            //查询数据   查一个
            //提供2个参数
            //需要返回哪一个持久化类的实例
            //实例的标识(数据的主键值)
            //通过session的get方法获得的对象处于持久化状态
            User u2=(User)se.get(User.class,5);//User类  主键是3
            System.out.println(u2);
            
            
            //修改数据
            User u3=(User)se.get(User.class,10);//User类  主键是3
            u3.setUserName("修改");
            System.out.println(u3);
            
            //删除
            //se.delete(u2);//使持久化对象进入删除状态
            
        }
        
        @Test
        public void test2()
        {
            User u1=(User)se.get(User.class,5);//立即加载数据
            System.out.println("get后");
            System.out.println("u1="+u1);
            User u2=(User)se.get(User.class,6);
            System.out.println("u2="+u2);
        }
        
        public void test3()
        {
            User u1=(User)se.load(User.class,6 );//延时加载数据
            System.out.println("load后");
            System.out.println("U1="+u1);//当要使用时才能加载
        }
        
        //测试游离状态
        @Test
        public void test4()
        {
            //得到持久化状态的对象
            User u1=(User)se.get(User.class, 6);
            System.out.println("u1="+u1);
            se.close();//关闭游离状态
            
            //使u1进入游离状态
            u1.setUserName("测试游离456");
            //把OID置成null
            u1.setUserID(null);//把实体类的类型改为Integer  
            System.out.println("重新创建Session和事务...");
            
            //重新创建Session,再使session回来
            se=sf.openSession();
            //重新开启事务        事务se.close()之前已经关了
            ts=se.beginTransaction();
            
            se.saveOrUpdate(u1);//自动判断是save还是update 为空是添加,有的话修改
        }
        
    }
    package com.hanqi.entity;
    
    import java.util.Date;
    
    //持久化类         实体化类
    //不需要使用final终态
    public class User {
        
        private Integer userID;//Integer包装类   可以为null  int不可以
        private String userName;
        private Date birthday;
        private double money;
        private String password;
        
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public Integer getUserID() {
            return userID;
        }
        public void setUserID(Integer userID) {
            this.userID = userID;
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public double getMoney() {
            return money;
        }
        public void setMoney(double money) {
            this.money = money;
        }
        
        public User(Integer userID, String userName, Date birthday, double money, String password) {
            super();
            this.userID = userID;
            this.userName = userName;
            this.birthday = birthday;
            this.money = money;
            this.password = password;
        }
    
        
        @Override
        public String toString() {
            return "User [userID=" + userID + ", userName=" + userName + ", birthday=" + birthday + ", money=" + money
                    + ", password=" + password + "]";
        }
        //必须包含无参的构造方法
        //因为需要用到反射        反射要求是构造无参实例
        public User() {
            super();
        }
    
        
        
    }
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2016-11-7 14:38:39 by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping>
        <class name="com.hanqi.entity.User" table="T_USER">
            <id name="userID" type="int">
                <column name="USERID" />
                <generator class="native" />
            </id>
            <property name="userName" type="java.lang.String">
                <column name="USERNAME" length="20" not-null="true"/>
            </property>
            <property name="birthday" type="java.util.Date">
                <column name="BIRTHDAY" sql-type="DATE" />
            </property>
            <property name="money" type="java.lang.Double">
                <column name="MONEY" length="8" scale="2" default="0"/>
            </property>
            <property name="password" type="java.lang.String">
                <column name="PASSWORD" length="10"/>
            </property>
        </class>
    </hibernate-mapping>

  • 相关阅读:
    事务与锁的一些总结
    NYOJ 73
    NYOJ 456
    Sleep函数
    NYOJ 488(素数环)
    NYOJ 308
    NYOJ 27
    NYOJ 325
    NYOJ 138
    求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
  • 原文地址:https://www.cnblogs.com/hanruyue/p/6045618.html
Copyright © 2011-2022 走看看