Hibernate 基本使用
Hibernate框架概述
一、什么是框架
- 软件的一个半成品,已经帮你完成了部分功能。
- 把一些不确定的东西,按照框架要求,达到相应的功能
Hibernate是JavaEE技术三层架构所用到的技术
二、hibernate简介
1. hibernate是什么框架
- Hibernate是一个开放源代码的对象关系映射框架
- 它对JDBC进行了非常轻量级的对象封装
- 它将POJO与数据库表建立映射关系,是一个全自动的orm框架
- hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
- Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用
- 持久层的ORM框架
2. ORM
- Object Relational Mapping(对象关系映射)。
- 指的是将一个Java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以操作数据库中的表。
3. hibernate好处
- 对JDBC访问数据库的代码进行了轻量级封装,简化了数据访问层繁琐重复性的代码,减少了内存消耗,加快了运行效率
- 是一个基本JDBC的主流持久化框架,很大程度上简化了DAO层的编码工作
- 性能非常好, 映射灵活性比较好,支持多关系数据库,一对一,一对多,多对多的各种复杂关系
- 可扩展性强,源代码及API开放,当本身功能不够用时,可以自行编码进行扩展
Hibernate基本使用
一、下载框架
二、Hibernate目录
1. documentation
- Hibernate开发的文档
2. lib
- Hibernate开发的文档
- required:Hibernate开发的必须的依赖包
- optional:Hibernate开发的可选的jar包
3. project
- Hibernate提供的参考项目
三、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类
可以用lombok插件自动生成set和get方法。
5.创建Hibernate的核心配置文件
- 通常都叫hibernate.cfg.xml
- 创建完毕后, 也有一个约束要引入
- 在org.hibernate包当中可以找到对应的dtd configuration.dtd
- 属性名记不住
- 在目录提供的project当中有一个etc
- 在etc当中 有一个hibernate.properties的文件打开
- 打开后,会看到连接各种数据库时需要的属性参数
- 需要配置方言
- 不同的数据库,使用的语言不一样
- 在hibnate当中,sql语句会自动帮你生成
- 设置方言,就是设置自动生成的语言是哪个数据库当中的sql
- 配置核心配置文件要加载哪一个映射
- 映射的路径就是上面创建的跟表相对应的配置文件
- 把全路径的点,要换成斜杠
- 配置演示
<!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://localhost:3307/hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">abcd</property>
<!-- 配置Hibernate的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</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="com/xzh/hibernate/domain/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>
6.创建映射关系
通过XML的配置文件来进行配置
这个配置文件可以任意命名
- 类名.hbm.xml
- 别人一看,就能够知道是哪个类的映射文件
在xml当中引入dtd
- 在hibernate-core.jar包当中
- 在org.hibernate包当中可以找到对应的dtd
- 打开mapping.dtd
- 把里面的约束复制一份,放到xml当中
建立类与表的映射
1.建立表与类的映射
2.建立主键的映射
3.建立普通属性的映射配置演示
<?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.xzh.hibernate.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" />
</class>
</hibernate-mapping>
7.创建类执行
@Test
public void test1() {
// 1.加载配置文件
Configuration configure = new Configuration().configure();
// 2.创建sessionFactory --JDBC链接池
SessionFactory sessionFactory = configure.buildSessionFactory();
// 3.获取session --连接对象
Session session = sessionFactory.openSession();
Customer customer = new Customer();
customer.setCust_name("myxq");
customer.setCust_level("2");
// 4.保存
session.save(customer);
// 5.释放资源
session.close();
sessionFactory.close();
}
常见配置
一、映射配置
1. class标签
- 作用:建立类与表的映射关系
- 属性
- name:类的全路径
- table:表名;类名与表名一致,table可以省略;如果没有该表,或自动创建一个表。
- catalog:数据库名,可以不写
2. ID标签
- 作用:建立类中的属性与表中主键的对应关系
- 属性
- name
- column
- length
- type
3. property
- 作用:用于建立类中普通属性与表的对应关系
- 属性
- name:类中的属性名
- column:表中的字段名;如果字段名与类中的属性名一致,column是可以省略
- length:字段的长度
- 默认数据库当中已经有长度了
- hibernate是可以根据映射自动建表
- 建表是没有设定长度,就使用默认的长度
- type:类型;可以不用写,会自动帮你装换
- not-null:不允许为空
- unique:唯一的
二、核心配置
1. 必须配置
- 连接数据库的基本的property参数
- 驱动类
- url路径
- 用户名
- 密码
- 方言
2. 可选配置
显示SQL
hibernate.show_sql格式化SQL
hibernate.format_sql自动建表
hibernate.hbm2ddl.auto
属性:- none
不使用hibernate的自动建表 - create
如果数据库中已经有表,删除原有表,重新创建,如果没有表,新建表 - create-drop
如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表。
最后数据库中一个表没有,为了做测试用
把sessionFactory也close掉时才有效果 - update
如果数据库中有表,使用原有表,如果没有表,创建新表
更新表结构,如果column没有时会创建新的一列 - validate
如果没有表,不会创建表。只会使用数据库中原有的表
校验映射和表结构是否一致,不一致就会报错
- none
3. 引入映射文件
<mapping resource="映射文件全路径"/>
核心API
一、Configuration
Configuration是Hibernate的配置对象
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。
在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
通过这个对象去加载它里面的配置,得到里面的数据内容,才能进行后面的工作。
作用
1. 加载核心配置文件
核心配置文件是属性文件
- 名称为:hibernate.properties
- 直接 configuration cfg = new configuration();
核心配置文件是一个xml
- 名称为:hibernate.cfg.xml
- configuration cfg = new configuration().configure();
2. 加载映射文件
- 属性文件是没有办法加载映射,可以通过config加载映射文件
- configuration.addResource("映射文件的全路径");
二、SessionFactory
sessionFactory
- SessionFactory接口:SessionFactory接口负责初始化Hibernate。
- 并负责创建Session对象。
- 需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,
- 当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
- 内部维护了Hibernate的连接池和Hibernate的二级缓存
- 一个项目只需要创建一个就行了,因为里面有连接池,连接池创建一个就可以了
配置连接池
C3P0:
引入C3P0的jar包
hibernate-release-5.3.1.Final\lib\optional\c3p0 的目录下,有三个jar包。
添加C3P0的配置信息
在 hibernate.cfg.xml 中添加C3P0的配置信息。
<!-- 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下
- 把 log4j-1.2.16.jar放到 lib下
结构
输出源
- console :控制台
- file :文件
级别
- error
只显示error信息 - warn
显示warn error信息,比自己严重的信息 - info
会显示 info debug trace级别的信息 - debug
调试信息,会把上面的都显示 - trace
栈信息
- error
工具类
- 一个项目只需要创建一个就行了,因为里面有连接池,连接池创建一个就可以了
- 通过一个工具类来获取,只需要创建一次
public class HibernateUtil {
public static final SessionFactory sessionFactory;
static {
//1.加载配置文件
Configuration configure = new Configuration().configure();
//2.创建sessionFactory --JDBC 连接池
sessionFactory = configure.buildSessionFactory();
}
public static Session openSession(){
Session session = sessionFactory.openSession();
return session;
}
public static Session getCurrentSession(){
Session session = sessionFactory.getCurrentSession();
return session;
}
}
三、session
- 代表的是hibernate与数据库的连接对象
- 与数据库交互的桥梁,通过它来完成与数据库的增删改查的工作
session的api
1. 保存方法
save(Object obj)
2. 查询方法
(1)get(T.class,id)
- 查询之后,返回的是真实对象本身
- 没有查询到指定的id,返回的是一个空值
(2)load(T.class,id)
- 查询之后返回的是一个代理对象,使用的是第三方的代理机制,javassist.jar
- 没有查询到结果直接报一个异常
3. 修改
void update(Object obj)
(1)直接创建对象修改(不建议使用)
- 如果没有指定其它的字段,会把其它的字段设置为null
Session session = HibernateUtil.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 更新操作
// 如果没有指定其它的字段,会把其它的字段设置为null
Customer customer = new Customer();
customer.setCust_id(1L);
customer.setCust_name("myxq_update");
session.update(customer);
// 提交事务
transaction.commit();
// 5.释放资源
session.close();
(2)查询之后再修改
- 修改了某一个字段,不会把其它的字段设置为null
Session session = HibernateUtil.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 更新操作
// 查询一条记录后更新
Customer customer = session.get(Customer.class, 1L);
customer.setCust_name("myxq666");
session.update(customer);
// 提交事务
transaction.commit();
// 5.释放资源
session.close();
4. 删除
void delete(Object obj)
(1)直接创建对象删除
- 不支持级联删除
Session session = HibernateUtil.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_id(1L);
session.delete(customer);
// 提交事务
transaction.commit();
// 关闭资源
session.close();
(2)查询之后再删除
- 支持级联删除
Session session = HibernateUtil.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
Customer customer = session.get(Customer.class, 2L);
session.delete(customer);
// 提交事务
transaction.commit();
// 关闭资源
session.close();
5. 保存或更新
void saveOrUpdate(Object obj)
- 没有设置id,是保存的操作
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
// 如果没有设置id 是保存的操作
Customer customer = new Customer();
customer.setCust_name("6668888---");
customer.setCust_level("3");
session.saveOrUpdate(customer);
transaction.commit();
session.close();
- 设置了id是修改的操作,如果设置的id没有,就会报错
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
// 如果没有设置id 是保存的操作
Customer customer = new Customer();
customer.setCust_id(3L);
customer.setCust_name("6668888---");
customer.setCust_level("3");
session.saveOrUpdate(customer);
transaction.commit();
session.close();
6. 查询所有
(1)使用HQL的方式
- HQL:Hibernate Query Language 面向对象的查询语言
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
// 查询所有 HQL
Query<Customer> query = session.createQuery("from com.xzh.hibernate.domain.Customer");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
session.close();
(2)支持SQL语句的方式
- 不建议使用,过时了
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
// 查询 SQL
NativeQuery sqlQuery = session.createSQLQuery("select * from customer");
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();
session.close();
四、Transaction 事务
- 如果配置了C3P0连接池,必须要写上事务的代码,C3P0连接池不会自动帮你提交
- 没有配置的画,内部的连接池会自动帮你提交
- Hibernate3当中是不会自动提交的,必须要写,为了兼容以前的版本,还是写上事务
Hibernate 基本使用的更多相关文章
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用
问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...
- hibernate多对一双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate中事务的隔离级别设置
Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下
- Hibernate中事务声明
Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...
- spring applicationContext.xml和hibernate.cfg.xml设置
applicationContext.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans ...
- [原创]关于Hibernate中的级联操作以及懒加载
Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...
- hibernate的基本xml文件配置
需要导入基本的包hibernate下的bin下的required和同bin下optional里的c3p0包下的所有jar文件,当然要导入mysql的驱动包了.下面需要注意的是hibernate的版本就 ...
- Maven搭建SpringMVC+Hibernate项目详解 【转】
前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...
- 1.Hibernate简介
1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发; b.大大减少代码量; c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- 极度舒适的 Python 入门教程,小猪佩奇也能学会~
编程几乎已经成为现代人的一门必修课,特别是 Python ,不仅长期霸占编程趋势榜.薪资榜第一,还屡屡进入小学教材,甚至成为浙江省信息技术高考项目-- 今天,小编带来了一门极度舒适的 Python 入 ...
- git 添加码云远程仓库和上传到码云的命令
添加远程仓库 git remote add Zk 仓库地址.git 查看远程仓库 git remote -v 上传远程仓库 git push Zk master 删除远程仓库Zkgit remot ...
- spark-submit之使用pyspark
在linux下,执行pyspark代码 —— 实测有效:但是并不是所有的包都能够成功,一些很复杂的包或者对C依赖很深的包例如 numpy, pandas, scipy等,无法通过本方法实现:对一些比较 ...
- windows程序意外关闭子订重启脚本
window程序意外关闭自动重启脚本实现 @echo off :1 tasklist|find /i "xxxx"||start yyyy ping/n 11 127.1> ...
- Topshelf 使用
前言 在写后台代码的过程中,经常会遇到要写一些单独的服务.以前呢,直接用的是 .NET 下的 “Windows 服务” 控件开发的. 这个传统的控件开发起来很不方面,使用也不友好.发现有用 Topsh ...
- h5触摸事件-判断上下滑动
// 判断上下滑动 var startX = 0, startY = 0; function touchStart(evt){ try{ var touch = evt.touches[0], //获 ...
- mnist数据的预测结果以及批量处理
import sys, os sys.path.append('F:\ml\DL\source-code') from dataset.mnist import load_mnist from PIL ...
- Meeting Rooms II
Description Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2, ...
- IntelliJ IDEA使用教程一 介绍&安装&配置
http://blog.csdn.net/nextyu/article/details/47206015 全套
- 历年NOIP题
做了几天远古老题,发现不可做,于是咕掉..转而从2005开始.. 1997: P1549 棋盘问题(2):搜索,优化搜索顺序,对于第一行第一列先搜小的(但是其实这样是错的,仅仅能过原题) 加强版咕. ...