Hibernate_01
Hibernate_01
勤劳的开发者px 发表于2个月前
Hibernate_01
  • 发表于 2个月前
  • 阅读 0
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 学生专属云服务套餐 10元起购>>>   

JavaEE架构介绍

分层

  • 客户端
  • Web层
  • 业务层
  • 持久层

ssh对应的层级

  • hibernate:持久层技术
  • struts2: Web层技术
  • spring: 业务层,跨所有层的整合技术

技术分析图

Hibernate相关概念

介绍

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

Hibernate帮助程序员通过操作对象的方式来操作数据库表记录

ORM的概念

ORM:Object Relational Mapping.
是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。

O: Object对象,面向对象语言领域,Java中的JavaBean

R: 关系数据库领域的Relational(数据库中表的结构)

M: 映射Mapping(XML的配置文件)

优点

  1. Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
  2. Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作
  3. Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系

Hibernate环境搭建步骤

1. 下载Hibernate环境资源

hibernate-orm-5.0.7版本下载

Hibernate ORM官网

2. 导入Hibernate环境必要的jar包

  1. hibernate的必须jar
  2. 数据库驱动的jar

3. 创建数据库表结构

drop database hibernate_01;
create database hibernate_01;
use hibernate_01;
CREATE TABLE `hibernate_1`.`t_user`(
	`u_id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	`u_name` VARCHAR(32) NOT NULL ,
	`u_age` INT(16)
);	

4. 编写数据bean

public class User {
	private Integer u_id;
	private String u_name;
	private int u_age;
}

注意:
需要给数据bean中对应表中主键的属性设置为对象类型,且必须实现序列化接口。
需要提供getter和setter方法。

5. 配置映射文件

映射文件的作用就是将数据bean和表结构建立关系

<?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="org.itheima.hibernate.domain.User" table="t_user">
		<id name="u_id" column="u_id">
		</id>
		<property name="u_name" column="u_name" />
		<property name="u_age" column="u_age" />
	</class>
</hibernate-mapping>
  1. 命名规范问题:hibernate命名以类名.hbm.xml方式命名。
  2. 新建位置规范:通常和java类放到同一个包中。
  3. dtd头的导入: org.hibernate 的包中有对应的dtd头。
  4. 在配置关系过程中,几乎所有的name属性指向的都是Java类,column和table指向数据库表。

6. 配置核心启动文件

<?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.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 配置驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 数据库连接地址 -->
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate_setup</property>
		<!-- 数据库帐号 -->
		<property name="hibernate.connection.username">root</property>
		<!-- 数据库密码 -->
		<property name="hibernate.connection.password">123456</property>
		<!-- 映射关系文件配置 -->
		<mapping resource="org/itheima/hibernate/domain/User.hbm.xml" />
	</session-factory>
</hibernate-configuration>
  1. 命名规范要求:以hibernate.cfg.xml方式命名
  2. 新建位置规范:放到src目录中,也就是classpath路径(类根路径)
  3. dtd头的导入: org.hibernate 的包中有对应的dtd头。

7. 编写程序访问数据库

// 新建一个Hibernate的配置对象,其实就是去模拟hibernate.cfg.xml
Configuration configuration = new Configuration();
// 加载解析hibernate.cfg.xml
configuration.configure();
// 创建一个Sessionfactory
SessionFactory factory = configuration.buildSessionFactory();
// 通过工厂创建一个和数据库连接的会话
Session session = factory.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
User user = new User();
user.setU_name("张三疯");
user.setU_age(11);
//不需要再通过sql去保存用户,直接用对象保存用户
session.save(user);
transaction.commit();	
//释放资源
session.close();

Hibernate工具

下载JBoos Tools

hibernate tools官网

eclipse 插件下载对照地址

下载对应版本JBoss Tools

eclipse安装插件

  1. Help–>Install New Software–>add
  2. 在打开的对话框中Location后点击Archive,选择下载的JBoss Tools的压缩包
  3. 在对话框中只勾选Hibernate Tools
  4. 下一步直到完成重启

工具开发提供的便利

  1. 自动生成核心启动文件
  2. 自动生成映射关系

Hibernate映射配置

class标签

  1. 用来描述Java类和数据库表的对应关系
  2. name属性:Java类的类名
  3. table属性:数据库表的表名

id标签

  • 用来描述java类中属性和数据库表的主键的关系
  • name属性:java类中属性名称
  • type属性:描述java类中属性的类型,hibernate会根据此类型生成对应数据库列的数据库类型
  • column属性或标签:数据库表中的主键的列名
  • generator标签:描述主键的生成策略

properties标签

  • 用来描述java类中其他属性和数据库表的其他列的关系
  • name属性:java类中属性名称
  • type属性:描述java类中属性的类型,hibernate会根据此类型生成对应数据库列的数据库类型
  • column属性或标签:数据库表中的主键的列名

Hibernate核心启动配置

整个核心配置在hibernate.properties中可以找到

必须配置

通过property标签进行配置: 方言,驱动,地址,帐号,密码

映射配置

通过mapper标签进行配置

选配

通过property标签进行配置

  • 日志显示:hibernate.show_sql
  • 日志格式化:hibernate.format_sql
  • 数据库DDL的自动生成:hibernate.hbm2ddl.auto
  • create-drop:几乎不用。先删除,再创建,再删除。
  • create:测试用例中用。先删除,再创建。
  • update:开发中用。没有就创建,有就不创建。对新增的列进行维护。
  • validate:开发稳定后用。校验表结构。

补充

  • DDL: Data Definition Language。数据库声明语言。
    使用了CREATE,ALTER,DROP,TRUNCATE,COMMENT,RENAME关键字。
  • DML:Data Manipulation Language。数据库操作语言。
    使用了SELECT,INSERT,DELETE,UPDATE关键字。
  • DCL: Data Control Language。数据库权限控制语言。
    使用了GRANT,REVOKE关键字。
  • TCL:Transaction Control Language。事务控制语言。
    使用了SAVEPOINT,ROLLBACK,COMMIT关键字。

日志集成

日志介绍

  • JCL:规范。Java common logger。
  • SLF4J:规范。Simple Logger fade for Java。
  • log4j:实现。

规范的出现是因为在一个程序中多个框架用到了不同的日志系统,日志杂乱。规范提供统一解决方案。

规范和实现的整合,需要中间整合桥梁。

Log4j与slf4j集成步骤

  1. 导入jar
    • slf4j-api-x.x.x.jar : 规范接口jar
    • slf4j-log4j12-x.x.x.jar : log4j与Slf4j整合的jar
    • log4j-x.x.x.jar : log4j实现日志规范的jar
  2. 在src目录下编写log4j.properties配置文件
    ##设置日志记录到控制台的方式
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.err
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    ##设置日志记录到文件的方式
    log4j.appender.file=org.apache.log4j.FileAppender
    log4j.appender.file.File=c\:mylog.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    ##日志输出的级别,以及配置记录方案
    log4j.rootLogger=info, stdout, file	

    3.代码中调用Log4j

    • 初始化(引入的包为slf4j的,使用规范接口编程)
      Logger logger = LoggerFactory.getLogger(Clazz);
      
    • 调用
      logger.trace();
      logger.debug();
      logger.info();
      logger.warn();
      logger.error();

       

日志级别

  • trance
  • debug
  • info
  • warn
  • error
  • fatal

Log4j日志配置规则介绍

  • 日志记录器:rootLogger
  • 日志输出源:appender
  • 日志布局器:layout

Hibernate核心类

Hibernate运行流程介绍

Configuration类

Configuration configuration = new Configuration();
configuration.configure();
  • 用于配置并且启动Hibernate框架。
  • Hibernate框架通过该对象来获得对象-关系映射文件中的元数据,以及动态配置Hibernate的属性。
  • 可以创建SessionFactory对象。

Configuration配置

  • 加载配置文件的种类,Hibernate支持xml和properties类型的配置文件,在开发中基本都使用XML配置文件的方式。

    如果采用的是properties的配置文件,那么需要通过

    Configuration configuration = new Configuration(); 
    configuration.addResource("com/itheima/domain/XX.hbm.xml")

    手动进行加载,比较麻烦,不推荐使用

SessionFactory

由Configuration通过加载配置文件创建该对象

  • 工厂类,用于创建生成Session对象
  • SessionFactory对象中保存了当前的数据库配置信息和所有映射关系
  • SessionFactory对象中保存了预定义的SQL语句。

预定义可以提示代码效率,同时准备会耗时,也会占用内存

  • 数据库方言常用sql
  • 常见的SQL语句是增删改查(通过主键来查询)
  • SessionFactory负责维护Hibernate的二级缓存。
  • 一个SessionFactory实例对应一个数据库,应用从该对象中获得Session实例。
  • SessionFactory是线程安全的,意味着它的一个实例可以被应用的多个线程共享。
  • SessionFactory是重量级的,意味着不能随意创建或销毁它的实例。如果只访问一个数据库,只需要创建一个SessionFactory实例,且在应用初始化的时候完成。
  • SessionFactory需要一个较大的缓存,用来存放预定义的SQL语句及实体的映射信息。另外可以配置一个缓存插件,这个插件被称之为Hibernate的二级缓存,被多线程所共享.

Transcation

负责事务管理

  • 常用API

    • commit():提交事务
    • rollback():回滚事务
  • 特点

    • Hibernate框架默认情况下事务不自动提交.需要手动提交事务
    • 如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务
    • 每段事务操作都是隐含着异常的,需要手动添加try catch

Session

  • 特点

    • Session是在Hibernate中使用最频繁的接口。也被称之为持久化管理器。它提供了和持久化有关的操作,比如添加、修改、删除、加载和查询实体对象
    • Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心
    • Session是线程不安全的
    • 所有持久化对象必须在 session 的管理下才可以进行持久化操作
    • Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久化操作的数据都缓存在 session 对象处
    • 持久化类与 Session 关联起来后就具有了持久化的能力
  • 常用的方法

    • save(obj): 保存数据
    • delete(obj): 删除数据
    • get(Class,id): 通过主键查询该条记录
    • update(obj): 修改数据
    • saveOrUpdate(obj): 保存或者修改
    • createQuery(String hql): 查询所有的数据

C3P0连接池集成

  1. 导入Jar包
  2. 配置hibernate启动配置文件
     <!-- C3P0的供应商 -->
     <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
     <!-- 最小连接 -->
     <property name="hibernate.c3p0.min_size">5</property>
     <!-- 最大连接数 -->
     <property name="hibernate.c3p0.max_size">20</property>
     <!-- 连接超时时长 -->
     <property name="hibernate.c3p0.timeout">120</property>
     <!-- 每120秒检查空闲连接 -->
     <property name="hibernate.c3p0.idle_test_period">120</property>
     <!-- 最大statments数量 -->
     <property name="hibernate.c3p0.max_statements">120</property>	
     <!-- 连接用完后,每次增加的连接数 -->
     <property name="hibernate.c3p0.acquire_increment">2</property>	
     <!-- 每次都验证连接是否可用 -->
     <property name="hibernate.c3p0.validate">false</property>	 
共有 人打赏支持
粉丝 0
博文 46
码字总数 90838
评论 (0)
×
勤劳的开发者px
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: