Hibernate学习
文章目录
一、Hibernate体系结构的要素
Hibernate体系结构的要素要创建第一个hibernate应用程序,我们必须知道Hibernate架构的元素。 它们如下:
1.会话工厂(SessionFactory)
SessionFactory是ConnectionProvider的会话和客户端工厂。 它拥有数据的二级缓存(可选)。 org.hibernate.SessionFactory接口提供了工厂方法来获取Session的对象。
2. 会话(Session)
Session对象提供应用程序和存储在数据库中的数据之间的接口。 它是一个短生命周期的对象并包装JDBC连接。 它是事务,查询和标准的工厂。 它拥有一级缓存(强制性)数据。 org.hibernate.Session接口提供插入,更新和删除对象的方法。 它还提供了事务,查询和标准的工厂方法。
3.事务(Transaction)
事务对象指定工作的原子单位,它是一个可选项。 org.hibernate.Transaction接口提供事务管理的方法。
4.连接提供者(ConnectionProvider)
它是一个JDBC连接工厂。 它从DriverManager或DataSource抽象出来的应用程序。 它是一个可选项。
5.事务工厂(TransactionFactory)
它是一个事务工厂,是一个可选项。
二、入门案例
1.创建maven工程并导入所需依赖
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.17.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.编写核心配置文件(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>
<!--数据库连接-->
<property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=utf-8</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!--选项配置-->
<!--作用:反向生成表-->
<property name="hbm2ddl.auto">update</property>
<!--生成数据库的语法设置为MySQL-->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--把hibernate生成的sql语句输出到控制台,调试方便-->
<property name="show_sql">true</property>
<!--映射配置文件的路径-->
<!--<mapping resource="cn/ffcs/domain/Book.hbm.xml"/>-->
<!--扫描注解-->
<mapping class="cn.ffcs.domain.Book"/>
</session-factory>
</hibernate-configuration>
3.编写实体类和映射配置文件
实体类:
package cn.ffcs.domain;
/**
* 图书的实体类
*/
public class Book {
private Integer id; //主键
private String name; //图书名字
private String author; //图书作者
private Double price; //图书价格
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
映射配置文件(ORM的相关思想实现)
<!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="cn.ffcs.domain.Book" table="t_book">
<id name="id">
<column name="bid"/>
<generator class="identity"/> <!--数据库自增-->
</id>
<property name="name">
<column name="name"/>
</property>
<property name="author">
<column name="author"/>
</property>
<property name="price">
<column name="price"/>
</property>
</class>
</hibernate-mapping>
4.编写实体类和通过注解实现
实体类:
package cn.ffcs.domain;
import javax.persistence.*;
/**
* 图书的实体类
*/
@Entity
@Table(name = "t_book")
public class Book {
@Id
@Column(name = "bid")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id; //主键
@Column(name = "name")
private String name; //图书名字
@Column(name = "author")
private String author; //图书作者
@Column(name = "price")
private Double price; //图书价格
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
hibernate的主配置文件中配置扫描注解的类
<?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>
<!--数据库连接-->
<property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=utf-8</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!--选项配置-->
<!--作用:反向生成表-->
<property name="hbm2ddl.auto">update</property>
<!--生成数据库的语法设置为MySQL-->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--把hibernate生成的sql语句输出到控制台,调试方便-->
<property name="show_sql">true</property>
<!--映射配置文件的路径-->
<!--<mapping resource="cn/ffcs/domain/Book.hbm.xml"/>-->
<!--扫描注解-->
<mapping class="cn.ffcs.domain.Book"/>
</session-factory>
</hibernate-configuration>
5.注意错误
Mapping (RESOURCE) not found : cn/ffcs/domain/Book.hbm.xml : origin(cn/ffcs/domain/Book.hbm.xml)
原因:maven工程没有把xm读取到。
解决办法:
在pom.xml文件中配置:以下代码
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
6.测试CRUD
import cn.ffcs.domain.Book;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
/**
* Book的测试类
*/
public class BookTest {
private Configuration cfg;
private SessionFactory factory;
private Session session;
private Transaction tx;
@Before
public void init(){
//1.解析hibernate的核心配置文件
cfg = new Configuration().configure();
//2.解析映射信息(在此步骤创建了sql语句)
factory = cfg.buildSessionFactory();
//3.得到Session对象
session = factory.openSession();
//4.开启事务
tx = session.beginTransaction();
}
@After
public void after(){
//6.提交事务
tx.commit();
//7.释放资源
session.close();
}
/**
* 测试保存
*/
@Test
public void testSave(){
//5.保存数据
Book book = new Book();
book.setName("java");
book.setAuthor("黑马");
book.setPrice(100d);
session.save(book);
}
/**
* 测试查询(按id查)
*/
@Test
public void testGet(){
Book book = session.get(Book.class, 2);
System.out.println(book);
}
/**
* 测试删除(根据id删除)
*/
@Test
public void testDelete(){
Book book = new Book();
book.setId(4);
session.delete(book);
}
/**
* 测试更新(根据id进行更新锁定)
*/
@Test
public void testUpdate(){
Book book = new Book();
book.setId(1);
book.setName("java入门");
book.setAuthor("黑马培训班");
book.setPrice(200d);
session.update(book);
}
/**
* 测试查询所有——方法1
*/
@Test
public void testQuery1(){
/**
* 当使用方法时from下面红线信息:'from' unexpected
* 解决方法:项目名右击 - >add framework support ->选中hibernate 和 j2EE persistence
* 含义:添加 hibernate 和 j2EE persistence 的框架支持
* 注:红线不影响运行。(作为强迫症,还是要修改一下。)
*/
Query query = session.createQuery("from cn.ffcs.domain.Book");
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
/**
* 测试查询所有——方法2
*/
@Test
public void testQuery2(){
Criteria criteria = session.createCriteria(Book.class);
List<Book> list = criteria.list();
for (Book book : list) {
System.out.println(book);
}
}
/**
* 测试查询所有方法——方法3
*/
@Test
public void testQuery3(){
SQLQuery sqlQuery = session.createSQLQuery("select * from t_book").addEntity(Book.class);
List<Book> list = sqlQuery.list();
for (Book book : list) {
System.out.println(book);
}
}
/**
* 测试多条件查询(利用离线查询条件)
*/
@Test
public void testMultiConditionQuery(){
DetachedCriteria criteria = DetachedCriteria.forClass(Book.class);
criteria.add(Restrictions.eq("name","java入门")).add(Restrictions.eq("author","黑马培训班"));
// criteria.add(Restrictions.eq("name","java")).add(Restrictions.eq("price",100D));
Criteria c = criteria.getExecutableCriteria(session);
List<Book> list = c.list();
for (Book book : list) {
System.out.println(book);
}
/**
* uniqueResult()方法表示只有唯一返回值(要注意的是上面的criteria.add(...)的方法所做的条件在数据库中有且只有一条数据否则会报错)
* 报错信息:org.hibernate.NonUniqueResultException: query did not return a unique result: 2(表示查询到数据库中存在符合条件的两条数据,封装进一个bean对象错误)
*/
// Book book = (Book) criteria.getExecutableCriteria(session).uniqueResult();
// System.out.println(book);
}
}
三、hibernate的缓存机制与Session、SessionFactory、Transaction、Query、Criteria和Configuration核心API
相关资料请转载