Hibernate
1.Hibernate介绍
(1)简介
Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。
Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。
Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。Hibernate 优势
- Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。
- 为在数据库中直接储存和检索 Java 对象提供简单的 APIs。
- 如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性。
- 抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java 对象。
- Hibernate 不需要应用程序服务器来操作。
- 操控你数据库中对象复杂的关联。
- 最小化与访问数据库的智能提取策略。
- 提供简单的数据询问。
(2)支持的数据库
Hibernate 支持几乎所有的主要 RDBMS。以下是一些由 Hibernate 所支持的数据库引擎。
- HSQL Database Engine
- DB2/NT
- MySQL
- PostgreSQL
- FrontBase
- Oracle
- Microsoft SQL Server Database
- Sybase SQL Server
- Informix Dynamic Server
(3)支持的技术
Hibernate 支持多种多样的其它技术,包括以下:
- XDoclet Spring
- J2EE
- Eclipse plug-ins
- Maven
2.Hibernate配置
(1)Hibernate.cfg.xml文件配置
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 方言(不同数据库中,sql语句略有区别,指定方言可以让hibernate生成sql语句时针对数据库的方言生成),便于hibernate对象操作转化为合适的数据库语句-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 配置数据库连接-->
<property name="connection.url">jdbc:mysql://localhost:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8</property>
<!-- 配置数据库驱动文件-->
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!--数据库用户名 -->
<property name="connection.username">root</property>
<!--数据库密码 -->
<property name="connection.password">root</property>
<!--是否显示sql语句,sql一般会很难看 默认为false-->
<property name="show_sql">true</property>
<!--下一个层级的映射文件,用来配置bean对象与数据表之间的关系 -->
<mapping resource="com/example/UserInfoEntity.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(2)配置表与实体对象的关系配置
<?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">
<!-- package属性:填写一个包名,在后面的属性配置中可以直接写简答类名-->
<hibernate-mapping package="com.example">
<!--
class元素:配置实体与表的对应关系
name:完整类名
table:数据库表名
-->
<class name="UserInfoEntity" table="user_info" schema="user">
<!--
id;配置主键映射的属性
name:填写主键对应的属性名
column:填写表中的主键列名
-->
<id name="id" column="id"/>
<!--
property元素:除id之外的普通属性映射
name:填写属性名
column:填写表中对应的列名
type(可选):填写列(属性)的类型
hibernate会自动检测实体的属性类型,建议不填
每个类型有三种填法:java类型|hibernate类型|数据库类型
-->
<property name="username" column="username"/>
<property name="password" column="password"/>
<property name="nickname" column="nickname"/>
<property name="sex" column="sex"/>
</class>
</hibernate-mapping>
3.Hibernate API详解
//1.创建对象,调用空参构造
Configuration conf = new Configuration();
//2.读取指定主配置文件 --->空参构造,加载src下的hibernate.cfg.xml文件
conf.configure();
//3.根据配置信息,创建SessionFactory对象
SessionFactory sessionFactory = conf.buildSessionFactory();
/*
<!--SessionFactory功能:用户创建数据库核心对象Session对象的工厂
简单来说就是功能就是创建session对象
注意:a.sessionFactory 负责保存和使用所有配置信息,消耗内存资源很大
b.session属于线程安全的对象设计
结论:保证在web项目中,只创建一个sessionFactory对象*/
//4.获得session
//打开一个新的session
sessionFactory.openSession();
//获得一个与线程绑定的session对象
sessionFactory.getCurrentSession();
session对象功能:表达hibernate框架与数据库之间的连接(会话)
类似于JDBC中的connection对象,还可以完成对数据库中的增删改查
session是hibernate操作数据库的核心对象
package test;
import com.example.UserInfoEntity;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class test {
public static void main(String [] args) {
Configuration conf = new Configuration().configure();
SessionFactory sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction1 = session.beginTransaction();
//增加
/*UserInfoEntity u = new UserInfoEntity();
u.setId("5");
u.setNickname("轨迹11");
u.setUsername("黄阳11");
u.setPassword("1231");
u.setSex("男");
session.save(u);*/
/*查询
UserInfoEntity u = session.get(UserInfoEntity.class, "1");
System.out.println(u);*/
/*修改
UserInfoEntity u = session.get(UserInfoEntity.class, "1");
u.setNickname("李四1111");
session.update(u);*/
/*删除
UserInfoEntity u = session.get(UserInfoEntity.class, "1");
session.delete(u);*/
transaction1.commit();//提交事务
session.close();//释放资源
sessionFactory.close();//释放资源
}
}
总结基本步骤:
- 获得configuration对象
- 获得sessionFactory对象
- 获得session对象
- 获得transaction对象并开启事务
- 执行数据操作(增删改查)
- 提交事务
- 释放资源
4.Hibernate简单封装
`package Utils;`
`import org.hibernate.Session;`
`import org.hibernate.SessionFactory;`
`import org.hibernate.cfg.Configuration;`
`public class hibernateUtils {`
`private static SessionFactory sessionFactory;`
`static {`
`Configuration conf = new Configuration().configure();`
`sessionFactory = conf.buildSessionFactory();`
`}`
`//获得全新session`
`public static Session openSession(){`
`Session session = sessionFactory.openSession();`
`return session;`
`}`
`//获得与线程绑定的session`
`public static Session getCurrentSession(){`
`Session session = sessionFactory.getCurrentSession();`
`return session;`
`}`
`public static void main(String [] args) {`
`System.out.println(hibernateUtils.openSession());`
`}`
`}`