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


一、選擇題(共25題,每題2.5分,選擇一項或多項,漏選錯選不得分)

1.在Hibernate中,以下關於主鍵生成器說法錯誤的是( )。

Aincrement可以用於類型為longshortbyte的主鍵

Bidentity用於如SQL ServerDB2MySQL等支持標識列的數據庫

Csequence用於如OracleSQL Server等支持序列的數據庫

DnativeHibernate根據底層數據庫自行判斷采用何種主鍵生成策略,是由使用的數據庫生成主鍵的值

 

2.在Hibernate中,關於臟檢查和刷新緩存說法正確的是( )。

 

A.當事務提交時,會發生臟檢查

 

BSessionflush( )方法是刷新緩存的方法

 

C.在執行Sessioncommit( )方法之前不會調用Sessionflush( )方法

 

D.編寫代碼時,調用commit( )方法之前要調用flush( )方法

 

3.使用HQL查詢所有部門信息,以下正確的是( )。

 

Afrom Dept

 

Bselect * from cn.jbit.demo.entity.Dept

 

Cselect Dept from cn.jbit.demo.entity.Dept d

 

Dselect d from Dept d

 

 

4.關於Query接口的list( )iterate( )方法,說法正確的是( )。

 

A.執行list( )方法,查詢所有符合條件的記錄

 

B.執行iterate( )方法,查詢所有符合條件的記錄

 

C.執行list( )方法,查詢出所有符合條件的主鍵值

 

D.執行iterate ( )方法,查詢出所有符合條件的主鍵值

 

 

5.在HQL中,關於Query接口綁定參數的方法,說法正確的是( )。

AsetParameter( )方法用於綁定任意類型的參數

BsetParameter( )有重載的方法

 

 

CsetProperties( )有重載的方法

 

DsetProperties( )方法用於綁定命名參數

 

 

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屬性值deptcn.jbit.hibernatedemo.entity.Emp類的屬性名

 

D<many-to-one>標簽中的column屬性值DEPTNOdept表的主鍵名

 

 

7.在Hibernate映射文件中,關於inverse屬性說法正確的是( )。

 

Ainverse屬性有兩個值:truefalse

 

B<many-to-one>標簽有inverse屬性

 

C<set>標簽有inverse屬性

 

Dinverse屬性用於指定維護關聯關系的那一方

 

 

8.在Hibernate映射文件中,關於延遲加載配置說法錯誤的是( )

 

A<class>標簽中lazy屬性可選值:truefalse

 

B<set>標簽中lazy屬性可選值:trueproxyno-proxy

 

C< set>標簽中lazy屬性可選值:trueextrafalse

 

 

D<many-to-one>標簽中lazy屬性可選值:proxytruefalse 

 

 

9.在Hibernate映射文件中,關於<component>標簽說法正確的是( )。

 

A<component>標簽用來映射組件類

 

B<component>標簽通過<parent>指定組件類所屬的整體類

 

C<component>標簽通過<property>指定組件類的屬性

 

D<component>標簽有idnameclass屬性

 

 

10MyBatis指定配置文件的根元素使用的是( )。

 

A<sqlMapConfig>

 

B<configuration>

 

C<setting>

 

D<environments>

 

 

11.在MyBatis中,ExecutorType的值包括( )。

 

AExecutorType.SIMPLE

 

BExecutorType.BATCH

 

CExecutorType.EXECUTE

 

DExecutorType.REUSE

 

12.關於Hibernate緩存說法錯誤的是( )。

 

AHibernate緩存一般分為三類:一級緩存、二級緩存和查詢緩存

 

BSessionevict( )方法用於從緩存中清除指定的持久化對象

 

CSessionclear( )方法用於刷新緩存

 

DSessionflush( )方法用於從緩存中清除所有持久化對象

 

13.關於HQL的連接查詢,說法錯誤的是( )。

 

Ainner join join用於內連接

 

Binner join fetchjoin fetch用於迫切內連接

 

Cleft outer join fetch left join fetch用於迫切左外連接

 

 

 

 

Dright outer join fetch right join fetch用於迫切右外連接

 

 

14.關於Hibernate批量處理數據說法正確的是( )。

 

A.使用HQL進行批量操作,Hibernate不支持批量插入

 

B.使用JDBC API進行批量操作,SQL語句中涉及的數據會被加載到Session緩存,占用內存空間

 

C.使用Session進行批量操作,數據會被加載到Session緩存,需注意刷新並清空緩存

 

D.使用Session進行批量操作,適用於需要通過代碼處理的復雜的業務邏輯場景

 

 

15.關於HQL的聚合函數使用,說法正確的是( )。

 

Aselect count(*) from Dept d用於統計部門個數

 

Bselect sum(e.salary) from Emp e用於匯總員工工資總額

 

Cselect max(e.hiredate) from Emp e用於找到最新入職的員工的入職時間

 

Dselect min(e.hiredate) from Emp e用於找到最早入職的員工的入職時間

 

16關於HQL子查詢中,說法錯誤的是( )。

 

Asize( )size用於獲取集合中元素的數目

 

Belements( )用於獲取集合中的所有元素

 

Cany關鍵字用於子查詢語句返回所有記錄

 

Din關鍵字與“=any”意思相同

 

 

17關於原生SQL查詢和命名查詢,說法正確的是( )。

 

A執行原生SQL,需使用SQLQuery對象

 

BSQLQuery是一個接口,繼承了Query接口

 

CHibernate支持在映射文件中定義字符串形式的查詢語句,這樣的語句是命名查詢語句

 

D.命名查詢語句只能是HQL語句,不能是SQL語句

 

 

18 Hibernate中,關於映射Oracle中的BLOBCLOB類型的方法,說法正確的是( )。

 

ACLOB類型只能映射為java.lang.String

 

BBLOB類型可以映射為java.sql.Blob

 

CBLOB類型可以映射為byte[]

 

DCLOB類型可以映射為java.lang.Stringjava.sql.Clob

 

19.在Hibernate中,關於Criteria運算方法說法錯誤的是 

 

ARestrictions.ge( )方法等同於HQL運算符 >=

 

BRestrictions.like("empName","s",MatchMode.START)方法用於查找姓名以s開頭的員工

 

CRestrictions.disjunction( )方法用於指定多個邏輯與

 

DRestrictions.in( )方法只能用於數組

 

 

20Hibernate中,關於注解說法正確的是( )

 

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;

 

下列顯式正確值的選項是( )。

 

A1

 

B10

 

C100

 

D.報錯

 

 

24A_oeA_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;

 

執行上面語句后結果正確的是( )。

 

AA_hr能夠查詢A_oe.orders

 

BA_hr不能夠查詢A_oe.orders

 

CREVOKE語句將撤銷A_hrSELECT權限同時也從r1角色撤銷SELECT權限

 

DREVOKE語句將報錯,因為SELECT權限已經被r1角色授予

 

 

 

25.對於視圖,下列語句正確的是( )。

 

A.有列別名的視圖不能被修改

 

B.一個復雜的視圖定義中使用子查詢不能包含聚合(分組)函數和連接

 

C.如果一個視圖定義中包含DISTINCT關鍵字,則不能夠通過視圖進行刪除

 

D.創建視圖語法中OR REPLACE 選項被使用,目的是在沒有刪除視圖的情況下修改已

在的視圖定義。

 

 

二、簡答題(共5題,每題7.5分)

 

1.請簡述Hibernatejdbc的聯系。

 

2.請簡述MyBatisHibernate的區別。

 

3.請詳細描述在HibernateJava對象的三種狀態是如何轉換的。

 

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

 

評分要點:

 

評分點

分數

Hibernatejdbc的輕量級封裝

4

HQL語句也是面向對象的

3.5

 

參考答案:

 

Hibernatejdbc的輕量級封裝,包括jdbc的與數據庫的連接(用hibernate的配置文件實現,本質是封裝了jdbc),和查詢,刪除等代碼,都用面向對象的思想用代碼聯系起來,Hibernate通過hbm 配置文件(或注解)把持久化類的字段和數據庫的字段關聯起來比如數據庫的id

 

HQL語句也是面向對象的,它的查詢語句不是查詢數據庫而是查詢類的。

 

 

 

2

 

評分要點:

 

評分點

分數

寫出3條滿分,少一條扣2分,直到扣完為止

7.5

 

參考答案:

 

調優方案:

 

Hibernate的調優方案:

 

  1. 制定合理的緩存策略;
  2. 盡量使用延遲加載特性;
  3. 采用合理的Session管理機制;
  4. 使用批量抓取,設定合理的批處理參數(batch_size;
  5. 進行合理的O/R映射設計

 

Mybatis調優方案:

 

MyBatisSession方面和HibernateSession生命周期是一致的,同樣需要合理的Session管理機制。MyBatis同樣具有二級緩存機制。 MyBatis可以進行詳細的SQL優化設計。

 

1> SQL優化方面

 

Hibernate的查詢會將表中的所有字段查詢出來,這一點會有性能消耗。Hibernate也可以自己寫SQL來指定需要查詢的字段,但這樣就破壞了Hibernate開發的簡潔性。而MybatisSQL是手動編寫的,所以可以按需求指定查詢的字段。Hibernate SQL語句的調優需要將SQL打印出來,而HibernateSQL被很多人嫌棄因為太丑了。MyBatisSQL是自己手動寫的所以調整方便。但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

 

參考答案:

 

1Hibernate的分頁機制:獲得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-2025 CODEPRJ.COM