zoukankan      html  css  js  c++  java
  • 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
    }
  • 相关阅读:
    C# Net Core 使用 ClientWebSocket 实现 WebSocket 客户端
    C# Net 使用 RSA 加密解密 OpenSSL 生成的密码
    VS 代码提示默认不选中 解决办法
    C# While 超时设置
    C# 比较日期格式中的年月大小
    C#实现QQ邮箱IMAP之邮件处理
    Windwos服务之定时发送邮件(一)
    js基于“合成大西瓜的”碰撞模型(一)
    Windows下,通过运行直接打开软件
    C#爬取国家统计局五级地址
  • 原文地址:https://www.cnblogs.com/gdwkong/p/8321310.html
Copyright © 2011-2022 走看看