基本概念
ORM框架 ——hibernate
1.开源的持久层框架.
2.ORM(Object/Relational Mapping)映射工具,建立面向对象的域模型和关系数据模型之间的映射.
3.连接java应用和数据库的中间件.
4.对JDBC进行封装,负责java对象的持久化.
5.在分层结构中处于持久化层,封装对数据库的访问细节,
使业务逻辑层更专注于实现业务逻辑
Hibernate的优点:
1、Hibernate对JDBC访问数据库的代码做了封装,大大简化
了数据访问层繁琐的重复性代码。
2、Hibernate是一个基于jdbc的主流持久化框架,是一个优秀
的orm实现,它很大程度的简化了dao层编码工作。
3、Hibernate使用java的反射机制,而不是字节码增强程序类实现
透明性
4、Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵
活性很出色。它支持很多关系型数据库,从一对一到多对多的各
种复杂关系。
5、Hibernate使数据库的操作完全面向对象。而不是从前的面向关系进行操作。
Session的几个主要方法
1.save,persist保存数据,persist在事务外不会产生insert语句。
2.delete,删除对象
3.update,更新对象,如果数据库中没有记录,会出现异常。
4.get,根据ID查,会立刻访问数据库。
5.Load,根据ID查,(返回的是代理,不会立即访问数据库)。
6.saveOrUpdate,merge(根据ID和version的值来确定是save或update),调用merge你的对象还是托管的。
7.lock(把对象变成持久对象,但不会同步对象的状态)。
CURD
Java代码
1. 初始化代码(只做一次)
不指定配置文件的加载路径
private static SessionFactory sessionFactory;
static{
Configuration configuration = new Configuration();
//加载配置文件
configuration.configure();//默认加载src目录下的配置文件
//采用了工厂模式创建sessionFactory
sessionFactory = configuration.buildSessionFactory();
}
指定配置文件的加载路径
2. 保存例子
@Test
public void testSavePerson(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
//由于在映射文件中已经说明主键的产生方式是hibernate内部产生,所以在程序中不用设置主键
person.setPid(3L);
person.setPname("菜肉");
person.setPsex("男");
session.save(person);
transaction.commit();
session.close();
}
结果显示:
3. 更新例子(方法一)
/**
* 1、必须从数据库中提取出数据再进行修改
* 2、session.get方法创建的对象利用的是默认的构造函数
*/
@Test
public void testUpdatePerson(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/**
* 1、先把修改的那行提取出来
* 说明:
* Serializable是String和包装类的共同的父类
*/
Person person = (Person)session.get(Person.class,1L);
person.setPsex("不详");
session.update(person);
transaction.commit();
session.close();
}
结果显示:
4. 更新例子(方法二 不推荐)
**
* 1、必须从数据库中提取出数据再进行修改
* 2、session.get方法创建的对象利用的是默认的构造函数
*/
@Test
public void testUpdatePerson(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/**
* 新创建一个person对象
* 把pid为1的值设置进去
* 修改对象
* 这种修改方式不推荐
*/
Person person2 = new Person();
person2.setPid(1L);
person2.setPsex("女");
session.update(person2);
transaction.commit();
session.close();
}
结果显示:
从结果看出来,方法二需要对Person对象的全部属性都要进行设置,此方法不推荐使用
5. 查询例子
@Test
public void testQuery(){
Session session = sessionFactory.openSession();
List<Person> personList = session.createQuery("from Person").list();
System.out.println(personList.size());
}
结果显示:
6.删除例子(方法一)
/**
* 有两种方案
*/
@Test
public void testDelete(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = (Person)session.get(Person.class, 1L);
session.delete(person);
transaction.commit();
session.close();
}
结果显示:
6.删除例子(方法二)
@Test
public void testDelete(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
person.setPid(1L);
session.delete(person);
transaction.commit();
session.close();
}
结果显示:
总结
- Cnfiguration 类负责管理 Hibernate 的配置信息。包括如下内容:
- Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应
hibernate.cfg.xml 文件)。 - 持久化类与数据表的映射关系(*.hbm.xml 文件)
- Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应
创建 Configuration 的两种方式
属性文件(hibernate.properties): Configuration cfg = new Configuration();
Xml文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
第二种创建方式较为常见。Hibernate.cfg.xml文件默认的目录为系统的根目录。
也可以利用config.config方法来指定配置文件所在的目录。 Configuration对象根据当前的配置信息生成
SessionFactory 对象。SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory
对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存)。Configuration cfg = new Configuration().configure();
SessionFactory sf = cfg.buildSessionFactory();是线程安全的。
SessionFactory是生成Session的工厂: Session session = sf.openSession();
构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。
在Hibernate中,Transaction tx =
session.beginTransaction()相当于给数据库操作起事务。Session.commit()则为提交事务。Hibernate的整个运行过程如下:
1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息,
2、并用这些信息生成一个SessionFactory对象,
3、然后从SessionFactory对象生成一个Session对象,
4、并用Session对象生成Transaction对象;
A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作;
B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。