zoukankan      html  css  js  c++  java
  • Hibernate 基本使用

    Hibernate框架概述

    一、什么是框架

    • 软件的一个半成品,已经帮你完成了部分功能。
    • 把一些不确定的东西,按照框架要求,达到相应的功能

    Hibernate是JavaEE技术三层架构所用到的技术

    二、hibernate简介

    1. hibernate是什么框架

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

    2. ORM

    • Object Relational Mapping(对象关系映射)。
    • 指的是将一个Java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以操作数据库中的表。

    3. hibernate好处

    • 对JDBC访问数据库的代码进行了轻量级封装,简化了数据访问层繁琐重复性的代码,减少了内存消耗,加快了运行效率
    • 是一个基本JDBC的主流持久化框架,很大程度上简化了DAO层的编码工作
    • 性能非常好, 映射灵活性比较好,支持多关系数据库,一对一,一对多,多对多的各种复杂关系
    • 可扩展性强,源代码及API开放,当本身功能不够用时,可以自行编码进行扩展

    Hibernate基本使用

    一、下载框架

    下载地址

    二、Hibernate目录

    1. documentation

    • Hibernate开发的文档

    2. lib

    • Hibernate开发的文档
    • required:Hibernate开发的必须的依赖包
    • optional:Hibernate开发的可选的jar包

    3. project

    • Hibernate提供的参考项目

    三、Hibernate使用

    1.创建一个项目

    • 可以Java项目中使用
    • 可以在Web项目中使用都可以

    2.引入必须的jar包

    • 数据库的驱动包
    • Hibernate开发必须的Jar包

    3.建表

    CREATE TABLE `customer` (
      `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
      `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
      `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
      `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
      `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
      `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
      `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
      PRIMARY KEY (`cust_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    

    4.创建ORM类

    可以用lombok插件自动生成set和get方法。

    5.创建Hibernate的核心配置文件

    • 通常都叫hibernate.cfg.xml
    • 创建完毕后, 也有一个约束要引入
    • 在org.hibernate包当中可以找到对应的dtd configuration.dtd
    • 属性名记不住
      • 在目录提供的project当中有一个etc
      • 在etc当中 有一个hibernate.properties的文件打开
      • 打开后,会看到连接各种数据库时需要的属性参数
    • 需要配置方言
      • 不同的数据库,使用的语言不一样
      • 在hibnate当中,sql语句会自动帮你生成
      • 设置方言,就是设置自动生成的语言是哪个数据库当中的sql
    • 配置核心配置文件要加载哪一个映射
      • 映射的路径就是上面创建的跟表相对应的配置文件
      • 把全路径的点,要换成斜杠
    • 配置演示
    <!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.jdbc.Driver</property>
    		<property name="hibernate.connection.url">jdbc:mysql://localhost:3307/hibernate</property>
    		<property name="hibernate.connection.username">root</property>
    		<property name="hibernate.connection.password">abcd</property>
    		<!-- 配置Hibernate的方言 -->
    		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
    		<!-- 打印SQL -->
    		<property name="hibernate.show_sql">true</property>
    		<!-- 格式化SQL -->
    		<property name="hibernate.format_sql">true</property>
    		<!-- 自动创建表 -->
    		<property name="hibernate.hbm2ddl.auto">update</property>
    		
    		<!--加载映射文件 -->
    		<mapping resource="com/xzh/hibernate/domain/Customer.hbm.xml" />
    	</session-factory>
    </hibernate-configuration>
    

    6.创建映射关系

    • 通过XML的配置文件来进行配置

    • 这个配置文件可以任意命名

      • 类名.hbm.xml
      • 别人一看,就能够知道是哪个类的映射文件
    • 在xml当中引入dtd

      • 在hibernate-core.jar包当中
      • 在org.hibernate包当中可以找到对应的dtd
      • 打开mapping.dtd
      • 把里面的约束复制一份,放到xml当中
    • 建立类与表的映射
      1.建立表与类的映射
      2.建立主键的映射
      3.建立普通属性的映射

    • 配置演示

    <?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>
    	<class name="com.xzh.hibernate.domain.Customer" table="customer">
    		<!--建立类属性哪一个是主键 还要跟数据库当中主键进行对应 -->
    		<id name="cust_id" column="cust_id">
    			<generator class="native" />
    		</id>
    		<!--建立类中的普通属性与数据库当中字段进行关联 -->
    		<property name="cust_name" column="cust_name" />
    		<property name="cust_source" column="cust_source" />
    		<property name="cust_industry" column="cust_industry" />
    		<property name="cust_level" column="cust_level" />
    		<property name="cust_phone" column="cust_phone" />
    		<property name="cust_mobile" column="cust_mobile" />
    	</class>
    </hibernate-mapping>
    

    7.创建类执行

    @Test
    public void test1() {
    	// 1.加载配置文件
    	Configuration configure = new Configuration().configure();
    	// 2.创建sessionFactory --JDBC链接池
    	SessionFactory sessionFactory = configure.buildSessionFactory();
    	// 3.获取session --连接对象
    	Session session = sessionFactory.openSession();
    
    	Customer customer = new Customer();
    	customer.setCust_name("myxq");
    	customer.setCust_level("2");
    	// 4.保存
    	session.save(customer);
    	// 5.释放资源
    	session.close();
    	sessionFactory.close();
    	}
    

    常见配置

    一、映射配置

    1. class标签

    • 作用:建立类与表的映射关系
    • 属性
      • name:类的全路径
      • table:表名;类名与表名一致,table可以省略;如果没有该表,或自动创建一个表。
      • catalog:数据库名,可以不写

    2. ID标签

    • 作用:建立类中的属性与表中主键的对应关系
    • 属性
      • name
      • column
      • length
      • type

    3. property

    • 作用:用于建立类中普通属性与表的对应关系
    • 属性
      • name:类中的属性名
      • column:表中的字段名;如果字段名与类中的属性名一致,column是可以省略
      • length:字段的长度
        • 默认数据库当中已经有长度了
        • hibernate是可以根据映射自动建表
        • 建表是没有设定长度,就使用默认的长度
      • type:类型;可以不用写,会自动帮你装换
      • not-null:不允许为空
      • unique:唯一的

    二、核心配置

    1. 必须配置

    • 连接数据库的基本的property参数
      • 驱动类
      • url路径
      • 用户名
      • 密码
    • 方言

    2. 可选配置

    • 显示SQL
      hibernate.show_sql

    • 格式化SQL
      hibernate.format_sql

    • 自动建表
      hibernate.hbm2ddl.auto
      属性:

      • none
        不使用hibernate的自动建表
      • create
        如果数据库中已经有表,删除原有表,重新创建,如果没有表,新建表
      • create-drop
        如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表。
        最后数据库中一个表没有,为了做测试用
        把sessionFactory也close掉时才有效果
      • update
        如果数据库中有表,使用原有表,如果没有表,创建新表
        更新表结构,如果column没有时会创建新的一列
      • validate
        如果没有表,不会创建表。只会使用数据库中原有的表
        校验映射和表结构是否一致,不一致就会报错

    3. 引入映射文件

    <mapping resource="映射文件全路径"/>
    

    核心API

    一、Configuration

    Configuration是Hibernate的配置对象

    Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。

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

    通过这个对象去加载它里面的配置,得到里面的数据内容,才能进行后面的工作。

    作用

    1. 加载核心配置文件
    • 核心配置文件是属性文件

      • 名称为:hibernate.properties
      • 直接 configuration cfg = new configuration();
    • 核心配置文件是一个xml

      • 名称为:hibernate.cfg.xml
      • configuration cfg = new configuration().configure();
    2. 加载映射文件
    • 属性文件是没有办法加载映射,可以通过config加载映射文件
    • configuration.addResource("映射文件的全路径");

    二、SessionFactory

    sessionFactory

    • SessionFactory接口:SessionFactory接口负责初始化Hibernate。
    • 并负责创建Session对象。
    • 需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,
    • 当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
    • 内部维护了Hibernate的连接池和Hibernate的二级缓存
    • 一个项目只需要创建一个就行了,因为里面有连接池,连接池创建一个就可以了

    配置连接池

    C3P0:

    引入C3P0的jar包

    hibernate-release-5.3.1.Finalliboptionalc3p0 的目录下,有三个jar包。

    添加C3P0的配置信息

    在 hibernate.cfg.xml 中添加C3P0的配置信息。

    <!-- 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>
    

    查看日志

    • 把 log4j.preperties放到 src下
    • 把 log4j-1.2.16.jar放到 lib下
    结构
    • 输出源

      • console :控制台
      • file :文件
    • 级别

      • error
        只显示error信息
      • warn
        显示warn error信息,比自己严重的信息
      • info
        会显示 info debug trace级别的信息
      • debug
        调试信息,会把上面的都显示
      • trace
        栈信息

    工具类

    • 一个项目只需要创建一个就行了,因为里面有连接池,连接池创建一个就可以了
    • 通过一个工具类来获取,只需要创建一次
    public class HibernateUtil {
        public static final SessionFactory sessionFactory;
        static {
            //1.加载配置文件
            Configuration configure = new Configuration().configure();
            //2.创建sessionFactory   --JDBC 连接池
            sessionFactory = configure.buildSessionFactory();
        }
        public static Session openSession(){
            Session session = sessionFactory.openSession();
            return  session;
        }
        public static Session getCurrentSession(){
            Session session = sessionFactory.getCurrentSession();
            return  session;
        }
    }
    

    三、session

    • 代表的是hibernate与数据库的连接对象
    • 与数据库交互的桥梁,通过它来完成与数据库的增删改查的工作

    session的api

    1. 保存方法

    save(Object obj)

    2. 查询方法

    (1)get(T.class,id)

    • 查询之后,返回的是真实对象本身
    • 没有查询到指定的id,返回的是一个空值

    (2)load(T.class,id)

    • 查询之后返回的是一个代理对象,使用的是第三方的代理机制,javassist.jar
    • 没有查询到结果直接报一个异常
    3. 修改

    void update(Object obj)

    (1)直接创建对象修改(不建议使用)

    • 如果没有指定其它的字段,会把其它的字段设置为null
    Session session = HibernateUtil.openSession();
    // 开启事务
    Transaction transaction = session.beginTransaction();
    // 更新操作
    // 如果没有指定其它的字段,会把其它的字段设置为null
    Customer customer = new Customer();
    customer.setCust_id(1L);
    customer.setCust_name("myxq_update");
    session.update(customer);
    // 提交事务
    transaction.commit();
    // 5.释放资源
    session.close();
    

    (2)查询之后再修改

    • 修改了某一个字段,不会把其它的字段设置为null
    Session session = HibernateUtil.openSession();
    // 开启事务
    Transaction transaction = session.beginTransaction();
    // 更新操作
    // 查询一条记录后更新
    Customer customer = session.get(Customer.class, 1L);
    customer.setCust_name("myxq666");
    session.update(customer);
    // 提交事务
    transaction.commit();
    // 5.释放资源
    session.close();
    
    4. 删除

    void delete(Object obj)

    (1)直接创建对象删除

    • 不支持级联删除
    Session session = HibernateUtil.openSession();
    // 开启事务
    Transaction transaction = session.beginTransaction();
    Customer customer = new Customer();
    customer.setCust_id(1L);
    session.delete(customer);
    // 提交事务
    transaction.commit();
    // 关闭资源
    session.close();
    

    (2)查询之后再删除

    • 支持级联删除
    Session session = HibernateUtil.openSession();
    // 开启事务
    Transaction transaction = session.beginTransaction();
    Customer customer = session.get(Customer.class, 2L);
    session.delete(customer);
    // 提交事务
    transaction.commit();
    // 关闭资源
    session.close();
    
    5. 保存或更新

    void saveOrUpdate(Object obj)

    • 没有设置id,是保存的操作
    Session session = HibernateUtil.openSession();
    Transaction transaction = session.beginTransaction();
    // 如果没有设置id 是保存的操作
    Customer customer = new Customer();
    customer.setCust_name("6668888---");
    customer.setCust_level("3");
    session.saveOrUpdate(customer);
    transaction.commit();
    session.close();
    
    • 设置了id是修改的操作,如果设置的id没有,就会报错
    Session session = HibernateUtil.openSession();
    Transaction transaction = session.beginTransaction();
    // 如果没有设置id 是保存的操作
    Customer customer = new Customer();
    customer.setCust_id(3L);
    customer.setCust_name("6668888---");
    customer.setCust_level("3");
    session.saveOrUpdate(customer);
    transaction.commit();
    session.close();
    
    6. 查询所有

    (1)使用HQL的方式

    • HQL:Hibernate Query Language 面向对象的查询语言
    Session session = HibernateUtil.openSession();
    Transaction transaction = session.beginTransaction();
    // 查询所有 HQL
    Query<Customer> query = session.createQuery("from com.xzh.hibernate.domain.Customer");
    List<Customer> list = query.list();
    for (Customer customer : list) {
    	System.out.println(customer);
    }
    transaction.commit();
    session.close();
    

    (2)支持SQL语句的方式

    • 不建议使用,过时了
    Session session = HibernateUtil.openSession();
    Transaction transaction = session.beginTransaction();
    // 查询 SQL
    NativeQuery sqlQuery = session.createSQLQuery("select * from customer");
    List<Object[]> list = sqlQuery.list();
    for (Object[] objects : list) {
    	System.out.println(Arrays.toString(objects));
    }
    transaction.commit();
    session.close();
    

    四、Transaction 事务

    • 如果配置了C3P0连接池,必须要写上事务的代码,C3P0连接池不会自动帮你提交
    • 没有配置的画,内部的连接池会自动帮你提交
    • Hibernate3当中是不会自动提交的,必须要写,为了兼容以前的版本,还是写上事务
  • 相关阅读:
    Firefox浏览器怎么安装adobe flash player插件
    uploadify在火狐下上传不了的解决方案,java版(Spring+SpringMVC+MyBatis)详细解决方案...
    thinkphp模版调用函数方法
    Thinkphp模板中函数的使用
    60.0.1(64位)windows版 uploadify使用有问题
    一起谈.NET技术,异步调用与多线程的区别 狼人:
    一起谈.NET技术,Silverlight中使用递归构造关系图 狼人:
    一起谈.NET技术,ASP.NET Routing对请求的处理方式 狼人:
    一起谈.NET技术,闲话“多线程” 狼人:
    一起谈.NET技术,利用.NET Framework4.0的源代码调试你的应用程序 狼人:
  • 原文地址:https://www.cnblogs.com/xzh0717/p/10800268.html
Copyright © 2011-2022 走看看