zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    组合数据类型综合练习:1.组合数据类型练习
    Python基础综合练习(五角红旗+字符串练习)
    熟悉常用的Linux操作作业
    大数据概论/作业
    C语言文法
    实验一实验报告
    词法分析程序代码
    jmeter分布式压力测试
    使用badboy配合jmeter测试(详细)
    静态测试,动态测试
  • 原文地址:https://www.cnblogs.com/57rongjielong/p/8205212.html
Copyright © 2011-2022 走看看