Hibernate(一)

1.Hibernate介绍

hibernate3.6: hibernate公司的产品.

hibernate4.3.8: jboss公司的产品.

2.作用

能让程序员以面向对象的方式来操作数据库,从而简化持久层的开发。

底层可以跨数据库. (程序人员开发项目不用关心项目用得是什么数据库).

ORM: Object Relation Mapping 对象关系映射.

Object : 对象指得是面向对象的编程语言.

Relation: 关系指得是关系型数据库.

Mapping : 面向对象的编程语言与关系型数据库之间的映射.

3.ORM

ORM思想:它是用来解决面向对象的编程语言与关系型数据库之间的映射.ORM它是一种思想,不是具体的框架.

       ORM框架:Hibernate4、TopLink、JDO等.

  ORM的映射思想:

    类对应表

    对象对应一条数据

    属性对应列名

4.JPA

  JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

JPA 与 ORM之间的关系:JPA是sun公司根据ORM思想制订出来的持久化层的规范. (有一套持久化的api)

JPA的实现商:Hibernate4、TopLink、JDO等.

由于JPA出现的时间比Hibernate4晚,学习Hibernate框架时,既要学习Hiberante框架,又要学习JPA.

尽量面向jpa编程,到时底层的ORM框架就可以自由切换.

JDBC: Java DataBase Connection java数据库连接的规范.

JDBC它是sun为各个数据库厂商制订的连接数据库的规范.(有一套连接数据的api,这些api都是接口).

5.核心类

Configuration 配置

   专门负责加载全局的配置文件,产生SessionFactory.

ServiceRegistry 注册

SessionFactory 会话工厂

    它是当前数据库在内存中镜像。一个SessionFactory对应一个数据库,所以SessionFactory只能有一个,当应用一启动就获取SessionFactory,当应用关闭时才关闭SessionFactory.

       它是线程安全的.

       它是创建Session的工厂。

       它底层封装了数据源(连接池)。

       它还有一个可选的二级缓存. (默认是关闭的).

Session 会话

    它是应用程序与持久层进行交互的单线程对象。

       它是线程不安全

       它存活的时间比较短.(因为它底层封装得是Connection,用完就要关闭).

       它是事务工厂.

       有一个必须开启的一级缓存. (一级缓存永远都是开启的).

Transaction 事务

       JDBC事务(局部事务) : 只能对一个数据库中的表做事务. (web容器) tomcat jetty

       JTA事务(全局事务、分布式事务) : 可以对多个数据库中的表做事务.(EJB容器)

              WebSphere(IBM)、WebLogic(Oracle)、JBoss(jboss)

ConnectionProvider : 数据库连接的提供者

       一般指得是数据源DataSource(连接池).

 

6.基本使用

注解方式:

新建项目

A.导包

向项目导入以下包:(官网下载的Hibernate项目的lib文件夹下)

B.配置文件src/hibernate.cfg.xml

在官网下载的Hibernate项目中搜索hibernate.cfg.xml,拷贝一个配置文件到src根目录下。

 

<!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>
        <!-- 配置数据库方言,告诉Hibernate4我们用得是什么样的数据库 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <!-- 配置显示SQL语句 -->
        <property name="hibernate.show_sql">true</property>        
        <!-- 配置格式化SQL语句 -->
        <property name="hibernate.format_sql">true</property>    
        <!-- 是否自动建表-->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- 配置连接数据库的驱动类 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 配置连接数据库的URL (创建数据库) -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&amp;characterEncoding=utf8</property>
        <!-- 配置连接数据库的用户名 -->
        <property name="hibernate.connection.username">root</property>
        <!-- 配置连接数据库的密码 -->
        <property name="hibernate.connection.password">root</property>
        <!-- 配置c3p0连接池中最大连接数 -->
        <property name="hibernate.c3p0.max_size">10</property>
        <!-- 配置c3p0连接池中最小连接数 -->
        <property name="hibernate.c3p0.min_size">3</property>
        <!-- 配置持久化类  class是注解方式-->
        <mapping class="com.rong.entity.User"/>
    </session-factory>
</hibernate-configuration>

C.编写实体类

 

 1 package com.rong.entity;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.Id;
 5 
 6 @Entity
 7 public class User {
 8     @Id
 9     private int id;
10     private String name;
11     private int age;
12     public int getId() {
13         return id;
14     }
15     public void setId(int id) {
16         this.id = id;
17     }
18     public String getName() {
19         return name;
20     }
21     public void setName(String name) {
22         this.name = name;
23     }
24     public int getAge() {
25         return age;
26     }
27     public void setAge(int age) {
28         this.age = age;
29     }
30     @Override
31     public String toString() {
32         return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
33     }
34     
35 }

D.测试

在本地创建数据库名为hibernate的数据库

 

CREATE DATABASE hibernate CHARSET utf8;
 1 package com.rong.test;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 7 import org.hibernate.cfg.Configuration;
 8 import org.hibernate.service.ServiceRegistry;
 9 import org.junit.Test;
10 
11 public class HibernateTest {
12     @Test
13     public void oneTest(){
14         //1.获得SessionFacotry
15         Configuration configuration=new Configuration()    // 默认会加载src/hibernate.properties属性文件
16                                           .configure();// 默认会加载src/hibernate.cfg.xml
17         ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder()
18                                         .applySettings(configuration.getProperties())//把配置信息交给注册
19                                         .build();
20         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
21         //2.获得Session
22         Session session = sessionFactory.openSession();
23         //3.开启事务
24         Transaction transaction = session.beginTransaction();
25         //在数据库表操作......
26         
27         //4.提交事务
28         transaction.commit();
29         //5.关闭资源
30         session.close();
31         sessionFactory.close();
32     }
33 }

E.查看数据库

数据库的user表被创建

xml配置文件方式:

A.导包

B.配置文件src/hibernate.cfg.xml

在官网下载的Hibernate项目中搜索hibernate.cfg.xml,拷贝一个配置文件到src根目录下。

<!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>
        <!-- 配置数据库方言,告诉Hibernate4我们用得是什么样的数据库 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <!-- 配置显示SQL语句 -->
        <property name="hibernate.show_sql">true</property>        
        <!-- 配置格式化SQL语句 -->
        <property name="hibernate.format_sql">true</property>    
        <!-- 是否自动建表-->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- 配置连接数据库的驱动类 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 配置连接数据库的URL (创建数据库) -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&amp;characterEncoding=utf8</property>
        <!-- 配置连接数据库的用户名 -->
        <property name="hibernate.connection.username">root</property>
        <!-- 配置连接数据库的密码 -->
        <property name="hibernate.connection.password">root</property>
        <!-- 配置c3p0连接池中最大连接数 -->
        <property name="hibernate.c3p0.max_size">10</property>
        <!-- 配置c3p0连接池中最小连接数 -->
        <property name="hibernate.c3p0.min_size">3</property>
        <!-- 配置持久化类  class是注解方式 resource是映射文件方式-->
        <mapping class="com.rong.entity.User"/>
        <mapping resource="com/rong/entity/xml/Student.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

C.编写实体类

 1 package com.rong.entity.xml;
 2 
 3 public class Student {
 4     private int id;
 5     private String name;
 6     private int age;
 7     public int getId() {
 8         return id;
 9     }
10     public void setId(int id) {
11         this.id = id;
12     }
13     public String getName() {
14         return name;
15     }
16     public void setName(String name) {
17         this.name = name;
18     }
19     public int getAge() {
20         return age;
21     }
22     public void setAge(int age) {
23         this.age = age;
24     }
25     @Override
26     public String toString() {
27         return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
28     }
29 }

D.配置XXX.hbm.xml文件

  在官网下载的Hibernate项目中搜索*.hbm.xml,拷贝一个配置文件到该实体类的目录下。如:Student类,xml文件名为Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.rong.entity.xml.Student" table="student">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <property name="name" column="name" />
        <property name="age" column="age" />
    </class>
</hibernate-mapping>

E.测试

  与注解方式一样。

F.查看数据库

7.Hibernate对象状态

瞬态 : User user = new User(); 我们程序使用,hibernate不认识

持久化状态:交给hibernate认识。

托管状态:又重新交给应用管理了。

A.查看对象状态

 1 package com.rong.test;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 7 import org.hibernate.cfg.Configuration;
 8 import org.hibernate.service.ServiceRegistry;
 9 import org.junit.Test;
10 
11 import com.rong.entity.User;
12 
13 public class HibernateTest {
14     @Test
15     public void oneTest(){
16         //1.获得SessionFacotry
17         Configuration configuration=new Configuration()    // 默认会加载src/hibernate.properties属性文件
18                                           .configure();// 默认会加载src/hibernate.cfg.xml
19         ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder()
20                                         .applySettings(configuration.getProperties())//把配置信息交给注册
21                                         .build();
22         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
23         //2.获得Session
24         Session session = sessionFactory.openSession();
25         //3.开启事务
26         Transaction transaction = session.beginTransaction();
27         //在数据库表操作......
28         User user=new User();//瞬态
29         user.setName("rjl");
30         //判断Session的一级缓存中是否包含这个对象。false 是瞬态 true是持久化状态
31         System.out.println(session.contains(user));//false
32         
33         session.save(user);//持久化状态
34         System.out.println(session.contains(user));//true
35         
36         session.clear();//脱管状态
37         System.out.println(session.contains(user));//false
38         //4.提交事务
39         transaction.commit();
40         //5.关闭资源
41         session.close();
42         sessionFactory.close();
43     }
44 }

B.对象持久化状态(存储到数据库)

save与persist的区别:

第一个区别

save方法有返回值,它的返回值是主键id

persist方法没有返回值,调用对象的getId();

第二个区别

save方法:它会立即往数据库表中插入数据,马上生成insert语句

persist方法:他会延迟往数据库表中插入数据。跟事务是否开启有关。

注意:在事务开启后执行两个方法做添加都会立即生成sql语句。

 1 package com.rong.test;
 2 
 3 import java.io.Serializable;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.Transaction;
 8 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 9 import org.hibernate.cfg.Configuration;
10 import org.hibernate.service.ServiceRegistry;
11 import org.junit.Test;
12 
13 import com.rong.entity.User;
14 
15 public class HibernateTest {
16     @Test
17     public void oneTest(){
18         //1.获得SessionFacotry
19         Configuration configuration=new Configuration()    // 默认会加载src/hibernate.properties属性文件
20                                           .configure();// 默认会加载src/hibernate.cfg.xml
21         ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder()
22                                         .applySettings(configuration.getProperties())//把配置信息交给注册
23                                         .build();
24         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
25         //2.获得Session
26         Session session = sessionFactory.openSession();
27         //3.开启事务
28         Transaction transaction = session.beginTransaction();
29         //在数据库表操作......
30         User user=new User();//瞬态
31         user.setName("rjl");
32         //判断Session的一级缓存中是否包含这个对象。false 是瞬态 true是持久化状态
33         System.out.println(session.contains(user));//false
34         
35 /*        user.setId(1);
36         Serializable serializable = session.save(user);//持久化状态
37         System.out.println(serializable);//save方法返回user的id,返回1
38         System.out.println(session.contains(user));//true
39 */        
40 /*        user.setId(2);
41         user.setName("kobe");
42         session.saveOrUpdate(user);//持久化状态。
43                                    //数据库先查询,若不存在该记录id,则插入;否则更新44         System.out.println(session.contains(user));//true
45 */        
46 /*        user.setId(3);
47         session.persist(user);//持久化状态。
48         System.out.println(session.contains(user));//true
49 */        
50         user.setId(4);
51         user.setAge(18);
52         user.setName("lyr");
53         User mergeUser = (User) session.merge(user);
54         //user还是瞬态,mergeUser才是持久化状态
55         System.out.println(session.contains(user));//false
56         System.out.println(session.contains(mergeUser));//true
57         
58         //4.提交事务
59         transaction.commit();
60         //5.关闭资源
61         session.close();
62         sessionFactory.close();
63     }
64 }

C.查询

 1 package com.rong.test;
 2 
 3 import java.io.Serializable;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.Transaction;
 8 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 9 import org.hibernate.cfg.Configuration;
10 import org.hibernate.service.ServiceRegistry;
11 import org.junit.Test;
12 
13 import com.rong.entity.User;
14 
15 public class HibernateTest {
16     @Test
17     public void oneTest(){
18         //1.获得SessionFacotry
19         Configuration configuration=new Configuration()    // 默认会加载src/hibernate.properties属性文件
20                                           .configure();// 默认会加载src/hibernate.cfg.xml
21         ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder()
22                                         .applySettings(configuration.getProperties())//把配置信息交给注册
23                                         .build();
24         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
25         //2.获得Session
26         Session session = sessionFactory.openSession();
27         //3.开启事务
28         Transaction transaction = session.beginTransaction();
29         //在数据库表操作......
30         
31         //get方式通过id获取一条数据
32         //立刻发送sql语句查询
33         User user1 = (User) session.get(User.class, 3);
34         System.out.println(user1);
35         
36         //load方式通过id获取一条数据
37         //load方式延迟加载数据,当使用对象当中的方法或者属性时,就会查询数据库。
38         //在使用对象的方法时,必须要保证session没有关闭
39         User user2=(User) session.load(User.class, 4);
40         System.out.println(user2);
41         //4.提交事务
42         transaction.commit();
43         //5.关闭资源
44         session.close();
45         sessionFactory.close();
46     }
47 }

D.更新

 1 package com.rong.test;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 7 import org.hibernate.cfg.Configuration;
 8 import org.hibernate.service.ServiceRegistry;
 9 import org.junit.Test;
10 
11 import com.rong.entity.User;
12 
13 public class HibernateTest {
14     @Test
15     public void oneTest(){
16         //1.获得SessionFacotry
17         Configuration configuration=new Configuration()    // 默认会加载src/hibernate.properties属性文件
18                                           .configure();// 默认会加载src/hibernate.cfg.xml
19         ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder()
20                                         .applySettings(configuration.getProperties())//把配置信息交给注册
21                                         .build();
22         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
23         //2.获得Session
24         Session session = sessionFactory.openSession();
25         //3.开启事务
26         Transaction transaction = session.beginTransaction();
27         //在数据库表操作......
28         
29         //在持久化状态下,直接修改对象的属性,就会发送update语句更新数据库
30         //建议采用此种方式
31         User user1=(User)session.get(User.class, 3);//持久化状态
32         //user1.setName("rong");
33         user1.setAge(16);
34         
35         //在瞬态状态下更新数据库数据,注意:一定要全部赋值,否则其它属性会为变为默认值
36         User user2=new User();//瞬态
37         user2.setId(4);
38         user2.setAge(20);
39         session.saveOrUpdate(user2);//持久化状态
40         //session.update(user2);//持久化状态
41         //4.提交事务
42         transaction.commit();
43         //5.关闭资源
44         session.close();
45         sessionFactory.close();
46     }
47 }

E.删除

 1 package com.rong.test;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 7 import org.hibernate.cfg.Configuration;
 8 import org.hibernate.service.ServiceRegistry;
 9 import org.junit.Test;
10 
11 import com.rong.entity.User;
12 
13 public class HibernateTest {
14     @Test
15     public void oneTest(){
16         //1.获得SessionFacotry
17         Configuration configuration=new Configuration()    // 默认会加载src/hibernate.properties属性文件
18                                           .configure();// 默认会加载src/hibernate.cfg.xml
19         ServiceRegistry serviceRegistry= new StandardServiceRegistryBuilder()
20                                         .applySettings(configuration.getProperties())//把配置信息交给注册
21                                         .build();
22         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
23         //2.获得Session
24         Session session = sessionFactory.openSession();
25         //3.开启事务
26         Transaction transaction = session.beginTransaction();
27         //在数据库表操作......
28         
29         //在持久化状态下 直接删除
30         User user1=(User) session.get(User.class, 4);//持久化状态
31         session.delete(user1);
32         
33         //在瞬态状态下删除
34         User user2=new User();
35         user2.setId(0);
36         session.delete(user2);
37         //4.提交事务
38         transaction.commit();
39         //5.关闭资源
40         session.close();
41         sessionFactory.close();
42     }
43 }

 

posted @ 2018-01-05 16:11  57容杰龙  阅读(146)  评论(0编辑  收藏  举报