Hibernate入门(一)

  Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO(java类)与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。

  简而言之,Hibernate持久层的框架,封装了JDBC, 就是操作数据库的. 用了他之后, 基本上不用写sql语句了。

一、ORM的概念

  ORM:Object(对象/类) Relational(关系) Mapping(映射)​ 是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

  • O: Object对象,面向对象语言领域,Java中的JavaBean

  • R: 关系数据库领域的Relational(数据库中表的结构)

  • M: 映射Mapping(XML的配置文件)

二、Hibernate入门

1、下载Hibernate环境资源

http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download

2、Hibernate官网

http://hibernate.org/orm/

3、创建java项目,导入jar包

  • 数据库驱动包
  • Hibernate相关的jar包,拷贝 hibernate-release-5.0.7.Finallib equired 下所有:

4、编写数据bean

  • User.class
public class User {
    private Integer uid;
    private String uname;
    private int uage;
    public Integer getUid() { return uid;}
    public void setUid(Integer uid) {this.uid = uid;}
    ......
}

注意:

  ①需要给数据bean中对应表中主键的属性设置为对象(包装)类型,且必须实现序列化接口。

  ②需要提供getter和setter方法。

 5、配置映射文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!-- 导入约束 -->
 3 <!DOCTYPE hibernate-mapping PUBLIC 
 4     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 5     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 6 <hibernate-mapping>
 7     <!-- 一、class标签用于表示JavaBean和表的映射关系:name是类名(全限定名),table是数据库表的表名 -->
 8     <class name="com.pri.bean.User" table="user">
 9         <!-- 1、id用来配置主键:name是JavaBean里的字段名,column是表中的主键列名 -->
10         <id name="uid" column="uid">
11             <!-- 1.1 generator主键生成策略 -->
12             <generator class="native"></generator>
13         </id>
14 
15         <!-- 2.配置普通的字段对应关系 -->
16         <property name="uname" column="uname"/>
17         <property name="uage" column="uage"/>
18     </class>
19 </hibernate-mapping>

注意:

​ 1.命名规范问题:hibernate命名以类.hbm.xml方法命名。

​ 2.新建位置规范:通常和java类放到同一个包中。

​ 3.dtd头的导入:在 下的org/hibernate包中有对应的dtd头

​ 4.在配置关系过程中,几乎所有的name属性指向的都是Java类,column和table指向数据库表。

6、配置核心文件hibernate.cfg.xml

  在下载的资源包中有模板: hibernate-release-5.0.7.Final/project/etc/hibernate.cfg.xml 

  同一文件夹中:hibernate.properties文件则为相关属性及属性值说明,在配置相关属性时,可从中查找。

<?xml version="1.0" encoding="UTF-8"?>
<!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>
        <!-- 一、必配项 -->
        <!-- 1.1 数据库的四个基本项 和 数据库方言 -->
        <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:///test01</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123456</property>

        <!-- 二、选配项 -->
        <!-- 2.1 配置第三方连接池 需要导hibernate-release-5.0.7.Final/lib/optional/c3p0/中的jar包 -->
        <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
        <!-- 连接池最大连接数为 10个 --> 
<property name="hibernate.c3p0.max_size">10</property>

<!-- 2.1 日志显示sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 2.2 日志格式化sql语句 --> <property name="hibernate.format_sql">true</property> <!-- 2.3 配置是否由Hibernate生成表
          none:不用Hibernate自动生成表(默认)
​           create-drop:每次都会创建一个新的表,执行程序结束后删除这个表.
​           create:每次都会创建一个新的表.
​           update:有(表, 列)就使用, 没有(表, 列)就创建
​ validate:只会使用原有的表.对映射关系进行校验.
      -->
     <property name="hibernate.hbm2ddl.auto">create</property>
        <!-- 三、加载映射关系配置 -->
        <mapping resource="com/pri/bean/User.hbm.xml"/>
    </session-factory> 
</hibernate-configuration>

命名规范要求:以 hibernate.cfg.xml 方式命名

​         hibernate.cfg.xml放到src目录中,也就是classpath路径(类根路径)

7、编写程序访问数据库

  • HibernateDemo.java
 1 public class UserDao{
 2     @Test
 3     public void addUser(){
 4         //1、创建Configuration对象
 5         Configuration configuration = new Configuration();
 6         //2、加载配置
 7         configuration.configure();
 8         //3、获得SessionFactory工厂
 9         SessionFactory sessionFactory = configuration.buildSessionFactory(); 
10         //4、从SessionFactory中打开session
11         Session session = sessionFactory.openSession();
12         //5、开启事务
13         Transaction transaction = session.beginTransaction();
14         //6、操作数据库
15         User user = new User();
16         user.setUname("张三");
17         user.setUage(18);
18         session.save(user);
19         //7、提交或者回滚事务
20         transaction.commit();
21         //8、关闭资源
22         session.close();
23         sessionFactory.close();
24     }
25 }

三、Hibernate核心java类详解

1、Configuration

  Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。

  • 作用:

    配置对象,用来加载Hibernate的核心配置文件。

    Hibernate框架通过该对象来获得对象-关系映射文件中的元数据,以及动态配置Hibernate的属性。

    可以创建SessionFactory对象。

  • Java代码

Configuration configuration = new Configuration();

configuration.configure();

2、SessionFactory

  SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

  • 作用:

    获取session

    SessionFactory中相当于是连接池,内部获得Session.

    SessionFactory并不是一个轻量级对象,内部维护连接池和hibernate的二级缓存(企业很少用,redis).

    一个项目一般只需要创建一个SessionFactory.

  • 抽取的HibernateUtils
 1 public class HibernateUtils {
 2 
 3     private static SessionFactory sessionFactory = null;
 4     private static Configuration configuration = null;
 5     
 6     static {
 7         //1.创建Configuration对象
 8         configuration = new Configuration();
 9         //2.加载配置
10         configuration.configure();
11         //3.获得SessionFactory工厂
12         sessionFactory = configuration.buildSessionFactory();
13     }
14 
15     private HibernateUtils() {
16     }
17 
18     public static Session openSession(){
19         //4.从SessionFactory中打开session
20         return sessionFactory.openSession();
21     }
22 }

3、Session

     Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。

   session不是线程安全的(使用时候,不能创建全局的).

​   内部维护Hiberante的一级缓存(优化的手段).

  • 常见的操作数据库API
    • Serializable save(Object obj);        --保存数据,返回值是保存数据返回的id
    • ​ T get(Class clazz,Serializable id);   --根据主键查询对象
    • ​ T load(Class clazz,Serializable id); --根据主键查询对象
    • ​ void update(Object obj);           --更新数据
    • ​ void delete(Object obj);                --删除数据
  • get方法和load方法的区别
    • get方法的特点
      • ​ get方法采用的是立即检索策略(查询):执行到这行的时候,马上发送SQL查询
      • ​ get方法查询后返回的是真实对象的本身
    • load方法的特点
      • ​ load方法采用的是延迟加载(懒加载lazy:什么时候使用,才会去加载)的策略:执行到这行的时候,不会发送 SQL语句,什么时候使用这个对象,才会发送SQL语句。
      • ​ load查询后返回的是代理对象

4、Transcation

  Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。

  Transaction对象代表的是事务对象,事务开启session.beginTransaction();

  • 常用API

    ​ commit():提交事务

    ​ rollback():回滚事务

  • 特点

    ​ Hibernate框架默认情况下事务不自动提交.需要手动提交事务

    ​ 如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务

    ​ 每段事务操作都是隐含着异常的,需要手动添加try catch

  • 测试事物没有自动提交
if(session instanceof SessionImpl){
    SessionImpl sessionImpl  = (SessionImpl) session;
    Connection connection = sessionImpl.connection();
    System.out.println(connection.getAutoCommit());//false
}
原文地址:https://www.cnblogs.com/gdwkong/p/8321310.html