框架 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>