Hibernate框架介绍
核心组件
Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。
SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Transaction
Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
Criteria
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
Configuration
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。
代码实现
本篇Demo基于Hibernate5.3,mysql5.7;
Github地址:https://github.com/The-ProgramLife/Demo/tree/master/Hibernate
数据库的增删改查(CRUD)
创建数据库
create database test;
创建表
CREATE TABLE product (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(30) ,
price float ,
PRIMARY KEY (id)
) DEFAULT CHARSET=UTF8;
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
package pojo;
import java.util.Set;
public class Product {
private int id;
private String name;
private float price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-5-30 16:02:52 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="pojo.Product" table="PRODUCT">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="price" type="float">
<column name="PRICE" />
</property>
</class>
</hibernate-mapping>
<?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.password">admin</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernatetest?characterEncoding=utf8&useSSL=true</property>
<property name="hibernate.connection.username">root</property>
<!-- 数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!-- 映射实体类配置文件 -->
<mapping resource="pojo/Product.hbm.xml" />
</session-factory>
</hibernate-configuration>
1.获取SessionFactory
2.通过SessionFactory 获取一个Session
3.在Session基础上开启一个事务
4.通过调用Session的save方法把对象保存到数据库
5.提交事务
6.关闭Session
7.关闭SessionFactory
package Demo.Hibernate;
import pojo.Product;
public class App {
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
Product product1 = new Product();
product1.setName("iphone7");
product1.setPrice(7000);
session.save(product1); // 插入数据
Product product2 = (Product) session.get(Product.class, 0); // 获取数据
System.out.println("id=1的产品名称是: " + product2.getName());
Product product3 = (Product) session.get(Product.class, 0);
session.delete(product3); // 删除数据
Product product4 = (Product) session.get(Product.class, 0);
product4.setName("iphone8");
session.update(product4); // 更新數據
session.getTransaction().commit();
session.close();
sessionFactory.close();
}
}
对于查询操作Hibernate还提供了多种选择
1.使用HQL进行查询操作
HQL是Hibernate专门用于查询数据的语句,使用方法如下:
2.设置参数
3.通过Query对象的getResultList()方法返回查询结果
Query<Product> query = session.createQuery("from Product p where p.name like ?0", Product.class); // 使用HQ进行模糊查询
query.setParameter(0, "%iphone%");
List<Product> products1 = query.getResultList();
for (Product product : products1) {
System.out.println(product.getName());
}
2.使用Criteria进行查询操作
Criteria使用面向对象的方式进行数据查询,使用方法如下:
1.通过Session的createCriteria()方法创建一个Criteria对象
2.通过其add()方法添加约束
3.调用list()方法返回查询结果的集合
Criteria c= s.createCriteria(Product.class);
c.add(Restrictions.like("name", "%"+name+"%"));
List<Product> ps = c.list();
for (Product p : ps) {
System.out.println(p.getName());
}
3.使用SQL语句进行查询操作
Hibernate依然保留对标准SQL语句的支持,使用方法如下:
1.通过Session的createSQLQuery()方法创建一个Query对象并构建出SQL语句
2.通过Query的list()方法返回查询结果集合
String name = "iphone";
String sql = "select * from product_ p where p.name like '%"+name+"%'";
Query q= s.createSQLQuery(sql);
List<Object[]> list= q.list();
for (Object[] os : list) {
for (Object filed: os) {
System.out.print(filed+"\t");
}
System.out.println();
}