分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

Hibernate入门

发布时间:2023-09-06 01:38责任编辑:傅花花关键词: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.Final\lib\required 下所有:

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/itheima/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.configuration(); 8 ????????//3、获得SessionFactory工厂 9 ????????SessionFactory sessionFactory = configuration.buildSessionFactory(); 10 ????????//4、从SessionFactory中打开session11 ????????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.configuration();

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中打开session20 ????????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}

Hibernate入门

原文地址:https://www.cnblogs.com/gdwkong/p/8321310.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved