文档章节

Hibernate_01

勤劳的开发者px
 勤劳的开发者px
发布于 2017/09/04 16:26
字数 2785
阅读 0
收藏 0
点赞 0
评论 0

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>	 

© 著作权归作者所有

共有 人打赏支持
勤劳的开发者px
粉丝 3
博文 54
码字总数 108225
作品 0
荆州
程序员
关于hibernate配置的一个问题

在web项目中,使用hibernate时,使用java测试方法来测试hibernate部分,发现没有问题,能正常使用; 但是整个项目部署后,发现配置的hibernate竟然用不了,tomcat启动没有问题,但是后面访问...

pan_1308
2014/04/16
89
3
我在遍历map集合的时候,hibernate出错了,怎么搞

[WARN] 2014-08-12 10:01:16,671 org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: null [ERROR] 2014-08-12 10:01:16,671 org.hibernate.util.JDBCExceptionReporter -......

Baclk5
2014/08/12
138
2
用hibernate进行查询,刷新5,到6次action后,页面就卡死了,神马原因?是因为每次都openSession的原因么?还是因为。。。??没关闭session?我用session.getTransaction().commit();提交事务

用hibernate进行查询,刷新5,到6次action后,不停的执行了5到6次查询页面就卡死了,页面就卡死了,神马原因?是因为每次都openSession的原因么?还是因为。。。??没关闭session?我用sessi...

巴顿
2013/01/01
2.9K
1
备忘:hibernate, logback, slf4j实际应用一例

用hibernate写一些简单的数据库的Java应用。主要是温习一下。之前弄过的一些都忘了。发现还是得记下来,不然很快就忘。 1. Eclipse版本,用Juno, J2EE版本。最好下载zip版本的,直接解压就运...

mikelij
2014/06/23
0
0
Hibernate 学习资料汇总

1.Hibernate系列——总结篇(http://blog.csdn.net/jiuqiyuliang/article/details/41318751) 2.Hibernate框架简述(http://www.cnblogs.com/eflylab/archive/2007/01/09/615338.html) 3.Hiber......

IT追寻者
2016/08/06
20
0
[DEBUG] “java.sql.SQLException: Value '0000-00-...

使用hibernate开发程序的时候,有的时间字段没有必要填写,但是,以后hibernate查询的时候会报出 “java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timest...

jiyayun
2012/10/25
0
0
Connection is read-only. get*配置只读,却导致错误

01:46:07,053 DEBUG org.hibernate.SQL:111 - select team0.id as id101, team0.dateCreated as dateCrea2101, team0.deleted as deleted101, team0.version as version101, team0.areaid as......

筱龙缘
2013/03/26
816
0
springmvc+jquery

@RequestMapping("/getAllUser") public ModelAndView getAllUser(){ List list = service.getAllUser(); System.out.println(list.size()); return new ModelAndView("list","list",list); ......

大头圆又圆
2013/11/04
613
3
hibernate4.3。5版本使用c3p0数据源出错

org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider] at org.hibernate.service.internal.A......

梦幻女侠
2014/07/26
1K
1
Hibernate中的抓取策略

抓取策略是指我们需要在关联对象间进行导航的时候,Hibernate如何获取关联对象的策略。 select抓取策略:当我们查询某个对象时,hibernate会另外发出一条select语句查询与之关联的实体或者集...

叶欢欢
2016/11/12
4
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
5
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
1
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
165
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部