第六章 Hibernate 入门
本门课程目标 学完本门课程后,你能够: 使用Hibernate实现数据持久化 在项目中熟练使用Hibernate 掌握HQL查询 掌握Criteria查询
相关课程回顾 JDBC实现数据库访问的步骤 通过JDBC 提供的API 对数据库进行增、删、改、查的操作 通过JDBC 对数据库操作中异常的处理
本章任务 编写Hibernate的配置文件 使用Hibernate实现用户的登录和注册 使用Hibernate完成数据增删改操作
本章目标 理解持久化的概念 理解ORM的概念 了解Hibernate的基本原理 学会编写实体映射文件 学会使用Hibernate完成数据增删改操作 学会在项目中使用Hibernate
使用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 对象 处理异常
能否使用对象将POJO作为参数,简单的完成增删改查操作? JDBC的缺点 开发效率低 代码冗余 pstmt的setXX方法 方法参数冗余的getXX方法 如果POJO的属性很多,代码增加 重复性工作多 能否使用对象将POJO作为参数,简单的完成增删改查操作?
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对象和数据库的表建立对应关系
Hibernate优势 Hibernate 是一个优秀的Java 持久化层解决方案 是当今主流的对象—关系映射工具 Hibernate 简化了JDBC 繁琐的编码 Hibernate 将数据库的连接信息都存放在配置文件中 Session session = HiberanteUtil.getSession(); Query query = session.createQuery("from User"); List<User> users =(List<User>)query.list();
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"> jdbc:oracle:thin:@10.0.0.188:1521:ORCL <property name="connection.username">jbit</property> <property name="connection.password">bdqn</property> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver 使用的不同数据库类型 数据库URL 数据库用户名 数据库密码 数据库驱动
持久化与ORM3-1 持久化 将程序中数据在瞬时状态和持久状态间转换的机制
持久化与ORM3-2 持久化层 JDBC 就是一种持久化机制 将程序数据直接保存成文本文件也是持久化机制的一种实现 在分层结构中,DAO 层(数据访问层)也被称为持久化层 持久化完成的操作 将对象保存到关系型数据库中 将关系型数据库中的数据读取出来 以对象的形式封装
持久化与ORM3-3 ORM(Object Relational Mapping,对象关系映射) 编写程序的时候,以面向对象的方式处理数据 保存数据的时候,却以关系型数据库的方式存储 ORM解决方案包含下面四个部分 在持久化对象上执行基本增、删、改、查操作的API 用于对持久化对象或属性查询的一种语言或者API 用于实体关系映射的工具 能够与事务对象交互、执行检查、延迟加载以及其他优化功能
准备Hibernate3-1 下载需要的jar包 下载Hibernate Hibernate包目录结构 部署jar包 Hibernate 的官方主页是www.hibernate.org 推荐下载hibernate-distribution-3.3.2.GA-dist.zip Hibernate包目录结构 部署jar包 hibernate3.jar required 目录下的jar 包 Oracle 数据库驱动jar包
准备Hibernate3-2 创建Hibernate配置文件 用于配置数据库连接 运行时所需的各种属性 默认文件名为“hibernate.cfg.xml” <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <property name="connection.url"> jdbc:oracle:thin:@10.0.0.188:1521:ORCL <property name="connection.username">iss</property> <property name="connection.password">isoftstone</property> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver
准备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。
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
使用Hibernate 操作数据库 使用Hibernate操作数据库需要七个步骤 (1)读取并解析配置文件 (2)读取并解析映射信息,创建SessionFactory (3)打开Session (4)开始一个事务(增删改操作必须,查询操作可选) Configuration conf = newConfiguration().configure(); SessionFactory sf = conf.buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction();
演示示例:使用Hibernate 操作数据库的步骤 (5)数据库操作 (6)提交事务(回滚事务) (7)关闭session session.save(user);//或其它操作 tx.commit();(tx.rollback();) session.close(); 如果Hibernate 配置文件中,current_session_context_class 参数设置为thread 并采用SessionFactory 的getCurrentSession()方法获的Session 实例则不需要此步 演示示例:使用Hibernate 操作数据库的步骤
使用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
使用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(); } 删除用户 修改用户 删除用户信息 修改用户信息 增、删、改操作一定要在事务环境中完成 修改、删除数据时,需要先加载数据
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
演示示例:使用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 查询数据
Hibernate中实体对象的三种状态 实体对象的生命周期是Hibernate 应用中的一个关键概念 实体对象的三种状态 瞬时状态(Transient) 刚用new语句创建,还没有被持久化,且不处于Session的缓存中 持久状态(Persistent) 已经被持久化,且加入到Session的缓存中 游离状态(Detached) 已经被持久化,但不再处于Session的缓存中
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
总结 JDBC的缺点? 为项目添加Hibernate的准备工作? Hibernate操作数据库的步骤? 实体对象的三种状态?