hibernate內部測試題(附贈答案)


一、選擇題(共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的調優方案:

 

  1. 制定合理的緩存策略;
  2. 盡量使用延遲加載特性;
  3. 采用合理的Session管理機制;
  4. 使用批量抓取,設定合理的批處理參數(batch_size);
  5. 進行合理的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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM