一、选择题(共25题,每题2.5分,选择一项或多项,漏选错选不得分)
1.在Hibernate中,以下关于主键生成器说法错误的是( )。
A.increment可以用于类型为long、short或byte的主键
B.identity用于如SQL Server、DB2、MySQL等支持标识列的数据库
C.sequence用于如Oracle、SQL Server等支持序列的数据库
D.native由Hibernate根据底层数据库自行判断采用何种主键生成策略,是由使用的数据库生成主键的值
2.在Hibernate中,关于脏检查和刷新缓存说法正确的是( )。
A.当事务提交时,会发生脏检查
B.Session的flush( )方法是刷新缓存的方法
C.在执行Session的commit( )方法之前不会调用Session的flush( )方法
D.编写代码时,调用commit( )方法之前要调用flush( )方法
3.使用HQL查询所有部门信息,以下正确的是( )。
A.from Dept
B.select * from cn.jbit.demo.entity.Dept
C.select Dept from cn.jbit.demo.entity.Dept d
D.select d from Dept d
4.关于Query接口的list( )和iterate( )方法,说法正确的是( )。
A.执行list( )方法,查询所有符合条件的记录
B.执行iterate( )方法,查询所有符合条件的记录
C.执行list( )方法,查询出所有符合条件的主键值
D.执行iterate ( )方法,查询出所有符合条件的主键值
5.在HQL中,关于Query接口绑定参数的方法,说法正确的是( )。
A.setParameter( )方法用于绑定任意类型的参数
B.setParameter( )有重载的方法
C.setProperties( )有重载的方法
D.setProperties( )方法用于绑定命名参数
6.在Hibernate中,关于以下映射配置,说法错误的是( )。
<hibernate-mapping>
<class name="cn.jbit.hibernatedemo.entity.Emp" table="EMP" schema="scott">
<id name="empNo" column="EMPNO" type="java.lang.Integer">
<generator class="assigned"/>
</id>
<property name="salary" type="java.lang.Double" column="SAL"/>
<property name="hireDate" type="java.util.Date"/>
<many-to-one
name="dept"
column="DEPTNO"
class="cn.jbit.hibernatedemo.entity.Dept"
/>
</class>
</hibernate-mapping>
A.此配置信息描述了cn.jbit.hibernatedemo.entity.Emp类和EMP表的映射
B.描述的是scott用户的EMP表
C.<many-to-one>标签中的name属性值dept是cn.jbit.hibernatedemo.entity.Emp类的属性名
D.<many-to-one>标签中的column属性值DEPTNO是dept表的主键名
7.在Hibernate映射文件中,关于inverse属性说法正确的是( )。
A.inverse属性有两个值:true、false
B.<many-to-one>标签有inverse属性
C.<set>标签有inverse属性
D.inverse属性用于指定维护关联关系的那一方
8.在Hibernate映射文件中,关于延迟加载配置说法错误的是( )
A.<class>标签中lazy属性可选值:true、false
B.<set>标签中lazy属性可选值:true、proxy和no-proxy
C.< set>标签中lazy属性可选值:true、extra和false
D.<many-to-one>标签中lazy属性可选值:proxy、true和false
9.在Hibernate映射文件中,关于<component>标签说法正确的是( )。
A.<component>标签用来映射组件类
B.<component>标签通过<parent>指定组件类所属的整体类
C.<component>标签通过<property>指定组件类的属性
D.<component>标签有id、name、class属性
10.MyBatis指定配置文件的根元素使用的是( )。
A.<sqlMapConfig>
B.<configuration>
C.<setting>
D.<environments>
11.在MyBatis中,ExecutorType的值包括( )。
A.ExecutorType.SIMPLE
B.ExecutorType.BATCH
C.ExecutorType.EXECUTE
D.ExecutorType.REUSE
12.关于Hibernate缓存说法错误的是( )。
A.Hibernate缓存一般分为三类:一级缓存、二级缓存和查询缓存
B.Session的evict( )方法用于从缓存中清除指定的持久化对象
C.Session的clear( )方法用于刷新缓存
D.Session的flush( )方法用于从缓存中清除所有持久化对象
13.关于HQL的连接查询,说法错误的是( )。
A.inner join 或 join用于内连接
B.inner join fetch或 join fetch用于迫切内连接
C.left outer join fetch 或 left join fetch用于迫切左外连接
D.right outer join fetch 或 right join fetch用于迫切右外连接
14.关于Hibernate批量处理数据说法正确的是( )。
A.使用HQL进行批量操作,Hibernate不支持批量插入
B.使用JDBC API进行批量操作,SQL语句中涉及的数据会被加载到Session缓存,占用内存空间
C.使用Session进行批量操作,数据会被加载到Session缓存,需注意刷新并清空缓存
D.使用Session进行批量操作,适用于需要通过代码处理的复杂的业务逻辑场景
15.关于HQL的聚合函数使用,说法正确的是( )。
A.select count(*) from Dept d用于统计部门个数
B.select sum(e.salary) from Emp e用于汇总员工工资总额
C.select max(e.hiredate) from Emp e用于找到最新入职的员工的入职时间
D.select min(e.hiredate) from Emp e用于找到最早入职的员工的入职时间
16.关于HQL子查询中,说法错误的是( )。
A.size( )或size用于获取集合中元素的数目
B.elements( )用于获取集合中的所有元素
C.any关键字用于子查询语句返回所有记录
D.in关键字与“=any”意思相同
17.关于原生SQL查询和命名查询,说法正确的是( )。
A.执行原生SQL,需使用SQLQuery对象
B.SQLQuery是一个接口,继承了Query接口
C.Hibernate支持在映射文件中定义字符串形式的查询语句,这样的语句是命名查询语句
D.命名查询语句只能是HQL语句,不能是SQL语句
18.在 Hibernate中,关于映射Oracle中的BLOB和CLOB类型的方法,说法正确的是( )。
A.CLOB类型只能映射为java.lang.String
B.BLOB类型可以映射为java.sql.Blob
C.BLOB类型可以映射为byte[]
D.CLOB类型可以映射为java.lang.String或java.sql.Clob
19.在Hibernate中,关于Criteria运算方法说法错误的是( )。
A.Restrictions.ge( )方法等同于HQL运算符 >=
B.Restrictions.like("empName","s",MatchMode.START)方法用于查找姓名以s开头的员工
C.Restrictions.disjunction( )方法用于指定多个逻辑与
D.Restrictions.in( )方法只能用于数组
20.在Hibernate中,关于注解说法正确的是( )。
A.@Id用于声明持久化类的唯一标识,对应于数据表中的主键
B.@Cloumn用于将属性映射到列
C.@Transient用于忽略该属性,需要持久化到数据库
D.@GeneratedValue用于定义主键值的生成策略
21.下列关于同义词的说法,选项正确的是( )。
A.只能为表创建同义词,不能为视图创建同义词
B.同义词只能用于引用其他用户创建的表
C.公有同义词和私有同义词对同一个表可以同名
D.使用Drop Synonym语句删除同义词的同时,同义词引用的表也无效
22.评估CREATE TABLE 语句:
CREATE TABLE products
(
product_id NUMBER(6) CONSTRAINT prod_id_pk PRIMARY KEY,
product_name VARCHAR2(15)
)
下列关于prod_id_pk选项正确的是( )。
A.可以被创建,但需要唯一索引用手工创建
B.可以被创建并且会自动创建唯一索引
C.可以被创建并且会自动创建非唯一索引
D.可以被创建但不可以使用,因为没有指定索引
23.下列创建序列的SQL语句:
CREATE SEQUENCE seq1
START WITH 100
INCREMENT BY 10
MINVALUE 1
MAXVALUE 200
CYCLE
NOCACHE;
序列seq1的生成的值已经到最大值200,再执行下列语句:
SELECT seq1.nextval FROM dual;
下列显式正确值的选项是( )。
A.1
B.10
C.100
D.报错
24.A_oe和A_hr是数据库中的2个用户,A_oe下有一个表Orders,执行下列语句如下:
CREATE ROLE r1;
GRNAT SELECT,INSERT ON A_oe.orders to r1;
GRANT r1 to A_hr;
GRANT SELECT ON A_oe.orders To A_hr;
REVOKE SELECT ON A_oe.orders FROM A_hr;
执行上面语句后结果正确的是( )。
A.A_hr能够查询A_oe.orders表
B.A_hr不能够查询A_oe.orders表
C.REVOKE语句将撤销A_hr的SELECT权限同时也从r1角色撤销SELECT权限
D.REVOKE语句将报错,因为SELECT权限已经被r1角色授予
25.对于视图,下列语句正确的是( )。
A.有列别名的视图不能被修改
B.一个复杂的视图定义中使用子查询不能包含聚合(分组)函数和连接
C.如果一个视图定义中包含DISTINCT关键字,则不能够通过视图进行删除
D.创建视图语法中OR REPLACE 选项被使用,目的是在没有删除视图的情况下修改已存
在的视图定义。
二、简答题(共5题,每题7.5分)
1.请简述Hibernate与jdbc的联系。
2.请简述MyBatis和Hibernate的区别。
3.请详细描述在Hibernate中Java对象的三种状态是如何转换的。
4.请简述Hibernate是如何实现分页的?如果不使用Hibernate提供的方法实现分页功能,则采用什么方式分页?
5.根据员工表编写规范的存储过程。完成以下任务:
1).给指定员工涨工资,其中员工编号和涨的工资金额由输入参数决定
2).涨工资后,显示所有员工薪水情况
3).在存储过程中考虑到以下异常:
A.指定的员工不存在的情况
B.涨的工资金额小于等于0的情况
4).编写调用程序,要求测试各种情况
一、选择题(共25题,每题2.5分,选择一项或多项,漏选错选不得分)
1 |
2 |
3 |
4 |
5 |
AC |
AB |
AD |
AD |
ABCD |
6 |
7 |
8 |
9 |
10 |
D |
ACD |
BD |
ABC |
B |
11 |
12 |
13 |
14 |
15 |
ABD |
CD |
D |
CD |
ABCD |
16 |
17 |
18 |
19 |
20 |
C |
ABC |
BCD |
CD |
ABD |
21 |
22 |
23 |
24 |
25 |
C |
B |
A |
A |
CD |
二、简答题(共5题,每题7.5分)
1.
评分要点:
评分点 |
分数 |
Hibernate是jdbc的轻量级封装 |
4 |
HQL语句也是面向对象的 |
3.5 |
参考答案:
Hibernate是jdbc的轻量级封装,包括jdbc的与数据库的连接(用hibernate的配置文件实现,本质是封装了jdbc),和查询,删除等代码,都用面向对象的思想用代码联系起来,Hibernate通过hbm 配置文件(或注解)把持久化类的字段和数据库的字段关联起来比如数据库的id。
HQL语句也是面向对象的,它的查询语句不是查询数据库而是查询类的。
2.
评分要点:
评分点 |
分数 |
写出3条满分,少一条扣2分,直到扣完为止 |
7.5 |
参考答案:
调优方案:
Hibernate的调优方案:
- 制定合理的缓存策略;
- 尽量使用延迟加载特性;
- 采用合理的Session管理机制;
- 使用批量抓取,设定合理的批处理参数(batch_size);
- 进行合理的O/R映射设计
Mybatis调优方案:
MyBatis在Session方面和Hibernate的Session生命周期是一致的,同样需要合理的Session管理机制。MyBatis同样具有二级缓存机制。 MyBatis可以进行详细的SQL优化设计。
1> SQL优化方面
Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。Hibernate SQL语句的调优需要将SQL打印出来,而Hibernate的SQL被很多人嫌弃因为太丑了。MyBatis的SQL是自己手动写的所以调整方便。但Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录
2> 扩展性方面
Hibernate与具体数据库的关联只需在XML文件中配置即可,所有的SQL语句与具体使用的数据库无关,移植性很好。MyBatis项目中所有的SQL语句都是依赖所用的数据库的,所以不同数据库类型的支持不好。
3.
评分要点:
评分点 |
分数 |
写出5种转换得满分,少一种扣1分,直到扣完为止 |
4 |
写出导致转换的方法得满分,少一个扣1分,直到扣完为止。 |
3.5 |
参考答案:
瞬时状态转为持久状态
使用Session对象的save()或saveOrUpdate()方法保存对象后,该对象的状态由瞬时状态转换为持久状态。
使用Session对象的get()或load()方法获取对象,该对象的状态是持久状态。
持久状态转为瞬时状态
执行Session对象的delete()方法后,对象由原来的持久状态变为瞬时状态,因为此时该对象没有与任何的数据库数据关联。
持久状态转为游离状态
执行了Session对象的evict() 、clear()、close()方法,对象由原来的持久状态转为游离状态。
游离状态转为持久状态
重新获取Session对象,执行Session对象的update()或saveOrUpdate()方法,对象由游离状态转为持久状态,因为该对象再次与Session对象相关联。
游离状态转为瞬时状态
执行Session对象的delete()方法,对象由游离状态转为瞬时状态。
处于瞬时状态或游离状态的对象,会被Java虚拟机按照垃圾回收机制处理。
使用以下图形描述也可以:
4.
评分要点:
评分点 |
分数 |
写出2条满分,少一条扣4分,直到扣完为止 |
7.5 |
参考答案:
1、Hibernate的分页机制:获得Session对象后,从Session中获得Query对象(或者Criteria对象)。接下来调用以下方法:
Query.setFirstResult( )(或者Criteria.setFirstResult( )):设置要显示的第一行数据,
Query.setMaxResults( )(或者Criteria.setMaxResults( )):设置最多要显示几行数据。
2、不使用Hibernate的分页机制,可采用SQL语句分页,以Oracle为例,
如:5:为每页显示的记录,2为当前页:
select b.* from
(select a.*,rownum rn from
( select * from dept order by deptno) a
) b
where b.rn> (2-1)*5 and b.rn<=2*5
5.
评分要点:
评分点 |
分数 |
正确书写存储过程参数 |
1 |
正确定义游标 |
1 |
正确处理薪水小于等于0异常 |
1 |
正确处理员工不存在异常 |
1 |
正确显式游标内容 |
1 |
正确调用存储过程-薪水异常 |
0.5 |
正确调用存储过程-员工编号异常 |
0.5 |
正确调用存储过程-成功 |
1 |
存储过程中含有规范中建议的2个返回参数 |
0.5 |
参考答案:
CREATE OR REPLACE PROCEDURE raise_salary
(eno NUMBER, --输入参数,雇员编号
salary NUMBER, --输入参数,雇员薪水
on_Flag OUT number, --执行状态
os_Msg OUT VARCHAR2 --提示信息
) IS
CURSOR emp_cur IS
SELECT ename,sal FROM employee;
v_emp emp_cur%ROWTYPE;
exp1 EXCEPTION;
exp2 EXCEPTION;
BEGIN
IF salary<=0 THEN
RAISE exp1;
END IF;
UPDATE EMPLOYEE
SET sal=sal+salary
WHERE empno=eno;
IF SQL%NOTFOUND THEN
RAISE exp2;
END IF;
on_Flag:=1;
os_Msg:='修改成功';
OPEN emp_cur;
LOOP
FETCH emp_cur INTO v_emp;
EXIT WHEN emp_cur%NOTFOUND;
dbms_output.put_line(v_emp.ename||v_emp.sal);
END LOOP;
CLOSE emp_cur;
EXCEPTION
WHEN exp1 THEN
on_Flag:=-1;
os_Msg:='涨的薪水不能小于等于0。';
WHEN exp2 THEN
on_Flag:=-2;
os_Msg:='不存在该员工。';
WHEN OTHERS THEN
on_Flag:=SQLcode;
os_Msg:=SQLERRM;
END; --调用1不存在该员工
DECLARE
v_empno employee.empno%TYPE:=1234;
v_sal employee.sal%TYPE:=50;
on_Flag number(1); --执行状态
os_Msg VARCHAR2(200); --提示信息
BEGIN
raise_salary(v_empno,v_sal,on_Flag,os_Msg);
IF on_flag=1 THEN
dbms_output.put_line(os_msg);
END IF;
IF on_flag=-1 THEN
dbms_output.put_line(os_msg);
END IF;
IF on_flag=-2 THEN
dbms_output.put_line(os_msg);
END IF;
END; --调用2涨的薪水不能小于等于0
DECLARE
v_empno employee.empno%TYPE:=7788;
v_sal employee.sal%TYPE:=0;
on_Flag number(1); --执行状态
os_Msg VARCHAR2(200); --提示信息
BEGIN
raise_salary(v_empno,v_sal,on_Flag,os_Msg);
IF on_flag=1 THEN
dbms_output.put_line(os_msg);
END IF;
IF on_flag=-1 THEN
dbms_output.put_line(os_msg);
END IF;
IF on_flag=-2 THEN
dbms_output.put_line(os_msg);
END IF;
END; --调用3修改成功
DECLARE
v_empno employee.empno%TYPE:=7788;
v_sal employee.sal%TYPE:=50;
on_Flag number(1); --执行状态
os_Msg VARCHAR2(200); --提示信息
BEGIN
raise_salary(v_empno,v_sal,on_Flag,os_Msg);
IF on_flag=1 THEN
dbms_output.put_line(os_msg);
END IF;
IF on_flag=-1 THEN
dbms_output.put_line(os_msg);
END IF;
IF on_flag=-2 THEN
dbms_output.put_line(os_msg);
END IF;
END;