一.HIbernate框架介绍
什么是Hibernate:
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。
什么是ORM:
对象关系映射(英语:Object Relation Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言不同类型系统的数据之间的转换。
对象-关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
为什么使用Hibernate框架:
1.Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,很大程度简化了dao层编码工作。
总结:HIbernate是企业级开发中的主流框架,映射的灵活性很出色,它支持很多关系型数据库。
Hibernate框架的学习目标:
- 创建项目,搭建Hibernate开发环境
- 掌握Hibernate常用API,即如何使用Hibernate框架进行开发
- 掌握Hibernate关系映射,即如何解决表与表之间的关系问题,有一对一,一对多等各种关系
- 掌握Hibernate的查询
- 提高Hibernate的效率
二.Hibernate的开发
1.创建持久化类
2.创建对象-关系映射文件
3.创建Hibernate配置文件
4.通过Hibernate API编写访问数据库的代码
三.Hibernate的第一个小程序
下载Hibernate的JAR包:
创建实体类:
package com.ljf.pojo;
public class Product {
private Integer id; //产品id
private String name; //产品名称
private Integer 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 Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}
配置Product.hbm.xml:
在com.ljf.pojo下新建一个Product.hbm.xml,用于映射Product类对应数据库中的Product表
注:文件名Product.hbm.xml中P一定要大写,要和类保持一致
配置hibernate.cfg.xml:
在src目录下创建 hibernate.cfg.xml
配置访问数据库要用到的驱动,url,账号密码等等
其他配置及含义:
org.hibernate.dialect.MySQLDialect
这告诉hibernate底层用的是什么数据库。
thread
这是hibernate事务管理方式,即每个线程一个事务
true
这表示是否在控制台显示执行的sql语句
update
这表示是否会自动更新数据库的表结构,有这句话,其实是不需要创建表的,因为hibernate会自动创建表结构
这表示hibernate会去识别Product这个实体类
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/testtwo?characterEncoding=UTF-8
utf-8
root
123456
org.hibernate.dialect.MySQLDialect
thread
true
update
三、测试类TestHibernate
创建一个Product对象,并通过hibernate把这个对象,插入到数据库中
hibernate的基本步骤是:
1.获取SessionFactory
2.通过SessionFactory获取一个session
3.在Session基础上开启一个事务
4.通过Session的save方法把对象保存到数据库
5.提交事务
6.关闭Session
7.关系SessionFactory
代码如下:
package com.ljf.test;
import com.ljf.pojo.Category;
import com.ljf.pojo.Product;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import java.util.List;
public class TestHibernate {
public static void main(String[] args) {
//标准配置,配置hibernate的session
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
//用for循环完成数据的多条插入
/*
for (int i = 1; i < 7; i++) {
Product p = new Product();
p.setName("iphone7"+i);
p.setPrice(7000+i);
s.save(p);
}
*/
//获取第6条的数据,并将数据显示出来
/*
Product p =(Product) s.get(Product.class,6);
System.out.println("id为6的产品名称是:"+p.getName()+"\n价格为:"+p.getPrice());
*/
//实体对象在Hibernate中有三种状态,分别是瞬时,持久,脱管
//瞬时:指的是没有和HIbernate发生任何关系,在数据库中也没有对应的记录,一但JVM结束,这个对象也就消失了
//持久:指的是一个对象和Hibernate发生联系,有对应的session,并且在数据库中有对应的一条记录
//脱管:指的是一个对象虽然在数据库中有对应的一条记录,但是它所对应的session已经关闭了
/*
Product p = new Product();
p.setName("p1");
System.out.println("此时p是瞬时状态");
s.save(p);
System.out.println("此时p是持久状态");
s.getTransaction().commit();
s.close();
System.out.println("此时p是托管状态");
sf.close();
*/
//读取第5条的数据,并实现删除
/*
Product p = (Product)s.get(Product.class,5);
s.delete(p);
System.out.println("第5条数据删除成功");
*/
//修改第三条的数据
/*
Product p =(Product)s.get(Product.class,3);
System.out.println("修改前的名字:"+p.getName());
p.setName("hhahhahahha");
s.update(p);
*/
/*HQL(Hibernate Query Language)是Hibernate
专门用于查询数据的语句,有别于SQL,HQL更加接近面向对象的思维方式
比如使用类的名字Product,而非表格的名字product
String name = "iphone";
Query q =s.createQuery("from Product p where p.name like ?");
q.setString(0,"%"+name+"%");
List products = q.list();
int i=0;
for (Product p : products){
i = i + 1;
System.out.println(p.getName());
}
System.out.println("总共有"+i+"条记录");
*/
/*
使用Criteria进行数据查询,与HQL和SQL的区别是
Criteria完全是面向对象的方式在进行数据查询,将不再看到sql语句的痕迹
使用Criteria查询数据
1.通过session的createCriteria创建一个Criteria对象
2.Criteria.add增加约束。在本例中增加一个对name的模糊查询(like)
3.调用list()方法返回查询结果的集合
除此之外,Criteria还可以很方便的进行分页查询和获取总数
String name = "iphone";
Criteria c = s.createCriteria(Product.class);
c.add(Restrictions.like("name","%"+name+"%"));
List ps = c.list();
int i=0;
for (Product p : ps) {
i = i + 1;
System.out.println(p.getName());
}
System.out.println("总共有"+i+"条记录");
*/
/*通过标准SQL语句进行查询
* HIbernate依然保留对标准SQL语句的支持,在一些场合,比如多表联合查询,并且有分组统计函数的
* 情况下,标准sql语句依然是效率较高的一种选择
//为什么会报错,不明白
String name = "iphone";
String sql = "select * from product p where p.name like '%"+name+"%'";
Query q = s.createQuery(sql);
List list = q.list();
for (Product ps : list){
for (Object filed : os){
System.out.println(filed+"\t");
}
System.out.println();
}
//正确的语句
String name = "iphone";
String sql = "select * from product p where p.name like '%"+name+"%'";
Query q= s.createSQLQuery(sql);
List
四、基本原理图
应用程序通过Hibernate把一个Product对象插入到数据库的product表中
hibernate.cfg.xml配置文件提供数据库的基本信息
Product.hbm.xml提供对象与表的映射关系
对应哪个表?什么属性,对应什么字段