先创建Person类,代码如下:(Person.java)

import java.util.*;

public class Person {

public int id;

public String name;

public String password;

public Date birthday;

public Person() {

}

public Person(String name, String password, Date birthday) {

super();

this.name = name;

this.password = password;

this.birthday = birthday;

}

@Override

public String toString() {

return "Person [id=" + id + ", name=" + name + ", password=" + password

+ ", birthday=" + birthday + "]";

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

}

创建person的映射,代码如下:(Person.hbm.xml)

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


<hibernate-mapping>

    <!-- 配置要映射的类 -->

    <class name="Person" table="person" >

        <id name="id" column="id">

            <generator class="native"/>

        </id>

        <!-- column如果不写,那么会根据name中的值,自动创建;若已存在的话,那就自动映射 -->

        <property name="name"></property>

        <property name="password" column="password"></property>

        <property name="birthday" column="birthday"></property>

    </class>


</hibernate-mapping>

   


配置Hibernate文件,代码如下:(hibernate.cfg.xml)

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">


<hibernate-configuration>

<session-factory>

<!-- 那些name的属性的值都可以从hibernate文件包中的hibernate.properties拷贝,根据不同数据库类型,复制不同的语句 -->

<!--  数据库方言,就是能让数据库发挥最大的特性  -->

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- 加载数据库的驱动 -->

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<!-- 要连接的数据库,相当于获取连接吧 -->

<property name="hibernate.connection.url">jdbc:mysql:///hibernatedemo</property>

<!-- 数据库账号 -->

<property name="hibernate.connection.username">root</property>

<!--  数据库密码  -->

<property name="hibernate.connection.password">123456</property>

<property name="show_sql">true</property>

<!-- 若表不存在,,添加这句可以自动建表 -->

<!-- 

create-drop 每次启动时候创建对应数据表结构,在SessionFactory关闭时候删除对应的表结构

create 每次启动时候删除上次创建的表结构然后重新创建一个新的表结构

validate 每次启动时候会验证并修改表结构

-->

<property name="hibernate.hbm2ddl.auto">update</property>

<!-- 映射,这个resource的路径一定要写正确,要写上包名,可以右击那个文件,选择roperties就可以看到路径,把src后面的复制黏贴过来即可 -->

<mapping resource="Person.hbm.xml"/>

</session-factory>

</hibernate-configuration>


创建Test类,主要用于测试各个功能,代码如下:(Test.java)

import org.hibernate.*;

import org.hibernate.cfg.*;

import org.hibernate.metamodel.source.annotations.entity.ConfiguredClass;

import org.hibernate.service.ServiceRegistry;

import org.hibernate.service.ServiceRegistryBuilder;

import org.hibernate.service.spi.ServiceBinding;


public class Test {

public static void main(String[] args) {

// test();


// sava();


// get();


// load();


// update1();


// update2();


// merge1();


merge2();


}



private static void merge2() {

Configuration config = new Configuration().configure();

ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(

config.getProperties()).buildServiceRegistry();

SessionFactory factory = config.buildSessionFactory(sr);

Session session = factory.openSession();

Transaction tx = session.beginTransaction();

Person p1 = new Person();

p1.setId(4);

p1.setName("tttmm");

Person p2 = (Person) session.merge(p1);

p1.setName("uuudhaf");

p2.setName("kkkkjjss");

tx.commit();

session.close();

}


private static void merge1() {

Configuration config = new Configuration().configure();

ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(

config.getProperties()).buildServiceRegistry();

SessionFactory factory = config.buildSessionFactory(sr);

Session session = factory.openSession();

Transaction tx = session.beginTransaction();

Person p1 = (Person) session.load(Person.class, 3);

p1.setName("jjoo");

Person p2 = (Person) session.merge(p1);

// p1.setName("oojj");

// p2.setName("qqww");


p2.setName("qqww");

p1.setName("oojj");


tx.commit();

session.close();

}


private static void update2() {

Configuration config = new Configuration().configure();

ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(

config.getProperties()).buildServiceRegistry();

SessionFactory factory = config.buildSessionFactory(sr);

Session session = factory.openSession();

Transaction tx = session.beginTransaction();

Person p1 = new Person();

p1.setName("ooxx");// 同样执行这句时候,因为p1是临时态,因此此时的name并没有改变

p1.setId(4);

// session.update(p1);

// p1.setName("xxoo");

tx.commit();

session.close();

}


private static void update1() {

Configuration config = new Configuration().configure();

ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(

config.getProperties()).buildServiceRegistry();

SessionFactory factory = config.buildSessionFactory(sr);

Session session = factory.openSession();

Transaction tx = session.beginTransaction();

Person p1 = (Person) session.get(Person.class, 3);

p1.setName("tom"); // 这句执行完毕的时候,数据库中的name已经变成了tom了。这就是持久态的一种作用。

// session.update(p1);

// p1.setName("lalala");

// //此时数据库中的name变成了lalala,就是上面说的实时改动,也可看做是一种数据库一天记录的引用,,,一有改变就改变。

tx.commit();

session.close();

}


private static void load() {

Configuration config = new Configuration().configure();

ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(

config.getProperties()).buildServiceRegistry();

SessionFactory factory = config.buildSessionFactory(sr);

Session session = factory.openSession();

Person p = (Person) session.load(Person.class, 3);

System.out.println("load----->" + p);

session.close();

}


private static void get() {

Configuration config = new Configuration().configure();

ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(

config.getProperties()).buildServiceRegistry();

SessionFactory factory = config.buildSessionFactory(sr);

Session session = factory.openSession();

Person p = (Person) session.get(Person.class, 1);

System.out.println("get----->" + p);

session.close();

}


private static void sava() {

Person p = new Person("kkjj", "123456", new java.util.Date());

Configuration config = new Configuration().configure();

// 这是在hibernate4一种新的获取SessionFactory的方法,这个方法比旧的方法更高效、安全

ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(

config.getProperties()).buildServiceRegistry();

SessionFactory factory = config.buildSessionFactory(sr);

Session session = factory.openSession();

Transaction tx = session.beginTransaction();

session.save(p);

tx.commit();

session.close();

}


private static void test() {

Person p = new Person("kk", "123", new java.util.Date());

// 读取配置文件

Configuration cfg = new Configuration().configure();

// hibernate的核心接口

// 下面这种方法获取SessionFactory已经被淘汰了,在hibernate4已经用另外的方法了。

SessionFactory factory = cfg.buildSessionFactory();

Session session = factory.openSession();

// 开启事务

Transaction tx = session.beginTransaction();



session.save(p);

// 提交,类似执行吧,可以理解为excetuUpdate()

tx.commit();

session.close();

}

}