Hibernate之体验
2019-09-29 本文已影响0人
紫荆秋雪_文
一、OR Mapping
1、对象关系映射(Object Relational Maapping,简称ORM)
对象关系映射是一种为了解决面向对象中属性名与关系数据库中字段存在互不匹配的现象。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。避免直接使用SQL语句对关系型数据库中的数据进行操作,减少代码编写量。
2、ORM主要解决对象-关系的映射
- 1、类 ——> 表
- 2、对象——>表的一行数据
- 3、属性——>表的列(字段)
3、ORM的实现思想
将关系数据库中表的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
4、ORM采用元数据来描述对象-关系映射细节
元数据通常采用XML格式,并且存放在专门的对象-关系映射文件中。
5、流行的ORM框架
- 1、JPA:本身是一种ORM规范,不是ORM框架,由各大ORM框架提供实现
- 2、Hibernate:目前最流行的ORM框架,设计灵巧、性能优秀。
- 3、MyBatis:本是apache的一个开源项目iBatis,提供的持久层框架包括SQL Maps和DAO,允许开发人员直接编写SQL.
二、Hibernate概述
Hibernate是一款优秀的开源的Java对象持久层轻量级封装框架,即可以在Java应用程序中取代大部分JDBC代码,也可以整合到J2EE系统中作为持久层的解决方案。
Hibernate本身是基于JDBC,对JDBC访问访问数据库做了抽象和封装。
- 1、优化的ORM思想实现,在很大程度的简化了持久层的重复编码工作,有丰富的文档。
- 2、使用Java的反射机制,而不是字节码增强程序类实现透明性
- 3、性能非常优异,支持多种关系型数据库,灵活而简单的实现了复杂的对象关系映射
- 4、本身性能并不是很好,但是有很多优化手段(一级缓存、二级缓存、查询缓存、抓取策略)
三、Hibernate初体验
1、jar包
- 1、Hibernate-5.1.17
Hibernate的jar包(Hibernate-5.1.17/lib/required)
Hibernate_lib.png
2、hibernate.cfg.xml
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!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.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--数据库驱动类名-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--数据库连接账户-->
<property name="hibernate.connection.url">jdbc:mysql:///hibernateDemo?useSSL=true&serverTimezone=UTC</property>
<!--数据库连接账户-->
<property name="hibernate.connection.username">root</property>
<!--数据库连接密码-->
<property name="hibernate.connection.password">admin</property>
<!--引用xml-->
<mapping resource="com/revanwang/_01/crud/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- 3、User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.revanwang._01.crud.domain">
<class name="User" table="t_user">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"/>
<property name="date" column="date"/>
</class>
</hibernate-mapping>
四、CRUD操作
User.java(domain)
package com.revanwang._01.crud.domain;
import lombok.Data;
import java.util.Date;
@Data
public class User {
private Long id;
private String name;
private Date date;
}
IUserDAO.java
package com.revanwang._01.crud.dao;
import com.revanwang._01.crud.domain.User;
import java.util.List;
public interface IUserDAO {
void save(User user);
void delete(User user);
void update(User user);
User get(Long id);
List<User> getList();
}
UserDAOImpl.java
package com.revanwang._01.crud.dao.impl;
import com.revanwang._01.crud.dao.IUserDAO;
import com.revanwang._01.crud.domain.User;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import java.util.List;
public class UserDAOImpl implements IUserDAO {
@Override
public void save(User user) {
//1、创建配置对象
Configuration cfg = new Configuration();
//2、读取配置文件
cfg.configure("/hibernate.cfg.xml");
//3、创建SessionFactory
SessionFactory sessionFactory = cfg.buildSessionFactory();
//4、获取Session
Session session = sessionFactory.openSession();
//5、设置事务的开启状态
session.beginTransaction();
//6、具体操作
session.save(user);
//7、提交事务
session.getTransaction().commit();
//8、关闭Session
session.close();
//9、关闭SessionFactory
sessionFactory.close();
}
@Override
public void delete(User user) {
//1、创建配置对象
Configuration cfg = new Configuration();
//2、读取配置文件
cfg.configure("/hibernate.cfg.xml");
//3、创建SessionFactory
SessionFactory sessionFactory = cfg.buildSessionFactory();
//4、获取Session
Session session = sessionFactory.openSession();
//5、设置事务的开启状态
session.beginTransaction();
//6、具体操作
session.delete(user);
//7、提交事务
session.getTransaction().commit();
//8、关闭Session
session.close();
//9、关闭SessionFactory
sessionFactory.close();
}
@Override
public void update(User user) {
//1、创建配置对象
Configuration cfg = new Configuration();
//2、读取配置文件
cfg.configure("/hibernate.cfg.xml");
//3、创建SessionFactory
SessionFactory sessionFactory = cfg.buildSessionFactory();
//4、获取Session
Session session = sessionFactory.openSession();
//5、设置事务的开启状态
session.beginTransaction();
//6、具体操作
session.update(user);
//7、提交事务
session.getTransaction().commit();
//8、关闭Session
session.close();
//9、关闭SessionFactory
sessionFactory.close();
}
@Override
public User get(Long id) {
//1、创建配置对象
Configuration cfg = new Configuration();
//2、读取配置文件
cfg.configure("/hibernate.cfg.xml");
//3、创建SessionFactory
SessionFactory sessionFactory = cfg.buildSessionFactory();
//4、获取Session
Session session = sessionFactory.openSession();
//5、具体的查询操作
User user = session.get(User.class, id);
System.out.println(sessionFactory + "\n" + session);
//6、关闭Session
session.close();
//7、关闭SessionFactory
sessionFactory.close();
return user;
}
@Override
public List<User> getList() {
//1、创建配置对象
Configuration cfg = new Configuration();
//2、读取配置文件
cfg.configure("/hibernate.cfg.xml");
//3、创建SessionFactory
SessionFactory sessionFactory = cfg.buildSessionFactory();
//4、获取Session
Session session = sessionFactory.openSession();
//5、具体的查询操作
String hql = "SELECT u FROM User u";
Query query = session.createQuery(hql);
List<User> userList = query.list();
//6、关闭Session
session.close();
//7、关闭SessionFactory
sessionFactory.close();
return userList;
}
}
执行流程 Hibernate执行流程.png
1、save方法的执行流程
session.save(user)
SQL:
INSERT INTO t_user (name, date) VALUES(?, ?, ?)
步骤:
- 1、根据对象获取对应的字节码类型
Class clzz = user.getClass(); ——> User.class - 2、使用内省机制得到user对象中所有的属性(id,name,date)
- 3、找到User.hbm.xml文件,解析<class>元素的table属性(t_user)
- 4、解析<property>元素,根据各自的属性名称找到对应的列名(column)
- 5、解析<generator>元素,得到主键的生成策略(native),不会把id放在INSERT的SQL中
- 6、拼接SQL:
INSERT INTO t_user (name, date) VALUES(?, ?)
设置占位符
user.getName, user.getDate
- 7、执行SQL
2、get方法的执行流程
session.get(User.class, 1L)
SQL:
SELECT * FROM t_user WHERE id = ?
步骤:
- 1、根据传入的User.class,获取User类中所有的属性
- 2、找到User.hbm.xml文件,解析<class>元素的table属性(t_user)
- 3、解析<id>元素,并得到column属性id
- 4、拼接SQL:
SELECT * FROM t_user WHERE id = ?
- 5、为id设置占位符参数,并执行SQL
- 6、处理结果集,把查询的一条数据封装成一个User对象
User user = new User();
迭代user对象中的属性,并调用属性的write方法(set方法)
Method setter = pd.getWriteMethod();
setter.invoke(user, rs.getObject(当前属性名对应的列名));
- 7、返回user对象