Download presentation
Presentation is loading. Please wait.
1
第六章 Hibernate 入门
2
本门课程目标 学完本门课程后,你能够: 使用Hibernate实现数据持久化 在项目中熟练使用Hibernate
掌握HQL查询 掌握Criteria查询
3
相关课程回顾 JDBC实现数据库访问的步骤 通过JDBC 提供的API 对数据库进行增、删、改、查的操作 通过JDBC 对数据库操作中异常的处理
4
本章任务 编写Hibernate的配置文件 使用Hibernate实现用户的登录和注册 使用Hibernate完成数据增删改操作
5
本章目标 理解持久化的概念 理解ORM的概念 了解Hibernate的基本原理 学会编写实体映射文件 学会使用Hibernate完成数据增删改操作 学会在项目中使用Hibernate
6
使用Statement对象对数据库进行操作 关闭Connection 对象和Statement 对象
List users = new ArrayList(); User user ; try { Connection conn = DBUtil.getConnection(); Statement statement = conn.createStatement(); ResultSet resultSet = statement.executeQuery("select * from users "); while(resultSet.next()){ user = new User(); user.setId(resultSet.getInt(1)); //省略其他赋值方法 ... users.add(User); } statement.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); JDBC操作数据库的步骤 获得数据库连接 通过Class.forName 注册驱动,通过DriverManager.getConnection 获得数据库连接 通过获得的Connection 对象生成Statement 对象 使用Statement 对象对数据库进行增、删、改、查的操作 关闭Connection 对象和Statement 对象 在整个操作过程中,需要对SQLException 进行捕获和处理 创建Statement对象 使用Statement对象对数据库进行操作 关闭Connection 对象和Statement 对象 处理异常
7
能否使用对象将POJO作为参数,简单的完成增删改查操作?
JDBC的缺点 开发效率低 代码冗余 pstmt的setXX方法 方法参数冗余的getXX方法 如果POJO的属性很多,代码增加 重复性工作多 能否使用对象将POJO作为参数,简单的完成增删改查操作?
8
Hibernate简介 Hibernate作者——Gavin King Hibernate创始人
《 Hibernate in action 》作者 EJB 3.0的Entity bean specification的实际领导人(sun任命的领导人是Linda DeMichiel) 参加了XDoclet和Middlegen的开发 2003年9月加入JBoss,全职进行Hibernate开发 Hibernate 一个开发源代码的对象关系映射框架 对JDBC进行了非常轻量级的对象封装 将JavaBean对象和数据库的表建立对应关系
9
Hibernate优势 Hibernate 是一个优秀的Java 持久化层解决方案 是当今主流的对象—关系映射工具
Hibernate 简化了JDBC 繁琐的编码 Hibernate 将数据库的连接信息都存放在配置文件中 Session session = HiberanteUtil.getSession(); Query query = session.createQuery("from User"); List<User> users =(List<User>)query.list();
10
Hibernate配置文件 hibernate.cfg.xml文件 映射文件的配置(*.hbm.xml)
<hibernate-mapping> <class name="cn.iss.bean.User" table="users" schema="jbit"> <id name="id" type="java.lang.Long"> <column name="id" /> <generator class="native" /> </id> <property name="password" type="java.lang.String" lazy="false"> <column name="password" length="50" not-null="true" /> </property> <property name="telephone" type="java.lang.String" lazy="false"> <column name="telephone" length="12" /> <property name="username" type="java.lang.String" lazy="false"> <column name="username" length="50" /> </class> </hibernate-mapping> User.hbm.xml文件 hibernate.cfg.xml文件 映射文件的配置(*.hbm.xml) hibernate.cfg.xml文件 <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <property name="connection.url"> <property name="connection.username">jbit</property> <property name="connection.password">bdqn</property> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver 使用的不同数据库类型 数据库URL 数据库用户名 数据库密码 数据库驱动
11
持久化与ORM3-1 持久化 将程序中数据在瞬时状态和持久状态间转换的机制
12
持久化与ORM3-2 持久化层 JDBC 就是一种持久化机制 将程序数据直接保存成文本文件也是持久化机制的一种实现
在分层结构中,DAO 层(数据访问层)也被称为持久化层 持久化完成的操作 将对象保存到关系型数据库中 将关系型数据库中的数据读取出来 以对象的形式封装
13
持久化与ORM3-3 ORM(Object Relational Mapping,对象关系映射) 编写程序的时候,以面向对象的方式处理数据
保存数据的时候,却以关系型数据库的方式存储 ORM解决方案包含下面四个部分 在持久化对象上执行基本增、删、改、查操作的API 用于对持久化对象或属性查询的一种语言或者API 用于实体关系映射的工具 能够与事务对象交互、执行检查、延迟加载以及其他优化功能
14
准备Hibernate3-1 下载需要的jar包 下载Hibernate Hibernate包目录结构 部署jar包
Hibernate 的官方主页是 推荐下载hibernate-distribution GA-dist.zip Hibernate包目录结构 部署jar包 hibernate3.jar required 目录下的jar 包 Oracle 数据库驱动jar包
15
准备Hibernate3-2 创建Hibernate配置文件 用于配置数据库连接 运行时所需的各种属性
默认文件名为“hibernate.cfg.xml” <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <property name="connection.url"> <property name="connection.username">iss</property> <property name="connection.password">isoftstone</property> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver
16
准备Hibernate3-3 创建实体类和实体映射文件
<hibernate-mapping> <class name="cn.iss.houserent.bean.User" table="users"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="sequence" > <param name="sequence">SEQ_ID</param> </generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="50" not-null="true" /> </property> <property name="password" type="java.lang.String"> <column name="password" length="50" not-null="true" /> <!--省略其他配置--> </class> </hibernate-mapping> 创建实体类和实体映射文件 定义实体类(也称持久化类),实现java.io.Serializable 接口,添加默认构造方法 配置映射文件(*.hbm.xml) 向hibernate.cfg.xml文件中配置映射文件 public class User implements java.io.Serializable { //字段 private Integer id; private String name; private String password; private String telephone; private String username; private String isadmin; public User(){ } //省略getter&setter 方法 <session-factory> <!--省略其他配置--> <!--注意配置文件名必须包含其相对于classpath 的全路径--> <mapping resource="cn/iss/houserent/entity/User.hbm.xml" /> </session-factory> class元素:定义一个实体类的映射信息。 常用属性如下。 name表示对象实体类的全限定名。 table表示对应的数据库表名。 id元素:定义该属性到数据库表主键字段的映射。 name表示实体类属性的名字。 type表示实体类属性的类型。 column 表示数据库表字段的名字,也可在子元素column中指定。 generator 元素:id元素的子元素用于指定主键的生成策略。 常用属性及子元素如下。 class用来指定具体主键生成策略。 param元素用来传递参数。 常用主键的生成策略如下 increment:对类型为long、short 或int 的主键,以自动增长的方式生成主键的值。主键按数值顺序递增,增量为1。 identity:对如SQL Server、DB2、MySQL等支持标识列的数据库,可使用该主键生成策略生成自动增长主键,但要在数据库中将该主键设置为标识列。 sequence:对如Oracle、DB2等支持序列的数据库,可使用该主键生成策略生成自动增长主键,通过子元素param传入数据库中序列的名称。 native:由Hibernate 根据底层数据库自行判断采用何种主键生成策略,意思是由使用的数据库生成主键的值。 assigned:主键由应用程序负责生成,无需Hibernate参与。 property 元素:定义实体类中属性和数据库中表的字段的对应关系。 column 元素:用于指定其父元素代表的实体类属性所对应的数据库表中的字段。 name表示字段的名字。 length表示字段长度。 not-null设定是否可以为null,值为true 表示不能为null。
17
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
18
使用Hibernate 操作数据库 使用Hibernate操作数据库需要七个步骤 (1)读取并解析配置文件
(2)读取并解析映射信息,创建SessionFactory (3)打开Session (4)开始一个事务(增删改操作必须,查询操作可选) Configuration conf = newConfiguration().configure(); SessionFactory sf = conf.buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction();
19
演示示例:使用Hibernate 操作数据库的步骤
(5)数据库操作 (6)提交事务(回滚事务) (7)关闭session session.save(user);//或其它操作 tx.commit();(tx.rollback();) session.close(); 如果Hibernate 配置文件中,current_session_context_class 参数设置为thread 并采用SessionFactory 的getCurrentSession()方法获的Session 实例则不需要此步 演示示例:使用Hibernate 操作数据库的步骤
20
使用Hibernate实现增加用户 Configuration conf = null;
SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { conf = new Configuration().configure(); sessionFactory = conf.buildSessionFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); session.save(user); tx.commit(); } catch (HibernateException e) { tx.rollback(); e.printStackTrace(); } finally{ session.close(); sessionFactory.close(); } 1.读取配置文件 2.创建SessionFactory 3.打开session 4.开始一个事务 5.持久化操作 6.提交事务 6.回滚事务 7.关闭session
21
使用Hibernate实现用户的修改、删除
Configuration conf = null; SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { conf = new Configuration().configure(); sessionFactory = conf.buildSessionFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); session.update(user); tx.commit(); } catch (HibernateException e) { tx.rollback(); e.printStackTrace(); } finally{ session.close(); sessionFactory.close(); } Configuration conf = null; SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { conf = new Configuration().configure(); sessionFactory = conf.buildSessionFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); session.delete(user); tx.commit(); } catch (HibernateException e) { tx.rollback(); e.printStackTrace(); } finally{ session.close(); sessionFactory.close(); } 删除用户 修改用户 删除用户信息 修改用户信息 增、删、改操作一定要在事务环境中完成 修改、删除数据时,需要先加载数据
22
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
23
演示示例:使用Hibernate 查询数据
Configuration conf = null; SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { conf = new Configuration().configure(); sessionFactory = conf.buildSessionFactory(); session = sessionFactory.openSession(); session.load(User.class,1002); } catch (HibernateException e) { e.printStackTrace(); } finally{ session.close(); sessionFactory.close(); } Configuration conf = null; SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { conf = new Configuration().configure(); sessionFactory = conf.buildSessionFactory(); session = sessionFactory.openSession(); session.get(User.class,1001); } catch (HibernateException e) { e.printStackTrace(); } finally{ session.close(); sessionFactory.close(); } Session提供了两种方法加载数据 Object get(Class clazz, Serializable id):通过实体类Class对象和ID 加载数据 Object load(Class theClass, Serializable id):通过实体类Class对象和ID加载数据 两种方法加载数据的区别 使用get 方法加载数据时,如果数据不存在,返回null对象 使用load 方法加载数据时,如果数据不存在,系统就会抛出异常 使用load方式加载数据 使用get方式加载数据 演示示例:使用Hibernate 查询数据
24
Hibernate中实体对象的三种状态 实体对象的生命周期是Hibernate 应用中的一个关键概念 实体对象的三种状态
瞬时状态(Transient) 刚用new语句创建,还没有被持久化,且不处于Session的缓存中 持久状态(Persistent) 已经被持久化,且加入到Session的缓存中 游离状态(Detached) 已经被持久化,但不再处于Session的缓存中
25
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
26
总结 JDBC的缺点? 为项目添加Hibernate的准备工作? Hibernate操作数据库的步骤? 实体对象的三种状态?
Similar presentations