什么是hibernate
Hibernate是一个ORM(对象关系映射)框架,我们在写程序时 ,用的是面向对象的方法,但是在关系型数据库里,存的是一条条的数据,为了用纯面向对象的思想解决问题,所有需要将程序中的对象和数据库的记录建立起映射关系,ORM就是这样的技术,而Hibernate就是这样一个框架,以操作对象的方式操作数据库。Hibernate是一个操作数据库的框架,实现了对JDBC的封装。
Hibernate的优势
1、对象化。hibernate可以让开发人员以面相对象的思想来操作数据库。jdbc只能通过SQL语句将元数据传送给数据库,进行数据操作。而hibernate可以在底层对元数据和对象进行转化,使得开发者只需要面向对象的方式来存取数据即可。
2、更好的移植性。hibernate使用xml或JPA的配置以及数据库方言等等的机制,使得hibernate具有更好的移植性,对于不同的数据库,开发者只需要使用相同的数据操作即可,无需关心数据库之间的差异。而直接使用JDBC就不得不考虑数据库差异的问题。
3、开发效率高。hibernate提供了大量的封装,很多数据操作以及关联关系等都被封装的很好,开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率。 原生sql、hql、qbc、qbe、注解
4、缓存机制的使用。hibernate提供了缓存机制(session缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,缓存机制对提升性能大有裨益 redis
2.1:导入hibernate框架依赖的jar文件
2.2:创建实体类 提供set get方法
public class Person implements Serializable {
private int id;
private String name;
private String password;
private Date bir;
2.3:创建实体类映射文件 Person_hbm.xml
2.4:创建hibernate的核心配置文件 hibernate.cfg.xml
org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/0423dbs root root true true
2.5:实例化配置文件,操作数据对象
public class HT {
/*
* hibernate 执行原理 执行过程
*
* 1: 实例化配置文件
* 2:构建session工厂
* 3: 创建session
* 4: 开启事务
* 5: 操作数据
* 6: 提交事务
* 7: 关闭session
* */
public static void main(String[] args) {
//读取配置文件,实例化 默认的寻找 名字为 hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
//构建session工厂
SessionFactory sf = cfg.buildSessionFactory();
//创建session
Session session = sf.openSession();
//操作数据 (insert delete update)手动开启事务
Transaction bt = session.beginTransaction();
//操作数据
Person per = new Person();
per.setName(“张三丰”);
per.setBir(new java.util.Date());
//保存数据(hibernate中操作数据的所有方法被封装到了session对象中)
session.save(per);
//提交事务
bt.commit();
session.close();
}
}
Person_hbm.xml配置文件详解
1、映射配置文件名称和路径不是固定的
2、映射配置文件中,标签name属性值写实体类相关内容
2.1、class标签name属性值实体类全路径
2.2、id标签和property标签name属性值 实体类属性名称
3、Id标签和property,column属性是可以省略的
3.1、不写的时候值和name属性值一样的
4、Property标签type属性,一般我们不用,主要是用来设置数据库字段的类型,Hibernate会自动设置
Hibernate.cfg.xml 配置文件详解
1、配置写的位置必须在里面
2、配置要求,三部分 数据库必须的、hibenate部分可选、映射文件是必须的
3、核心配置文件名称和位置是固定的 位置src下,名称是hiberante.cfg.xml
Configuration接口:
Configuration configuration = new Configuration().configure();
到src下面找到名称为hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)
SessionFactory接口:
1、使用configuration对象创建sessionFactory对象
a) 创建sessionfactory过程中做一些事情:即根据核心配置文件中,有数据库配置,有映射配置部分,到数据库里面根据映射关系把表创建
2、创建sessionfactory过程中,这个过程很消耗资源
a) 在hibernate操作中,建议一个项目一般创建一个sessionfactory
Session接口:
1、session类似于jdbc中的Connection
2、调用session里面不同的curd方法,save、update、delete、根据id查询/get
Transaction事务控制接口:
1、事务对象(commit以及rollback)
2、事务特性:
a) 原子性
所有的操作要么都成功 要么都失败
b) 一致性
数据的一致性,转钱一方少钱,一方要多钱
c) 隔离性
多个事务操作同一条数据,彼此不影响
d) 持久性
因为事务要提交,保存到数据库中,这个就是持久化
@Test
//saveOrUpdate
public void test4() {
Configuration configure = new Configuration().configure(“hibernate.cfg.xml”);
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setId(1);
user.setName(“张三”);
session.saveOrUpdate(user);
transaction.commit();
}
@Test
//merge
public void test5() {
Configuration configure = new Configuration().configure(“hibernate.cfg.xml”);
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setId(1);
user.setName(“李四”);
session.merge(user);
transaction.commit();
}
saveOrUpdate、merge 都可以根据对象的状态判断进行savor还是update;
如果是瞬时态进行save,如果是持久态进行update
不同的是,merge在进行update前会先根据对象的值和数据库是否一致,如果完全一致则不需要update
1.查询所有信息
public void test7() {
Configuration configure = new Configuration().configure(“hibernate.cfg.xml”);
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery(“from User”, User.class);
List list = query.list();
for (User user : list) {
System.out.println(user);
}
}
2.投影查询 Object[]
public void test8() {
Configuration configure = new Configuration().configure(“hibernate.cfg.xml”);
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Query