Hao's Blog
Hibernate的学习1

Hibernate是什么

Hibernate是一个对象关系映射(ORM : Object Relational Mapping,指的是将一个Java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以操作数据库中的表)的框架(框架就是一个半成品软件,已经有部分功能),对JDBC做了轻量级的对象封装,可以通过映射关系自动生成SQL语句执行对数据库的操作等,是一个持久层的框架.

为什么要学习Hibernate(优势)

4e3293abf32dd

Hibernate的使用

1. Hibernate的包结构

documentation 一些Hibernate的api文档
lib 使用的库
required : Hibernate开发的必须的依赖包
optional : Hibernate开发的可选的jar包
project : Hibernate提供的项目

2 配置文件

映射配置文件

因为Hibernate是一个ORM框架,所以我们必须在配置文件中配置javabean对象与关系型数据库中的table的映射,一般映射配置文件的命名规则为 javabean的名字.hbm.xml
例子:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name为对象的名称,table为数据库中与之对应的表的名称 -->
    <class name="com.test.hibernate.demo1.Customer" table="cst_customer">
        <!-- 主键 -->
        <id name="cust_id" column="cust_id">
            <generator class="native"></generator>
        </id>
        <!-- 其他列 -->
        <!-- 其中type属性的写法有很多种,一般使用java的属性 -->
        <!-- 类中的属性名和表中的字段名如果一致,column可以省略 -->
        <property name="cust_name" column="cust_name"></property>
        <property name="cust_source" column="cust_source" type="java.lang.String" length="32"></property>
        <property name="cust_industry" column="cust_industry"></property>
        <property name="cust_level" column="cust_level"></property>
        <property name="cust_phone" column="cust_phone"></property>
        <property name="cust_mobile" column="cust_mobile"></property>
    </class>
</hibernate-mapping>
核心配置文件

此配置文件包含了必须的数据库的连接配置,数据库的方言,映射文件的导入.以及可选的使用第三方连接池(如c3p0)的配置,显示以及格式化sql语句的配置,以及自动建表的配置等.
此配置文件可以使用.properties的格式,也可以用XML来配置,但是通常都会使用XML来配置,因为使用.properties需要我们写代码来读取映射文件. 命名规则为:hibernate.properties 以及XML的hibernate.cfg.xml(在Hibernate包中的Project文件夹中的etc下有相关的配置实例).

以xml配置的实例:

<?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>
        <!-- 必须配置 -->
        <!-- 连接数据库的基本参数 -->
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_test1?useSSL=false</property>
        <property name="hibernate.connection.username">数据库登录账号</property>
        <property name="hibernate.connection.password">密码</property>
        <!-- 设置hibernate方言,也就是告诉hibernate使用哪种数据库的语法 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 可选的配置 -->
        <!-- 在控制台上打印出sql语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式化sql语句,没这个就是一行输出全部 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 
            是否自动依据映射关系自动建表 
            none        :不使用hibernate的自动建表
            create      :如果数据库中已经有表,删除原有表,重新创建,如果没有表,新建表。(项目测试用)
            create-drop :如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表.(项目测试用)
            update      :如果数据库中有表,使用原有表,如果没有表,创建新表(更新表结构)
            validate    :如果没有表,不会创建表。只会使用数据库中原有的表。(校验映射和表结构)。
        -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- 可以选择使用其他连接池,如c3p0 -->
        <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!--在连接池中可用的数据库连接的最少数目 -->
        <property name="c3p0.min_size">5</property>
        <!--在连接池中所有数据库连接的最大数目  -->
        <property name="c3p0.max_size">20</property>
        <!--设定数据库连接的过期时间,以秒为单位,
        如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
        <property name="c3p0.timeout">120</property>
            <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
        <property name="c3p0.idle_test_period">3000</property>

        <!-- 添加映射文件 -->
        <mapping resource="com/test/hibernate/demo1/Customer.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

如果以hibernate.properties的方式,加载映射文件的示例:

Configuration cfg = new Configuration();
cfg.addResource("com/test/hibernate/demo1/Customer.hbm.xml"); //加载映射文件

3 需要用到的接口或者类

  1. SessionFactory
    SessionFactory负责初始化Hibernate,数据存储源的代理,负责创建Session对象.SessionFactory并不是轻量级的,所以通常一个项目有一个SessionFactory即可(通过封装).同时SessionFactory是线程安全的.

简单的封装示例:

package com.test.hibernate.demo1;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    private static final Configuration configuration;
    private static final SessionFactory factory;

    static {
        configuration = new Configuration().configure();
        factory = configuration.buildSessionFactory();
    }

    public static Session getSession() {
        return factory.openSession();
    }
}
  1. Session
    一个类似JDBC中Connection的对象,负责执行被持久化对象的CRUD操作.同时Session是非线程安全的,所以只能做局部变量.
  • session中常用的api
Serializable save(Object object) //insert
<T> T get(Class<T> entityType, Serializable id) //查询
<T> T load(Class<T> theClass, Serializable id) //查询

get和load查询的区别

  1. get查询是立即加载,执行到get的使用就会发送sql语句去查询; 而load则是懒加载,只有使用到该对象的未知属 性时候才会去发送sql语句。
  2. get查询返回的对象是真实对象本身;load则返回的是代理对象.
  3. get查询找不到数据的时候返回null; 而load则抛出ObjectNotFoundException的异常.
void update(Object object) //修改
void delete(Object object) //删除
void saveOrUpdate(Object object)  //保存或者更新
//以上三个方法都建议先查询出对象然后在执行相关操作
  1. Transaction
    事务对象
void commit(); //提交
void rollback(); //回滚