简介
hibernate 是一个开源的对象关系映射框架,对 JDBC 进行的轻量级的封装,允许我们以面向对象编程方式去操作数据库。
其优点有:
1.ORM,移植性好
2.缓存机制,一级和二级缓存
3.简洁的 HQL
缺点:
1.全表映射在复杂查询时难以做到 sql 优化
使用基本流程:添加相关依赖-> 做连接数据库的基本配置 -> 实体类与数据表的映射配置-> 通过 session 操作数据库
Hibernate5 包依赖
通过 maven 依赖添加必须的 jar 包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>hibernate.version</version>
</dependency>
hibernate 是有很多功能模块的,例如:orm 、search、validate、ogm,需要使用哪些功能,才添相应的依赖,通过 hibernate 官网的快速使用向导可以找到对应的 dependency。
Hibernate 配置文件
1.hibernate.cfg.xml(复杂配置)
2.hibernate.properties(简单配置)
3.ehcache.xml(可选,二级缓存配置)
在写配置文件时,最好就是参考官网中给出的例子,一般在下载的例子项目中可以找到。配置信息主要分两部分:基础配置(连接数据的参数、数据库配置) 和 实体与数据表的映射配置。
基础配置基本格式:尤其注意数据头要与你的数据环境匹配
<!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 标签配置各种数据库基本信息:
url、psw、username、driverClass
-->
<property />
<!--mapping 标签配置实体类映射-->
<mapping />
</session-factory>
</hibernate-configuration>
实体与数据表的映射配置:
1.使用 xml 配置(ClassName.hbm.xml)
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class>
<!--对应的实体类属性与数据表列字段映射-->
</class>
</hibernate-mapping>
2.使用注解配置:新建对应的实体类,在类中使用注解,基本注解有如下
@Entity 声明一个映射实体对象
@Table 声明表名
@Id 主键
@GeneratedValue 主键生成策略
@Column 对应列名
@Temporal 指定时间精度
@Enumerated 指定枚举类型存储格式
@Transient 指明该字段不会被持久化
使用 Session 对象
获取 sessionFactory , 因为 sessionFactory 是用来创建 session 对象,在整个应用都需要用到,其作用域应该是全局的,我们一般设置为单例模式,可参考如下:
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure().build();
try{
return new MetadataSources(registry).buildMetadata()
.buildSessionFactory();
}catch (Exception e) {
e.printStackTrace();
StandardServiceRegistryBuilder.destroy(registry);
}
return null;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
通过 sessionFactory 获取 session,参考如下
/* session 线程不安全,不可以自动回滚和关闭事务 */
public static Session openSession(){
return sessionFactory.openSession();
}
/* session 线程安全,可以自动回滚和关闭事务 */
public static Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
调用 session 中的方法操作数据库,参考如下,具体使用查看 API
try{
session.beginTransation();
session.persist(pojo);
session.update(pojo);
session.delete(pojo);
session.get(calzz,id);
session.createQuery(sql).list();
session.getTransation().commit();
}catch{
session.getTransation().rollback();
}finally{
session.close();
}
小结:上面记录了添加依赖 - 配置 - 使用 session 操作数据库的主线,要想用好 hibernate 还需要理解许多相关的细节。
HQL : hibernate 的 sql 语句
Query query = session.createQuery(hql);
获得 query 对象后,可以通过调用其中的方法完成相关操作,类似于使用 PrepareStatement。hql 语法,类似于 sql , 不同的是引用数据表名变为引用相对应的实体类类名,列字段变为实体类的属性。
<!--sql-->
select 列名 from 表名 where xxx group by xxx having xxx order by xxx
<!--hql-->
select className from className where xxx group by xxx having xxx order by xxx