第七章初识 Hibernate 样题 B 卷 一 填空题 ( 每小题 2 分, 共 20 分 ) 1 Hibernate 是一个开放源代码的 框架 2 Hibernate 是用 的编程思想来操作数据库的 3 ORM 就是利用描述 之间映射的元数据, 自动把 Java 应用程序中的对象, 持久化到关系型数据库的表中 4 目前企业主流使用的 Hibernate 版本是 5 Configuration 实例主要用于启动 加载 管理 Hibernate 的 信息 6 Session 是应用程序与数据库之间交互操作的一个 对象 7 SessionFactory 接口负责 Hibernate 的初始化和建立 8 Transaction 接口主要用于, 它是 Hibernate 的数据库事务接口 9 session.createquery() 方法接收的参数是 语句 10 Criteria 是一个完全面向对象, 又被称为 查询, 是 Hibernate 的另一种对象检 索方式 二 选择题 ( 每小题 2 分, 共 20 分 ) 1 以下选项中不属于 Session 的方法是 ( ) A get() B save() C commit() D createcriteria() 2 下面选项中, 说法正确的是 ( ) A Hibernate 是面向对象的编程思想来操作数据库 B Hibernate 是面向表的编程思想来操作数据库 C Hibernate 是面向过程的编程思想来操作数据库 D Hibernate 是面向字段的编程思想来操作数据库 3 下列选项中, 关于 Hibernate 优势的描述, 错误的是 ( ) A Hibernate 对 JDBC 访问数据库的代码做了重量级封装 B Hibernate 应用了 Java 的反射机制 C 使用者可以对 Hibernate 的功能进行扩展 D Hibernate 支持很多的关系型数据库 4 下列选项中, 不属于 Hibernate 目录结构下的是 ( ) A documentation B src C lib D project 5 下面选项中, 不属于 Hibernate 核心接口的是 ( ) A Transaction B Query C Configuration D Servlet 6 下面选项中, 能够正确获取 Session 对象的方式是 ( ) A sessionfactory.opensession() B sessionfactory.createsession() C sessionfactory.getsession() D sessionfactory.session()
7 以下关于 SessionFactory 的说法正确的是 ( ) A 对于每个数据库事务, 应该创建一个 SessionFactory 对象 B 一个 SessionFactory 对象对应多个数据库存储源 C SessionFactory 是重量级的对象, 不应该随意创建 如果系统中只有一个数据库存 储源, 只需要创建一个 D SessionFactory 的 load() 方法用于加载持久化对象 8 以下程序的打印结果是什么?( ) session = sessionfactory.opensession(); Employee c1=(employee)session.load(employee.class,1); Employee c2=(employee)session.load(employee.class,1); System.out.println(c1==c2); A 运行出错, 抛出异常 B 打印 false C 打印 true D 运行通过, 但什么都不显示 9 以下哪个选项不是关系数据模型与对象模型之间的匹配关系 :( ) A 表对应类 B 记录对应对象 C 表的字段对应类的属性 D 表之间的参考关系对应类之间的依赖关系 10 下面关于 hibernate 核心接口的描述, 错误的是 ( ) A Configuration 接口 : 配置 Hibernate, 根据其启动 hibernate, 创建 SessionFactory 对象 B SessionFactory 接口 : 负责保存 更新 删除 加载和查询对象, 是线程不安全 的, 避免多个线程共享同一个 session, 是轻量级 一级缓存 C Query 和 Criteria 接口 : 执行数据库的查询 D Transaction 接口 : 管理事务 三 判断题 ( 每题 2 分, 共 10 分 ) 1 使用 Hibernate 框架对数据库的所有操作都必须手动开启事务 () 2 Hibernate 框架只能用于 JavaWeb 的项目开发 () 3 ORM 就是利用描述对象和数据库表之间映射的元数据, 手动把 Java 应用程序中的对象, 持久化到关系型数据库的表中 () 4 Hibernate 对 JDBC 访问数据库的代码做了重量级封装 () 5 SessionFactory 是线程安全的, 它的同一个实例能够供多个线程共享 () 四 简答题 ( 每题 5 分, 共 20 分 ) 1 Hibernate 框架的概述 2 简述 Hibernate 框架的优势 3 简述 Hibernate 持久化操作的主要步骤 4 Session 对象的 get() 和 load() 方法的区别 五 操作题 ( 每题 10 分, 共 30 分 )
hibernate 数据库中已创建 employee 表 : CREATE TABLE employee ( id INT(11) NOT NULL AUTO_INCREMENT COMMENT ' 主键 id', name VARCHAR(20) DEFAULT NULL COMMENT ' 姓名 ', age INT(11) DEFAULT NULL COMMENT ' 年龄 ', sex VARCHAR(2) DEFAULT NULL COMMENT ' 性别 ', city VARCHAR(20) DEFAULT NULL COMMENT ' 城市 ', PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8; 1 使用 Hibernate 加载指定配置文件 (hibernate.cfg.xml), 读取数据库表 employee 中的数据, 并遍历打印 2 使用 Hibernate 对 employee 表进行增删改操作 要求如下 : 1) 添加一条 name= tom,age=26,city= 北京 的员工数据 2) 修改 id 为 1 的员工,name= joe,sex= 男 3) 删除 id=1 的员工 3 使用 Criteria 对象, 查询 employee 表 要求如下 : 1) 通过 sql 语句直接插入 2 条员工数据 (name= tom,age=34 和 name= joe,city= 西安 ) 2) 使用 uniqueresult() 方法查询 id=2 的员工数据 3) 使用 Restrictions.eq() 方法获取 name= tom 的员工数据
答案 一 填空题 1 ORM 或对象关系映射 2 面向对象 3 对象和数据库表 4 Hibernate3.x 5 配置文件 6 单线程 7 Session 对象 8 管理事务 9 HQL 10 QBC 二 选择题 1.C 2.A 3.A 4.B 5.D 6.A 7.C 8.C 9.D 10.B 三 判断题 1.N 2.N 3.N 4.N 5.Y 四 简答题 ------------------- 第 1 题 ------------------- 1.Hibernate 框架的概述 Hibernate 是一个开放源代码的 ORM(Object Relational Mapping, 对象关系映射 ) 框架, 它对 JDBC 进行了轻量级的对象封装, 使得 Java 开发人员可以使用面向对象的编程思想来操作数据库 ------------------- 第 2 题 ------------------- 2. 简述 Hibernate 框架的优势 与其它操作数据库的技术相比,Hibernate 具有以下几点优势 : Hibernate 对 JDBC 访问数据库的代码做了轻量级封装, 大大简化了数据访问层繁琐的重复性代码, 并且减少了内存消耗, 加快了运行效率 Hibernate 是一个基于 JDBC 的主流持久化框架, 是一个优秀的 ORM 实现, 它很大程度的简化了 DAO(Data Access Object, 数据访问对象 ) 层编码工作 Hibernate 使用 Java 的反射机制, 而不是使用字节码增强程序类并实现透明性 Hibernate 的性能非常好, 映射的灵活性很出色 它支持很多关系型数据库, 从一对一到多对多的各种复杂关系 可扩展性强, 由于源代码的开源以及 API 的开放, 当本身功能不够用时, 可以自行编码进行扩展 ------------------- 第 3 题 ------------------- 3. 简述 Hibernate 持久化操作的主要步骤 (1) 初始化 Hibernate, 构建 Configuration 实例 这一步用来读取 Hibernate 核心配置文件和映射文件信息到 Configuration 对象中
(2) 创建 SessionFactory 实例 通过 Configuration 对象读取到的配置文件信息并创建 SessionFactory, 并将 Configuration 对象中的所有配置文件信息存入 SessionFactory 内存中 (3) 创建 Session 实例, 建立数据库连接 Session 是通过 SessionFactory 打开, 创建一个 Session 对象就相当于建立一个新的数据库连接 (4) 创建 Transaction 实例, 开启一个事务 Transaction 用于事务管理, 一个 Transaction 对象对应的事务可以包含多个操作 在使用 Hibernate 进行增 删 改操作的时候, 必须先创建 Transaction 对象 (5) 利用 Session 接口通过的各种方法进行持久化操作 (6) 提交事务 对实体对象持久化操作后, 必须提交事务 (7) 关闭 Session, 断开与数据库连接 ------------------- 第 4 题 ------------------- 4. Session 对象 get() 和 load() 方法的区别 两者的区别是使用 get() 方法加载数据时, 如果指定的记录不存在, 则返回 null, 而使用 load() 方法加载数据时, 如果指定记录不存在, 则会报出 ObjectNotfountException 异常, 这一异常说明使用 load() 方法加载数据时, 要求记录必须存在 五 操作题 ------------------- 第 1 题 ------------------- 1 使用 Hibernate 加载制定配置文件 (hibernate.cfg.xml), 读取数据库表 employee, 并遍历打印 (1) 创建一个 java 项目 (2) 在 src 目录下创建 hibernate.cfg.xml 文件, 代码如下 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- JDBC 基本连接参数 --> <session-factory> <!-- 理解为连接池 --> name="hibernate.connection.driver_class">com.mysql.jdbc.driver</property> name="hibernate.connection.url">jdbc:mysql:///hibernate</property> name="hibernate.connection.username">root</property> name="hibernate.connection.password">root</property> <!-- 配置方言 --> name="hibernate.dialect">org.hibernate.dialect.mysqldialect</property> <!-- 常见其它配置 --> name="hibernate.show_sql">true</property> <!-- 控制台上打印 SQL --> name="hibernate.format_sql">true</property> <!-- 控制台输出时, 对 SQL 语句格式化 -->
<!-- 加载映射文件 --> <mapping resource="cn/itcast/domain/employee.hbm.xml"/> </session-factory> </hibernate-configuration> (3) 在 cn.itcast.domain 包下创建 Employee 实体类, 代码如下 package cn.itcast.domain; public class Employee { private Integer id; private String name; private Integer age; private String sex; private String city; public Integer getid() { return id; public void setid(integer id) { this.id = id; public String getname() { return name; public void setname(string name) { this.name = name; //... 由于篇幅问题, 省略部分的 getter 和 setter 方法 @Override public String tostring() { return "Employee [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", city=" + city + "]"; (4) 在 cn.itcast.domain 包下创建映射文件 Employee.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> <class name="cn.itcast.domain.employee" table="employee" catalog="hibernate"> <id name="id"> <generator class="native"></generator> </id> <!-- 其它属性使用 property 标签来映射 --> name="name" column="name" type="string" /> name="age" column="age" type="integer" />
name="sex" column="sex" type="string"/> name="city" column="city" type="string"/> </class> </hibernate-mapping> (5) 在 src 目录下创建包名为 cn..itcast.test, 并在该包下编写 java 程序查询数据表 employee, 并遍历输出, 代码如下 package cn.itcast.test; import java.util.list; import org.hibernate.query; import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; import org.junit.test; import cn.itcast.domain.employee; public class Test1 { public void test1(){ Configuration cfgt = new Configuration(); Configuration cfg = cfgt.configure(); //query 对象 HQL 方式查询 Query query = session.createquery("from Employee"); List<Employee> list = query.list(); // 遍历输出 for(employee e:list){ System.out.println(e); ------------------- 第 2 题 ------------------- 2 使用 Hibernate 对 employee 表进行增删改查 (1) 在 src 目录下编写 hibernate.cfg.xml 配置文件, 代码如下 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- JDBC 基本连接参数 --> <session-factory> <!-- 理解为连接池 -->
name="hibernate.connection.driver_class">com.mysql.jdbc.driver</property> <! 设置链接数据库编码为 utf8 --> name="hibernate.connection.url">jdbc:mysql:///hibernate?characterencoding=utf8 </property> name="hibernate.connection.username">root</property> name="hibernate.connection.password">root</property> <!-- 配置方言 --> name="hibernate.dialect">org.hibernate.dialect.mysqldialect</property> <!-- 常见其它配置 --> name="hibernate.show_sql">true</property> <!-- 控制台上打印 SQL --> name="hibernate.format_sql">true</property> <!-- 控制台输出时, 对 SQL 语句格式化 --> <!-- 在核心配置文件中引用 mapping 映射文件 --> <mapping resource="cn/itcast/domain/employee.hbm.xml"/> </session-factory> </hibernate-configuration> (2) 使用第一题中已存在的 Employee.java 文件和 Employee.hbm.xml 映射文件 (3) 在 cn..itcast.test 包下编写 java 程序实现增删改操作, 代码如下 package cn.itcast.test; import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.transaction; import org.hibernate.cfg.configuration; import org.junit.test; import cn.itcast.domain.employee; public class Test2 { // 添加一条 name= tom,age=26,city= 北京 的员工数据 public void test21(){ Configuration cfg = new Configuration().configure(); // 手动开启事务 Transaction transaction = session.begintransaction(); // 创建实例对象 Employee e = new Employee(); e.setname("tom"); e.setage(26); e.setcity(" 北京 ");
// 保存并提交 session.save(e); transaction.commit(); // 关闭缓存 sessionfactory.close(); // 修改 id 为 1 的员工,name= joe,sex= 男 public void test22(){ Configuration cfg = new Configuration().configure(); // 手动开启事务 Transaction transaction = session.begintransaction(); // 获取 id 为 1 的员工对象 Employee e = (Employee) session.get(employee.class,1); e.setname("joe"); e.setsex(" 男 "); session.update(e); transaction.commit(); // 关闭缓存 sessionfactory.close(); // 删除 id=1 的员工 public void test23(){ Configuration cfg = new Configuration().configure(); // 手动开启事务 Transaction transaction = session.begintransaction(); // 获取 id 为 1 的员工对象 Employee e = (Employee) session.get(employee.class,1); // 删除 session.delete(e); transaction.commit(); // 关闭缓存 sessionfactory.close();
------------------- 第 3 题 ------------------- 3 使用 Criteria 对象, 查询 employee 表 (1) 使用第 2 题中的 hibernate.cfg.xml Employee.java Employee.hbm.xml 文件 (2) 执行以下 sql 语句直接插入两条员工数据 (name= tom,age=34 和 name= joe,city= 西安 ), sql 语句如下 insert into employee (name,age) values('tom',34); insert into employee (name,city) values('joe',' 西安 '); (3) 使用 uniqueresult() 方法查询 id=2 的员工数据, 代码如下 package cn.itcast.test; import org.hibernate.criteria; import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; import org.hibernate.criterion.criterion; import org.hibernate.criterion.restrictions; import org.junit.test; import cn.itcast.domain.employee; public class Test3 { // 使用 uniqueresult() 方法查询 id=2 的员工数据 public void test31(){ Configuration cfg = new Configuration().configure(); // 创建 Criteria 对象 QBC 的查询方式 Criteria criteria = session.createcriteria(employee.class); // 设置条件 Criterion criterion = Restrictions.eq("id", 2); criteria.add(criterion); Employee e = (Employee) criteria.uniqueresult(); System.out.println(e); // 关闭缓存 sessionfactory.close(); (4) 使用 Restrictions.eq() 方法获取 name= tom 的员工数据, 代码如下 package cn.itcast.test; import org.hibernate.criteria;
import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; import org.hibernate.criterion.criterion; import org.hibernate.criterion.restrictions; import org.junit.test; import cn.itcast.domain.employee; public class Test3 { // 使用 Restrictions.eq() 方法获取 name= tom 的员工数据 public void test32(){ Configuration cfg = new Configuration().configure(); // 创建 Criteria 对象 QBC 的查询方式 Criteria criteria = session.createcriteria(employee.class); // 设置条件 Criterion criterion = Restrictions.eq("name", "tom"); criteria.add(criterion); List<Employee> list = criteria.list(); // 遍历输出 for(employee e:list){ System.out.println(e); // 关闭缓存 sessionfactory.close();