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. adb命令获取app布局文件xml

    adb shell /system/bin/uiautomator dump --compressed /data/local/tmp/uidump.xml adb pull /data/local/ ...

  2. 如何在SAP Cloud Platform ABAP编程环境里创建一个employee

    用ABAP Development Tool登录SAP Cloud Platform ABAP编程环境后,对ABAP项目点击右键,选择属性,从而找到该环境的web访问的url: https://325 ...

  3. 微信公众号&小程序 -- 获取并解密用户数据(获取openId、unionId)

    本文转自https://my.oschina.net/u/3235888/blog/832895 前言 微信小程序API文档:https://mp.weixin.qq.com/debug/wxadoc ...

  4. linu学习记录--初学linux中的几个基本命令以及比较关键的man指令

    import chardet chardet.detect() #传入参数可以输出查看参数的对应编码 首先是用decode将对象编码转换成unicode,然后用encode将对象编码转换成输出所需,u ...

  5. UIP和lwip的区别 转载

    uIP是专门为8位和16位控制器设计的一个非常小的TCP/IP栈.完全用C编写,因此可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行.uIP中还包括一个HT ...

  6. sudo权限

    sudo授权 给普通用户赋予部分管理员权限 /sbin/ 在此目录下的命令只有超级用户可以执行 /usr/sbin/ root身份 visudo 赋予普通用户权限命令,命令执行后和vi一样使用 用户名 ...

  7. altium designer的pcb板如何移动到原点?

    可以把所有的都选中,然后将光标移到起点处,将所有的移到原点的地方,但这种做法很多时候都不好:比较好的办法就是将原点设置到起点上来. 具体做法是:edit--origin --set. 这时光标成了十字 ...

  8. HTML&CSS基础-样式的继承

    HTML&CSS基础-样式的继承 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html> & ...

  9. 智能驾驶数据后处理分析利器—INTEWORK-VDA

            随着智能驾驶技术在新车上逐步普及,车辆研发阶段需要做大量的实车测试工作,当前的测试方式主要是路采实车数据后,按标准和法规进行测试场景提取和测试数据分析.调查显示绝大部分智能驾驶研发厂商 ...

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

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