首页 > 其他分享 >重拾Hibernate框架——入门

重拾Hibernate框架——入门

时间:2022-11-28 20:31:24浏览次数:38  
标签:hibernate 入门 配置文件 Session SessionFactory 实体类 Hibernate 重拾


目录

  • ​​目录​​
  • ​Hibernate入门​
  • ​第一个Hibernate程序​
  • ​​实现数据库操作​​
  • ​Hibernate配置文件详解​
  • ​​Hibernate映射配置文件​​
  • ​​Hibernate核心配置文件​​
  • ​Hibernate的核心API​
  • ​​Configuration​​
  • ​​SessionFactory重点​​
  • ​​Session重点​​
  • ​​Transaction​​


Hibernate入门

第一个Hibernate程序

第一步 搭建Hibernate环境
(1)创建一个Java(或Java Web)工程项目;
(2)导入Hibernate的jar包;
注:除此之外,在使用Hibernate的时候,有日志信息的输出,而Hibernate本身没有包含日志输出的jar包,需要我们额外导入其他日志相关的jar(log4j、slf4j-api、slf4j-log4j12);同时还需要mysql驱动的jar包。(这里图省事还木有导入日志相关的包)

重拾Hibernate框架——入门_配置文件

第二步 创建实体类
注:使用Hibernate的时候,不需要我们自己手动创建表,Hibernate会帮把表创建出来。
如:User.java

package com.wm103.entity;

public class User {
/*Hibernate要求实体类有一个属性是唯一的。*/
private int uid;
private String username;
private String password;
private String address;

public int getUid() {
return uid;
}

public void setUid(int uid) {
this.uid = uid;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}
}

第三步 配置实体类合数据库表一一对应的关系(映射关系)
使用配置文件实现映射关系
(1)创建​​​xml​​​格式的配置文件
- 映射配置文件名称和位置没有固定要求;
- 建议在实体类所在包内创建,名称为:实体类名称.hbm.xml
(2)在配置文件中引入xml约束
- 在Hibernate中引入的约束是dtd约束(约束有dtd和schema格式)

<?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 表示该xml的根标签。
(3)配置映射关系
如: User.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>

<!--
1. 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库中对应表的名称
-->
<class name="com.wm103.entity.User" table="t_user">
<!--
2. 配置实体类id和表id对应
Hibernate要求实体类有一个属性唯一值;
Hibernate要求表有字段作为唯一值。
-->
<!--
id标签
name属性:实体类中作为唯一标识的属性的名称
column属性:生成的表字段名称
-->
<id name="uid" column="uid">
<!--
设置数据库表中ID的增长策略
native:生成表的id是主键自动增长的。
-->
<generator class="native"/>
</id>
<!--
3. 配置实体类中的其他属性与表字段对应
property标签
name属性:实体类属性名称
column属性:生成表字段名称
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>

第四步 创建Hibernate的核心配置文件
(1)在src目录下创建Hibernate核心配置文件 hibernate.cfg.xml
  核心配置文件的格式为xml,且文件名称和位置是固定的。
- 位置:必须在src目录下面
- 名称:必须为hibernate.cfg.xml
(2)为配置文件引入dtd文件

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

  其中 hibernate-configuration 表示该xml的根标签。
注:Hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载,需要在核心配置文件中进行设置。
(3)配置hibernate.cfg.xml中的信息

  • 配置数据库信息
<!-- **配置数据库信息(必须)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&characterEncoding=UTF-8</property>
  • 配置hibernate信息
<!-- **配置hibernate信息(可选)** -->
<!--
配置数据库方言,如:
在MySQL中实现分页功能,需要使用到关键字limit,该关键字只能在MySQL中使用;
在Oracle数据库中则使用rownum实现分页功能。
以下配置是让Hibernate框架识别不同数据库各自特有的语句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 输出底层SQL语句 -->
<property name="format_sql">true</property><!-- 格式化底层SQL语句 -->
<!--
Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
update:如果已存在表,则更新表,如果没有,则进行创建。
-->
<property name="hbm2ddl.auto">update</property>
  • 把映射文件放到核心配置文件中
<!-- **把映射文件放到核心配置文件中(必须)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>

如: hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- **配置数据库信息(必须)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&characterEncoding=UTF-8</property>

<!-- **配置hibernate信息(可选)** -->
<!--
配置数据库方言,如:
在MySQL中实现分页功能,需要使用到关键字limit,该关键字只能在MySQL中使用;
在Oracle数据库中则使用rownum实现分页功能。
以下配置是让Hibernate框架识别不同数据库各自特有的语句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 输出底层SQL语句 -->
<property name="format_sql">true</property><!-- 格式化底层SQL语句 -->
<!--
Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
update:如果已存在表,则更新表,如果没有,则进行创建。
-->
<property name="hbm2ddl.auto">update</property>

<!-- **把映射文件放到核心配置文件中(必须)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

实现数据库操作

第一步 加载Hibernate核心配置文件

第二步 创建SessionFactory对象

第三步 使用SessionFactory对象创建session对象

第四步 开启事务

第五步 编写具体逻辑CRUD操作

第六步 提交事务

第七步 关闭资源

如: HibernateDemo.java

package com.wm103.hibernatetest;

import com.wm103.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

/**
* Created by DreamBoy on 2017/5/19.
*/
public class HibernateDemo {

@Test
public void testAdd() {
// **第一步** 加载Hibernate核心配置文件
// 自动到src下面寻找hibernate.cfg.xml配置进行加载,封装成对象
Configuration cfg = new Configuration();
cfg.configure();

// **第二步** 创建SessionFactory对象
// 读取hibernate核心配置文件内容,创建sessionFactory
// 在这个过程中,会根据配置好的映射关系,在对应的数据库中将表创建出来
SessionFactory sessionFactory = cfg.buildSessionFactory();

// **第三步** 使用SessionFactory对象创建session对象
// 类似JDBC中的Connection对象
Session session = sessionFactory.openSession();

// **第四步** 开启事务
Transaction tx = session.beginTransaction();

// **第五步** 编写具体逻辑CRUD操作
User user = new User();
user.setUsername("梦小白");
user.setPassword("123");
user.setAddress("China");
session.save(user);

// **第六步** 提交事务
tx.commit();

// **第七步** 关闭资源
session.close();
sessionFactory.close();
}
}

Hibernate配置文件详解

Hibernate映射配置文件

  1. 映射匹配文件的名称和位置没有固定的要求,但是一般将该配置文件放置同需要映射的实体类相同的包下;
  2. 映射配置文件中标签的name属性,属性值与实体类相关,其中:
    (1)class标签的name属性值为实体类的全路径;
    (2)id标签和property标签的name属性值为实体类某个属性的名称。
  3. id标签和property标签,column属性可以省略,不设置,这个时候,column属性的默认值与name属性值相同
  4. property标签还有另外一个属性type属性,设置生成表字段的类型。不设置该属性时,Hibernate会根据实体类属性的类型自动确定表字段的类型。

Hibernate核心配置文件

核心配置文件名称和位置是固定的,名称为hibernate.cfg.xml,位置在src目录下。
配置内容以及要求如下:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- **配置数据库信息(必须)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&characterEncoding=UTF-8</property>

<!-- **配置hibernate信息(可选)** -->
<!--
配置数据库方言,如:
在MySQL中实现分页功能,需要使用到关键字limit,该关键字只能在MySQL中使用;
在Oracle数据库中则使用rownum实现分页功能。
以下配置是让Hibernate框架识别不同数据库各自特有的语句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 输出底层SQL语句 -->
<property name="format_sql">true</property><!-- 格式化底层SQL语句 -->
<!--
Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
update:
-->
<property name="hbm2ddl.auto">create</property>

<!-- **把映射文件放到核心配置文件中(必须)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Hibernate的核心API

Configuration

// **第一步** 加载Hibernate核心配置文件
// 自动到src下面寻找hibernate.cfg.xml配置进行加载,封装成对象
Configuration cfg = new Configuration();
cfg.configure();

SessionFactory(重点)

  SessionFactory是一个线程安全的Session工厂类,能为不同的线程生成不同的Session。SessionFactory维护着Session相关的资源,包括数据库连接池等、缓存数据等。
1. 通过使用configuration对象来创建SessionFactory对象,在创建过程中,如果核心配置文件配置了自动创建表的功能,如:

<!--
Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
update:
-->
<property name="hbm2ddl.auto">create</property>

,则Hibernate会根据核心配置文件中的数据库和映射文件的配置,根据映射关系,在数据库中创建对应的表。
2. 创建sessionFactory对象过程中,非常耗资源(因为Hibernate需要检查实体类与数据库中表的映射情况,甚至需要创建或更新表)。因此**在Hibernate操作中,建议一个项目一般只创建一个sessionFactory对象。
实现方式如下:
静态代码快在类加载时执行,且执行一次。

package com.wm103.utils;

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

/**
* Created by DreamBoy on 2017/5/19.
*/
public class HibernateUtil {
// 单态模式的SessionFactory
private static final SessionFactory sessionFactory;

static {
Configuration cfg = new Configuration();
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}

使用:

SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

Session(重点)

  1. 这里的session对象类似于JDBC中的Connection对象;
  2. 调用session对象中的不同方法可以实现CRUD操作:
    (1)添加:save方法;
    (2)修改:update方法;
    (3)删除:delete方法;
    (4)查询:根据id查询的get方法;
  3. session对象
      Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。
      Session代表用户的一次操作。Session的生命周期很短,在操作开始时通过SessionFactory.openSession()生成,在操作结束时通过执行​​​session.close()​​​关闭。Session维护着Session相关的资源,包括Transaction、当前数据库连接等。
      Session是线程不安全的,多个并发线程同时操作一个Session实例时,就可能导致Session数据存取的混乱(方法内部定义和使用Session时,不会出现线程问题)。因此设计软件架构时,应避免多个线程共享一个Session实例。同时它也是轻量级的,实例的创建和销毁不需要消耗太多的资源。它还有一个缓存,即Hibernate的一级缓存,这个缓存主要用于存放当前工作单元加载的对象。

Transaction

  1. 开启事务
Transaction tx = session.beginTransaction();
  1. 事务的提交和回滚
tx.commit();

tx.rollback();
  1. 事务的特性
  • 原子性
  • 一致性
  • 隔离性
  • 持久性


标签:hibernate,入门,配置文件,Session,SessionFactory,实体类,Hibernate,重拾
From: https://blog.51cto.com/u_15894233/5893664

相关文章