Hibernate框架概述

什么是框架

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

hibernate简介(JavaEE技术三层架构所用到的技术)

hibernate是什么框架

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

ORM

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

hibernate好处

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

Hibernate基本使用

下载框架

http://hibernate.org/orm/

https://sourceforge.net/projects/hibernate/files/hibernate-orm/

Hibernate目录

documentation
Hibernate开发的文档
lib
Hibernate开发的文档
required
Hibernate开发的必须的依赖包
optional
Hibernate开发的可选的jar包
project
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类

package ***.***.****;

import lombok.Getter;
import lombok.Setter;
import java.util.HashSet;
import java.util.Set; @Getter@Setter
public class Customer {
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile; @Override
public String toString() {
return "Customer{" +
"cust_id=" + cust_id +
", cust_name='" + cust_name + '\'' +
", cust_source='" + cust_source + '\'' +
", cust_industry='" + cust_industry + '\'' +
", cust_level='" + cust_level + '\'' +
", cust_phone='" + cust_phone + '\'' +
", cust_mobile='" + cust_mobile + '\'' +
'}';
}
}

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

通常叫hibernate.cfg.xml
创建完毕后, 也有一个约束要引入
在org.hibernate包当中可以找到对应的dtd configuration.dtd
属性名记不住
在目录提供的project当中有一个etc
在etc当中 有一个hibernate.properties的文件打开
打开后,会看到连接各种数据库时需要的属性参数
需要配置方言
不同的数据库,使用的语言不一样
在hibernate当中,sql语句会自动帮你生成
设置方言,就是设置自动生成的语言是哪个数据库当中的sql
配置核心配置文件要加载哪一个映射
映射的路径就是上面创建的跟表相对应的配置文件
把全路径的点,要换成斜杠

6.hibernate.cfg.xml 配置演示

<?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.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- 配置Hibernate的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</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="customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>

7.customer.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>
<class name="com.myxq.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"/> <!--一对多-->
<set name="linkmens" cascade="save-update,delete" inverse="true"><!--set属性名称-->
<key column="link_cust_id"></key><!--外键-->
<one-to-many class="com.myxq.domain.Linkman"></one-to-many>
</set> </class>
</hibernate-mapping>

8.创建 Test 类执行

@Test
public void test()
{
// 1.加载Hibernate的核心配置文件
Configuration configuration = new Configuration().configure();
// 2.创建一个SessionFactory对象:类似于JDBC中连接池
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.通过SessionFactory获取到Session对象:类似于JDBC中Connection
Session session = sessionFactory.openSession();
// 5.编写代码
Customer customer = new Customer();
customer.setCust_name("Myxq2");
customer.setCust_level("12");
session.save(customer);
// 6.资源释放
session.close();
sessionFactory.close();
}

常见配置

xxx.hbm.xml映射配置

class标签
作用
建立类与表的映射关系
属性
name
类的全路径
table
表名
类名与表名一致,table可以省略
如果没有该表,或自动创建一个表
catalog
数据库名,可以不写
ID标签
作用
建立类中的属性与表中主键的对应关系
属性
name
column
length
type
property标签
作用
用于建立类中普通属性与表的对应关系
属性
name
类中的属性名
column
表中的字段名
如果字段名与类中的属性名一致,column是可以省略
length
字段的长度
默认数据库当中已经有长度了
hibernate是可以根据映射自动建表
建表是没有设定长度,就使用默认的长度
type
类型
可以不用写,会自动帮你装换
not-null
不允许为空
unique
唯一的

hibernate.cfg.xml核心配置

必须配置
连接数据库的基本的property参数
驱动类
url路径
用户名
密码
方言
可选配置
显示SQL
hibernate.show_sql
格式化SQL
hibernate.format_sql
自动建表
hibernate.hbm2ddl.auto
属性
none
不使用hibernate的自动建表
create
无论数据库中是否已经有表,都执行删除原有表,重新创建表的操作
create-drop
如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表。
最后数据库中一个表没有,为了做测试用
把sessionFactory也close掉时才有效果
update
如果数据库中有表,使用原有表,如果没有表,创建新表
更新表结构,如果column没有时会创建新的一列
validate
校验映射和表结构是否一致,不一致就会报错
如果没有表,不会创建表。只会使用数据库中原有的表
引入映射文件
<mapping resource="映射文件全路径"/>

​ 提示

  • dtd必须得要联网
  • 如果没有联网,就没有提示
  • 添加外部DTD

核心API

Configuration

Hibernate的配置对象
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。
在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。
虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
通过这个对象去加载它里面的配置
把里面的数据内容或得到,才能进行后面的工作
作用
1.加载核心配置文件
核心配置文件是属性文件
直接configuration cfg = new configuration()
名称为:hibernate.properties
核心配置文件是一个xml
名称为:hibernate.cfg.xml
1.configuration cfg = new configuration();
2.cfg.config()
2.加载映射文件
属性文件是没有办法加载映射
可以通过config加载映射文件
configuration.addResource("映射文件的全路径");

SessionFactory

sessionFactory简介

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

hibernate.cfg.xml 添加,配置连接池

  • 了解即可,以后会使用spring进行整合
  • C3P0

​ 引入C3P0的jar包

​ 添加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下

结构

​ 输出源

  • console控制台
  • file文件

​ 级别

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

工具类

  • 一个项目只需要创建一个就行了,因为里面有连接池,连接池创建一个就可以了
  • 通过一个工具类来获取,只需要创建一次

session

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

session的api

保存

​ save(Object obj)

查询

get(T.class,id)

​ 1.查询之后,返回的是真实对象本身

​ 2.没有查询到指定的id,返回的是一个空值

load(T.class,id)

​ 1.查询之后返回的是一个代理对象,使用的是第三方的代理机制,javassist.jar

​ 2.没有查询到结果直接报一个异常

修改

void update(Object obj)

​ 直接创建对象修改

  • 如果没有指定其它的字段,会把其它的字段设置为null
  • 不建议使用

​ 查询之后再修改

  • 修改了某一个字段,不会把其它的字段设置为null

删除

void delete(Object obj)

​ 直接创建对象删除(不支持级联删除)

​ 查询之后再删除(支持级联删除)

保存或更新

void saveOrUpdate(Object obj)

​ 没有设置id,是保存的操作

​ 设置了id是修改的操作,如果设置的id没有,就会报错

查询所有

使用HQL的方式

​ HQL:Hibernate Query Language 面向对象的查询语言

​ Query query = session.createQuery("from Customer");

​ List list = query.list()

支持SQL语句的方式

​ SQLQuery query = session.createSQLQuery("sql语句");

​ List<Object[]> query.list();

三大框架 之 Hibernate框架概述(概述、配置、核心API)的更多相关文章

  1. 整合Spring框架和Hibernate框架

    -------------------siwuxie095                                 整合 Spring 框架和 Hibernate 框架         1.导 ...

  2. Spring_day04--Spring框架整合hibernate框架

    Spring框架整合hibernate框架 1 把hibernate核心配置文件中配置数据库信息,把数据库信息在spring进行配置 2 把hibernate里面的sessionFactory创建交给 ...

  3. Spring 框架整合Struts2 框架和 Hibernate 框架

    1. Spring 框架整合 Struts2 框架 // [第一种整合方式(不推荐)](http://www.cnblogs.com/linkworld/p/7718274.html) // 从 Se ...

  4. ECLIPSE/JAVAWEB (二)三大框架之Hibernate框架 持续更新中...

    (一)发展历史 在Struts框架中使用jdbc连接来读写数据库,我们最常见的就是打开数据库连接.使用复杂的sql语句进行读写.关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常繁琐的过程. ...

  5. Java框架:spring框架整合hibernate框架的xml配置(使用注解的方式)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. JAVA框架之Hibernate框架的学习步骤

    首先介绍一下Java三大框架的关系 以CRM项目即客户关系管理项目示例 hibernate框架的学习路线: 1.学习框架入门,自己搭建框架,完成增删改查的操作 2.学习一级缓存,事物管理和基本查询 3 ...

  7. Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

    https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...

  8. APP自动化框架LazyAndroid使用手册(3)--核心API介绍

    作者:黄书力 概述 在前一篇博文中,简要介绍了一款安卓UI自动化测试框架LazyAndroid (http://blog.csdn.net/kaka1121/article/details/53204 ...

  9. spring框架整合hibernate框架简单操作数据库

    1.配置文件: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http:/ ...

随机推荐

  1. 谈一谈做iOS播放器库开发所涉及的知识点

    在自己研究生毕业的时候,想着能找上一份做视频编解码的工作,可惜没有如愿,最后到了一家iOS游戏渠道公司去做游戏支付业务的SDK开发,我的iOS正式开发生涯就这么开始了. 在那家iOS游戏渠道没做上一年 ...

  2. NSLog的各种打印格式符和打印CGRect相关结构体

    1.打印CG开头的数据类型,如CGRect,CGSize等方法 1.1 打印CGRect : NSLog(@"%@", NSStringFromCGRect(someCGRect) ...

  3. nginx mirror/post_action+gor实现https流量复制

    关于gor: 参考: https://www.cnblogs.com/jinjiangongzuoshi/p/11773070.html https://github.com/buger/gorepl ...

  4. MYSQL5.7.24编译安装

    1.解压源代码包 #tar zxvf mysql-boost-8.0.17.tar.gz 2.安装依赖包 #yum -y install gcc gcc-c++ ncurses ncurses-dev ...

  5. WinServer-开关机日志

    开关机日志正常1074, 6006, 13, 12, 6005,41,60081074 记录某用户在某计划下重启6006 日志服务关闭13 OS关闭时间按12 OS启动时间6005 日志服务开启 异常 ...

  6. PLC编程的基础知识的总结

    1.Programmable Logic Controller   PLC 代替计算机实现复杂的逻辑控制系统  ,可编程控制器是一种数字运算操作电子系统,转门在工业控制系统中使用而设计的,采用一种可以 ...

  7. Kubernetes-Istio之Gateway和VirtualService

    1: 确定入口IP和端口 执行以下命令以确定Kubernetes集群是否在支持外部负载均衡器的环境中运行: kubectl get svc istio-ingressgateway -n istio- ...

  8. 如何使用Arduino和SIM900A GPRS / GSM模块将数据发送到Web服务器

    今天我们在这里介绍一个非常有趣的项目,我们将使用Arduino开发板和GPRS将数据发送到SparkFun服务器.这是一个基于IoT的项目,我们将使用GSM模块SIM900A将一些数据发送到互联网上的 ...

  9. markdown里面编辑代码

    转:http://c.biancheng.net/view/6623.html ------------------------------------------------------------ ...

  10. SQL中 count(*)和count(1)的对比,区别

    执行效果: 1.  count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和coun ...