一简介
1 什么是Hibernatel框架?
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装.简单来说就是基于持久层的框架
2 .那么什么又是对象的持久化呢?
3.ORM和Hibernate概念
ORM:Object Realation Mapping对象关系映射。
ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
ORM解决什么问题?
存储:能否把对象的数据直接保存到数据库
获取:能够直接从数据库拿到一个对象 Hibernate与ORM的关系? Hibernate是ORM的实现!
Hibernate: 一个开源大代码的对象关系映射框架 对JDBC进行了非常轻量级的对象封装 对JavaBean对象和数据库的表建立对应关系
二Hibernate的第一个案例
1 .准备 Hibernate 环境
导入 Hibernate 必须的 jar 包:
2.写对象的实体类和映射
<?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 package="com.eduask.chp.bean">
<class name="User" table="userinfo">
<!-- 主键 ,映射-->
<id name="userID" column="userID">
<!-- <generator class="native"/> -->
</id>
<!-- 非主键,映射 -->
<property name="loginName" column="loginName"></property>
<property name="loginPass" column="loginPass"></property>
</class>
<?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 package="com.eduask.chp.bean">
<class name="User" table="userinfo">
<!-- 主键 ,映射-->
<id name="userID" column="userID">
<!-- <generator class="native"/> -->
</id>
<!-- 非主键,映射 -->
<property name="loginName" column="loginName"></property>
<property name="loginPass" column="loginPass"></property>
</class>
3.写hibernatel.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/user</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="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- DB schema will be updated if needed -->
<property name="hibernate.show_sql">true </property> //显示sql语句
<property name="hibernate.format_sql">true </property>//是否将 SQL 转化为格式良好的 SQL
<property name="hbm2ddl.auto">create</property>
<!--加载所有映射-->
<mapping resource="user.hbm.xml"/>
</session-factory>
</hibernate-configuration>
hbm2ddl.auto:该属性可帮助程序员实现正向工程, 即由 java 代码生成数据库脚本, 进而生成具体的表结构. 。取值 create | update | create-drop | validate
create : 会根据 .hbm.xml 文件来生成数据表, 但是每次运行都会删除上一次的表 ,重新生成表, 哪怕二次没有任何改变
create-drop : 会根据 .hbm.xml 文件生成表,但是SessionFactory一关闭, 表就自动删除
update : 最常用的属性值,也会根据 .hbm.xml 文件生成表, 但若 .hbm.xml 文件和数据库中对应的数据表的表结构不同, Hiberante 将更新数据表结构,但不会删除已有的行和列
validate : 会和数据库中的表进行比较, 若 .hbm.xml 文件中的列在数据表中不存在,则抛出异常
create : 会根据 .hbm.xml 文件来生成数据表, 但是每次运行都会删除上一次的表 ,重新生成表, 哪怕二次没有任何改变
create-drop : 会根据 .hbm.xml 文件生成表,但是SessionFactory一关闭, 表就自动删除
update : 最常用的属性值,也会根据 .hbm.xml 文件生成表, 但若 .hbm.xml 文件和数据库中对应的数据表的表结构不同, Hiberante 将更新数据表结构,但不会删除已有的行和列
validate : 会和数据库中的表进行比较, 若 .hbm.xml 文件中的列在数据表中不存在,则抛出异常
4测试使用结果
public class Test {
public static void main(String[] args) {
Configuration cfg=new Configuration().configure("hibernatel.cfg.xml");
//SessionFactory factory=cfg.buildSessionFactory();//注意这个虽然能使用但是已经过时了,目前用的是这样
public static void main(String[] args) {
Configuration cfg=new Configuration().configure("hibernatel.cfg.xml");
//SessionFactory factory=cfg.buildSessionFactory();//注意这个虽然能使用但是已经过时了,目前用的是这样
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory factory=cfg.buildSessionFactory(serviceRegistry);
Session session=factory.openSession();
User u=(User) session.get(User.class, 1);
User u=(User) session.get(User.class, 1);
System.out.println(u);//获得第一个用户
Transaction ts=session.beginTransaction();
session.update(new User(1,"刘德华","ldh"));//修改
User u=(User) session.get(User.class, 1);
session.delete(u);//删除
session.save(new User(1,"张学友","zxy"));//添加
ts.commit();
session.close();
factory.close();//如果出现连接超时错误,请重启数据库
}
}
Transaction ts=session.beginTransaction();
session.update(new User(1,"刘德华","ldh"));//修改
User u=(User) session.get(User.class, 1);
session.delete(u);//删除
session.save(new User(1,"张学友","zxy"));//添加
ts.commit();
session.close();
factory.close();//如果出现连接超时错误,请重启数据库
}
}
分析测试结果:
1.Configuration接口
Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
2.Transaction(事务)
代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
Transaction tx = session.beginTransaction();
常用方法:
commit():提交相关联的session实例
rollback():撤销事务操作
wasCommitted():检查事务是否提交
Transaction tx = session.beginTransaction();
常用方法:
commit():提交相关联的session实例
rollback():撤销事务操作
wasCommitted():检查事务是否提交
3.Session 接口
持久化类与 Session 关联起来后就具有了持久化的能力。
Session 类的方法:
取得持久化对象的方法: get() load()
持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()
开启事务: beginTransaction().
管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等
Session 类的方法:
取得持久化对象的方法: get() load()
持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()
开启事务: beginTransaction().
管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等