第 7 章初识 Hibernate 样题 A 卷 一 选择题 ( 每小题 2 分, 共 20 分 ) 1 下面关于 Hibernate 的说法中, 正确的是 ( ) A Hibernate 是 ORM 的一种实现方式 B Hibernate 不需要 JDBC 的支持 C 属于控制层 D 属于业务逻辑层 2 下面关于 Hibernate 的描述中, 错误的是 ( ) A Hibernate 对 JDBC 访问数据库做了轻量级的封装 B Hibernate 是一个优秀的 ORM 映射框架 C Hibernate 是 JDBC 的替代技术 D Hibernate 具备很强的扩展性 3 下列选项中, 不属于 Hibernate 的核心 API 的是 ( ) A Configuration B SessionFactory C SqlSession D Query 4 在 Hibernate 中, 关于 Transaction 的说法正确的是 ( ) A Transaction 是可有可无的 B Transaction 默认是开启的 C Transaction 在做查询的时候是可有可无的 D Transaction 在做修改的时候是可有可无的 5 Hibernate 实体对象制作规范不包括下列哪些规则 ( ) A 声明无参公共的构造方法 B 提供用于作为 OID 的标识属性 C 为所有属性提供 getter 和 setter 方法 D 声明为最终类 (final 修饰 ) 6 下列 Hibernate 映射文件的命名, 不正确的是 ( ) A user.properties B user.hbm.xml C User.hbm.xml D UserModel.hbm.xml 7 数据层解决不包括以下哪些技术 ( ) A JDBC B Apache DBUtils C log4j D Hibernate 8 完成查询用户表中信息总量的程序片段如下 : String hql = select count(uuid) from UserModel ; Query q = s.createquery(hql); count = s.uniqueresult();
空白处应该填写的内容为 ( ) A Integer B Long C Float D Double 9 以下关于 Query 对象获取查询结果的说法, 不正确的是 ( ) A list() 方法返回的结果为 List 集合 B list() 方法返回结果数据总量为 1 到多条数据 C uniqueresult() 方法返回结果内容为对象或者对象的数组 D uniqueresult() 方法返回结果数据总量为 0 到 1 条数据 10 Hibernate 方言的作用是 ( ) A 根据方言设置值生成对应的增删改查语句 B 根据方言设置值生成对应的查询语句 C 根据方言设置值建立与数据库的绑定关系 D 根据方言设置值明确使用的数据库类型 二 判断题 ( 每题 2 分, 共 20 分 ) 1 Hibernate 对 JDBC 访问数据库做了轻量级的封装, 完全 ORM 映射框架 ( ) 2 Hibernate 具有简单易学, 灵活性高, 扩展性强等特点 ( ) 3 Hibernate 全局配置文件名称只能是 hibernate.cfg.xml ( ) 4 在 Hibernate 中, 事务是默认开启的 ( ) 5 在 Hibernate 映射中, 映射文件的作用是建立实体类和表之间的关联关系 ( ) 6 实体模型类必须要实现序列化接口 ( ) 7 持久化类中尽量使用基本数据类型包装类, 目的是保证实体类和表拥有相同的默认 值 ( ) 8 Hibernate 框架内部没有提供数据库连接池的设计方案 ( ) 9 load() 方法延迟加载,get() 方法立即加载 ( ) 10 在 Hibernate 映射文件的规范中, 必须要求配置类与表的映射关系 ( ) 三 ( 程序分析题 5 分, 共 15 分 ) 1 请阅读下面的代码片段, 找出 Hibernate 常用 API 中初始化错误的代码 Configuration conf = Configuration.getConfiguration(); SessionFactory sf = conf.getsessionfactory(); Session s = sf.getsession(); Transaction tx = s.gettransaction(); 2 请补充下面的程序, 完成用户名与用户地址的查询 ( 要求写出两种 ) String hql = "select username,address from UserModel"; Query q = s.createquery(hql); List< > list = s.list(); 3 请阅读下面的程序, 找出哪些不能作为 Hibernate 持久化类定义的规范 public final class User { private int id; private String name; public User(int id, String name, String gender) {
this.id = id; this.name = name; this.gender = gender; private String gender; public int getid() { return id; public void setid(int id) { this.id = id; public String getgender() { return gender; public void setgender(string gender) { this.gender = gender; public String getname() { return name; public void setname(string name) { this.name = name; 四 简答题 ( 每题 5 分, 共 15 分 ) 1 简述 Hibernate 框架的特点 2 简述说明 Hibernate 的执行流程 3 请写出 Hibernate 的常用 A PI 以及代表的含义 ( 至少写出 4 个 ) 五 操作题 ( 每题 10 分, 共 30 分 ) 1 请按照以下要求完成操作 要求如下 : 1) 用 Hibernate 框架实现用户添加 2) 实体类 User 分别有 id username password 属性 3) 主键 ID 采用 Mysql 自增长的方式递增 采用 JUnit 测试完成数据的插入 2 请按照以下要求设计一个登录页面 要求如下 : 1) 要求使用 Hibernate 框架实现登录功能 2) 登录页面采用 JSP, 页面中有一个文本框对应账号, 密码框对应密码 3) 账号不能为空, 并给出提示信息 4) 输入用户名和密码, 查询数据库如果查询到, 则显示登录成功, 否则登录失败, 并提示 用户名或者密码错误
3 请按照以下要求设计一个注册功能 要求如下 : 1) 要求使用 Hibernate 框架实现注册功能 2) 注册页面采用 JSP, 页面中有两个文本框, 两个密码框, 分别对应姓名 账号 密码 确认密码 3) 账号不能为空, 要求密码和确认密码输入要一致, 并给出提示信息 4) 无误后, 根据用户名查询数据库, 如果查询到, 则注册失败, 并提示 账号已存在, 否则注册成功
答案 一 选择题 1.A 2.C 3.C 4.C 5.D 6.A 7.C 8.B 9.B 10.D 二 判断题 1.Y 2.Y 3.N 4.N 5.Y 6.N 7.Y 8.N 9.Y 10.N 三 程序分析题 ------------------- 第 1 题 ------------------- 1 请阅读下面的程序, 找出 Hibernate 常用 API 初始化的错误 答 : 本题是考察 Hibernate 常用 API 的使用 例如 :Configuration conf = new Configuration().configure(); SessionFactory sf = conf.buildsessionfactory(); Session s = sf.opensession(); Transaction tx = s.begintransaction(); ------------------- 第 2 题 ------------------- 2 请阅读下面的程序, 完成用户名与用户地址的查询 ( 要求写出两种 ) 答 :(1)UserModel (2)String[] (3)Object[] ------------------- 第 3 题 ------------------- 3 请阅读下面的程序, 找出哪些不能作为 Hibernate 持久化类定义的规范 答 :(1) 持久化类不能使用 final 修饰, 否则无法产生代理对象 (2) 尽量使用基本数据类型包装类, 为了保证实体类的默认的属性值和表的默认值一致 (3) 提供一个无参数构造器 四 简答题 ------------------- 第 1 题 ------------------- 1 简述 Hibernate 框架的特点 (1)Hibernate 对 JDBC 访问数据库的代码做了轻量级封装, 大大简化了数据访问层繁琐的重复性代码, 并且减少了内存消耗, 加快了运行效率 (2)Hibernate 是一个基于 JDBC 的主流持久化框架, 是一个优秀的 ORM 实现, 它很大程度的简化了 dao(data Access Object, 数据访问对象 ) 层编码工作 (3)Hibernate 使用 Java 的反射机制, 而不是使用字节码增强程序类并实现透明性 (4)Hibernate 的性能非常好, 映射的灵活性很出色 它支持很多关系型数据库, 从一对一到多对多的各种复杂关系 (5) 可扩展性强, 由于源代码的开源以及 API 的开放, 当本身功能不够用时, 可以自行编码进行扩展 ------------------- 第 2 题 ------------------- 2 简述说明 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, 断开与数据库连接 ------------------- 第 3 题 ---------------------- 4 请写出 Hibernate 的常用 A PI 以及代表的含义 ( 至少写出 4 个 ) (1)Configuration:Configuration 实例主要用于启动 加载 管理 hibernate 的配置文件信息 (2)SessionFactory:SessionFactory 接口负责 Hibernate 的初始化和建立 Session 对象 它在 Hibernate 中起到一个缓冲区作用,Hibernate 可以将自动生成的 SQL 语句 映射数据以及某些可重复利用的的数据放在这个缓冲区中 同时它还保存了对数据库配置的所有映射关系, 维护了当前的二级缓存 (3)Session: 是应用程序与数据库之间交互操作的一个单线程对象, 是 Hibernate 运作的中心, 它的主要功能是为持久化对象提供创建 读取和删除的能力, 所有持久化对象必须在 session 的管理下才可以进行持久化操作 (4)Transaction:Transaction 接口主要用于管理事务, 它是 Hibernate 的数据库事务接口, 且对底层的事务接口进行了封装 Transaction 接口的事务对象是通过 Session 对象开启的 (5)Query:Query 代表面向对象的一个 Hibernate 查询操作 在 Hibernate 中, 我们通常使用 session.createquery() 方法接受一个 HQL 语句, 然后调用 Query 的 list() 或 uniqueresult() 方法执行查询 所谓的 HQL 是 Hibernate Query Language 缩写, 其语法很像 SQL 语法, 但它是完全面向对象的 (6)Criteria 是一个完全面向对象, 可扩展的条件查询 API, 通过它完全不需要考虑数据库底层如何实现, 以及 SQL 语句如何编写, 它是 Hibernate 框架的核心查询对象 Criteria 查询, 又称为 QBC 查询 (Query By Criteria), 它是 Hibernate 的另一种对象检索方式 五 操作题 ------------------- 第 1 题 ------------------- 1 请按照以下要求完成操作 ( 截取核心代码, 以供参考 ) //User 实体类 public class User { private Integer id;// 主键 ID private String username;// 用户名 private String password;// 密码 // 对每个属性提供 getter 和 setter 方法, 此处省略 <!-- 映射文件 -->
<hibernate-mapping> <class name="cn.itcast.demo1.user" table="user"> <id name="id" column="id"> <generator class="native"></generator><!-- 主键采用自增长的方式 --> </id> <property name="username"></property> <property name="password"></property> </class> </hibernate-mapping> // 采用 JUnit 测试执行 Hibernate 添加操作 @Test public void demo1() { Configuration configuration = new Configuration().configure(); SessionFactory factory = configuration.buildsessionfactory(); Session session = factory.opensession(); Transaction tx = session.begintransaction(); User user = new User(); user.setusername("zhangsan"); user.setpassword("123"); session.save(user);// 添加操作, 由于主键采用自增长, 此处不需要设置 id 属性 tx.commit(); session.close(); factory.close(); ------------------- 第 2 题 ------------------- 2 请按照以下要求设计一个登录页面 ( 截取核心代码, 以供参考 ) //User 实体类 public class User { private Integer id; private String username; private String password; // 同上, 提供 setter 和 getter 方法, 此处省略. <! 映射文件 --> <hibernate-mapping> <class name="cn.itcast.demo2.user" table="user"> <id name="id" column="id"> <generator class="native"></generator> </id> <property name="username"></property> <property name="password"></property> </class>
</hibernate-mapping> //Dao 层提供查询方法 public class UserDao { // 根据用户名和密码查询用户 public User finduserbyusernameandpassword(string username,string password) { Configuration configuration = new Configuration().configure(); SessionFactory factory = configuration.buildsessionfactory(); Session session = factory.opensession(); Transaction tx = session.begintransaction(); String hql = "from User u where u.username=? and u.password=?"; Query query = session.createquery(hql); query.setstring(0, username); query.setstring(1, password); List<User> list = query.list(); tx.commit(); if(list!= null && list.size() > 0) { return list.get(0); return null; // 创建 LoginServlet public class LoginServlet extends HttpServlet { private UserDao dao = new UserDao(); protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getparameter("username"); String password = request.getparameter("password"); if(username == null "".equals(username)) { request.setattribute("msg", " 用户名不能为空 "); request.getrequestdispatcher("/login.jsp").forward(request, response); return; User user = dao.finduserbyusernameandpassword(username, password); if(user == null) { request.setattribute("msg", " 用户名或者密码错误 "); request.getrequestdispatcher("/login.jsp").forward(request, response); return; request.setattribute("user", user); request.getrequestdispatcher("/success.jsp").forward(request, response);
<! - login.jsp 登录页面 --> <font color="red">${msg </font> <form action="${pagecontext.request.contextpath/loginservlet" method="post"> 用户名 :<input type="text" name="username"/><br/> 密码 :<input type="password" name="password"/><br/> <input type="submit" value=" 登录 "/> </form> <! 登录成功页面 success.jsp--> ${user.username 登录成功! ------------------- 第 3 题 ------------------- 3 请按照以下要求设计一个注册功能 ( 截取核心代码, 以供参考 ) //Customer 实体类 public class Customer { private Integer id; private String name; private String account; private String password; // 提供 getter 和 setter 方法, 同上 <! 映射文件 --> <hibernate-mapping> <class name="cn.itcast.demo2.customer" table="customer"> <id name="id" column="id"> <generator class="native"></generator> </id> <property name="name"></property> <property name="account"></property> <property name="password"></property> </class> </hibernate-mapping> // 创建 Dao public class CustomerDao { // 根据客户的账号查询 public Customer findcustomerbyaccount(string account) { Configuration configuration = new Configuration().configure(); SessionFactory factory = configuration.buildsessionfactory(); Session session = factory.opensession();
Transaction tx = session.begintransaction(); String hql = "from Customer c where c.account=?"; Query query = session.createquery(hql); query.setstring(0, account); List<Customer> list = query.list(); tx.commit(); if(list!= null && list.size() > 0) { return list.get(0); return null; // 添加客户信息 public void addcustomer(customer customer) { Configuration configuration = new Configuration().configure(); SessionFactory factory = configuration.buildsessionfactory(); Session session = factory.opensession(); Transaction tx = session.begintransaction(); session.save(customer); tx.commit(); // 创建 RegistServlet public class RegistServlet extends HttpServlet { private CustomerDao customerdao = new CustomerDao(); protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getparameter("name"); String account = request.getparameter("account"); String password = request.getparameter("password"); String repassword = request.getparameter("repassword"); if(account == null "".equals(account)) { request.setattribute("msg", " 账号不能为空 "); request.getrequestdispatcher("/regist.jsp").forward(request, response); return; if(integer.parseint(password)!= Integer.parseInt(repassword)) { request.setattribute("msg", " 两次输入的密码不一致 "); request.getrequestdispatcher("/regist.jsp").forward(request, response); return; Customer customer = customerdao.findcustomerbyaccount(account); if(customer!= null) { request.setattribute("msg", " 账号已存在 ");
request.getrequestdispatcher("/regist.jsp").forward(request, response); return; Customer customer2 = new Customer(); customer2.setname(name); customer2.setaccount(account); customer2.setpassword(password); customerdao.addcustomer(customer2); response.sendredirect(request.getcontextpath() + "/success.jsp"); <!-- 创建注册页面 regist.jsp--> <font color="red">${msg </font> <form action="${pagecontext.request.contextpath/registservlet" method="post"> 姓名 :<input type="text" name="name"/><br/> 账号 :<input type="text" name="account"/><br/> 密码 :<input type="password" name="password"/><br/> 确认密码 :<input type="password" name="repassword"/><br/> <input type="submit" value=" 注册 "/> </form> <! 成功调整页面 success.jsp--> <body> 注册成功! </body>