一、基础使用
1.Hibernate:2建立(数据库表和对应的实体类),2配置(hibernate.cfg.xml和.hbm.xml),1控制(代码逻辑控制)
2.hibernate.cfg.xml配置文件(指明了数据库的链接和所有实体类和数据库表的映射文件):
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配制文件的dtd信息 -->
<!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.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!--数据库驱动 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!--连接数据库的url -->
<property name="hibernate.connection.url">
jdbc:mysql://127.0.0.1:3306/taobao
</property>
<!--数据库的用户名 -->
<property name="hibernate.connection.username">
root
</property>
<!--数据库的密码 -->
<property name="hibernate.connection.password">
123456
</property>
<!--其它配置 -->
<!-- 显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="format_sql">true</property>
<!-- 用来关联hbm配置文件 -->
<mapping resource="cn/itcast/domain/Customer.hbm.xml"/>
<mapping resource="cn/itcast/domain/Customer2.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3.Student.hbm.xml配置文件(指明了数据库表和实体类的对应关系):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name代表的是实体类名 talbe代表的是表名 -->
<class name="cn.itcast.domain.Customer" table="customer">
<!-- name=id 代表的是customer类中属性
column=id 代表的是table表中的字段 -->
<id name="id" column="id">
<generator class="native"/><!-- 主键生成策略 -->
</id>
<!-- 其它属性使用property标签来映射 -->
<property name="name" column="name" type="string" />
<property name="age" column="age" type="integer" />
<property name="sex" column="sex" type="string"/>
<property name="city" column="city" type="string"/>
</class>
</hibernate-mapping>
4.代码控制:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();//读取配置信息
/*
//实体信息,例如:
Student student = new Student();
student.setStuNo("5");
student.setStuName("lisi");
student.setSex("M");
*/
Session session = SessionFactory.openSession(); //获得链接对象,与此同时设置事务提交方式为手动提交
Transaction tx = (Transaction)session.beginTransaction();//声明事务开始边界
session.save(student); //将student对象持久化
//释放占用空间
tx.commit(); //手动提交事务,永久保存
session.close(); //Session的缓存被清空,缓存中的所有持久化对象都变为托管对象
sessionFactory.close();
二、总结
1.ORM(Object Relation Mapping):对象关系映射。它的实现思想就是将关系型数据库中的表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化成对这些对象的操作。ORM负责生成SQL,你只需要关心对象就好。因此,它的目的是方便开发人员以面向对象的思想来实现对数据库的操作。【作用:简化了数据库的查询过程,使用ORM查询工具,用户可以访问期望数据,而不必理解数据库的底层结构!】
2.Hibernate核心接口以及运行过程如下顺序:
(1)Configuration:应用程序先调用Configuration类,读取默认路径下的Hibernate配置文件(hibernate.cfg.xml)以及映射文件(.hbm.xml)中的信息。
(2)SessionFactory:使用这些信息生成一个SessionFactory对象
(3)Session(缓存):然后从SessionFactory对象生成一个Session对象
(4)Transaction:并用Session对象生成Transaction对象
- 可通过Session对象的get()、load()、save()、update()、delete()和saveOrUpdate()等方法对PO经行加载、保存、更新、删除等操作;
- 在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将这些对象提交到数据库中。
(5)Query
【注意:所有框架的实现都基于两部分:xml配置文件+接口实现】
3..hbm.xml配置文件解析:
首先在数据库中建立一个表,然后再程序中建立一个实体类。他们怎么对应起来的呢?运行程序后首先会读取hibernate.cfg.xml配置文件信息,指定链接的数据库以及加载所有实体类和数据库表的配置文件。在.hbm.xml的配置文件中,通过class属性指定实体类的名字和路径,table和catalog属性指定对应的是哪个数据库中的哪个表,另外还指定了实体类属性和数据库表列名的对应关系,通过这些配置就将两个毫无联系的实体类和数据库表给一一对应了起来!
4.与JDBC链接数据库和查询数据库的操作有什么区别:
JDBC链接数据库每次都需要写代码语句,Hibernate通过hibernate.cfg.xml配置文件进行连接;JDBC查询后的结果需要一一赋值给对象,而Hibernate通过.hbm.xml配置文件直接将实体类对象属性和数据库表数据相关联,不需要写sql语句,面向对象编程。
5.Hibernate对象的三种状态:
- 瞬时状态:用new语句创建的一个对象,还没有被持久化,不处于session缓存中,在数据库中没有对应的记录【因为不和Session关联,所以Hibernate不会保证它们的属性变化与数据库保存同步!】
- 持久化状态:已经被持久化,并且加入到了Session的缓存中的状态。【因为和Session实例关联,所以它们的属性变化会引起对应数据库中数据的同步变化】
- 托管状态:已经被持久化,但是不在处于Session缓存中的状态。由于是从持久化对象转变过来的,可能数据库中还存在对应的记录【因为不和Session关联了,所以Hibernate不会保证它们的属性变化与数据库保存同步!】
6.在实际应用中,防止出现重复执行sql语句以及可能引起的并发问题,所以应该避免一个java对象同时被多个Session实例关联!
7.Hibernate事务的概念:
数据库事务是指由一个或多个SQL语句组成的工作单元,事务不能破环关系数据的完整性和业务逻辑的一致性,例如:转账操作,应保证事务结束后两个账户的存款总额不变!
- 事务自动提交模式:每个sql语句都是一个独立的事务,数据库执行完一条sql语句后会自动提交事务
- 事务手动提交模式:Hibernate在没有设置事务自动提交的情况下,默认为手动提交方式。所以必须在sql语句前后添加事务的开始和提交事务语句,然后sql语句才会对数据库产生效果!
8.在手动添加配置文件的时候需要注意:在表和实例类对应的.hbm,xml配置文件中,实体类的属性名字和表的列名不区分大小写!但是一般情况下配置文件都是自动生成的,所以和类的属性名字表的列名是一一对应。
9.处于持久化状态的对象,在事务没有提交之前,它们的属性变化会自动引起对应数据库中数据的同步变化,不需要再次写例如session.save(student)之类的代码。