標籤:
《使用Hibernate開發租房系統》自我裝載筆試題
一、選擇題(共25題,每題2.5分,選擇一項或多項,漏選錯選不得分)
1.在Hibernate中,以下關於主鍵產生器說法錯誤的是(C )。
A.increment可以用於類型為long、short或byte的主鍵
B.identity用於如SQL Server、DB2、MySQL等支援識別欄位的資料庫
C.sequence用於如Oracle、SQL Server等支援序列的資料庫
D.native由Hibernate根據底層資料庫自行判斷採用何種主鍵建置原則,是由使用的資料庫產生主鍵的值
2.在Hibernate中,關於髒檢查和重新整理緩衝說法正確的是( AB)。
A.當事務提交時,會發生髒檢查
B.Session的flush( )方法是重新整理緩衝的方法
C.在執行Session的commit( )方法之前不會調用Session的flush( )方法
D.編寫代碼時,調用commit( )方法之前要調用flush( )方法
3.使用HQL查詢所有部門資訊,以下正確的是(AD )。
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( )方法,說法正確的是(AD )。
A.執行list( )方法,查詢所有合格記錄
B.執行iterate( )方法,查詢所有合格記錄
C.執行list( )方法,查詢出所有合格主索引值
D.執行iterate ( )方法,查詢出所有合格主索引值
5.在HQL中,關於Query介面綁定參數的方法,說法正確的是(ABCD )。
A.setParameter( )方法用於綁定任意類型的參數
B.setParameter( )有重載的方法
C.setProperties( )有重載的方法
D.setProperties( )方法用於綁定具名引數
6.在Hibernate中,關於以下映射配置,說法錯誤的是(D )。
<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屬性說法正確的是(ACD )。
A.inverse屬性有兩個值:true、false
B.<many-to-one>標籤有inverse屬性
C.<set>標籤有inverse屬性
D.inverse屬性用於指定維護關聯關係的那一方
8.在Hibernate對應檔中,關於消極式載入配置說法錯誤的是(BD )
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>標籤說法正確的是(ABC )。
A.<component>標籤用來映射組件類
B.<component>標籤通過<parent>指定組件類所屬的整體類
C.<component>標籤通過<property>指定組件類的屬性
D.<component>標籤有id、name、class屬性
10.MyBatis指定設定檔的根項目使用的是(B )。
A.<sqlMapConfig>
B.<configuration>
C.<setting>
D.<environments>
11.在MyBatis中,ExecutorType的值包括(ABD )。
A.ExecutorType.SIMPLE
B.ExecutorType.BATCH
C.ExecutorType.EXECUTE
D.ExecutorType.REUSE
解釋:
一個意外 ExecutorType
public final enum org.apache.ibatis.session.ExecutorType {
// Field descriptor #8 Lorg/apache/ibatis/session/ExecutorType;
public static final enum org.apache.ibatis.session.ExecutorType SIMPLE;
// Field descriptor #8 Lorg/apache/ibatis/session/ExecutorType;
public static final enum org.apache.ibatis.session.ExecutorType REUSE;
// Field descriptor #8 Lorg/apache/ibatis/session/ExecutorType;
public static final enum org.apache.ibatis.session.ExecutorType BATCH;
12.關於Hibernate緩衝說法錯誤的是(CD )。
A.Hibernate緩衝一般分為三類:一級緩衝、二級緩衝和查詢快取
B.Session的evict( )方法用於從緩衝中清除指定的持久化對象
C.Session的clear( )方法用於重新整理緩衝
D.Session的flush( )方法用於從緩衝中清除所有持久化對象
13.關於HQL的串連查詢,說法錯誤的是(D )。
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批量處理資料說法正確的是(CD )。
A.使用HQL進行大量操作,Hibernate不支援批量插入
B.使用JDBC API進行大量操作,SQL語句中涉及的資料會被載入到Session緩衝,佔用記憶體空間
C.使用Session進行大量操作,資料會被載入到Session緩衝,需注意重新整理並清空緩衝
D.使用Session進行大量操作,適用於需要通過代碼處理的複雜的商務邏輯情境
解釋:批量處理資料
方式一:
使用HQL語句
原理: executeUpdate
01.批量插入資料
@Test
public void testInsert(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
String hql="insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0";
session.createQuery(hql).executeUpdate();
tx.commit();
}
方式二:JDBCAPI
//使用JDBC API進行批量修改
public void testUpdateUseJDBC(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Work work=new Work() {
@Override
public void execute(Connection connection) throws SQLException {
String sql="update DEPTY2160New set deptName=? where deptNo>?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, "財務部2");
ps.setInt(2, 1);
ps.executeUpdate();
}
};
session.doWork(work);
tx.commit();
}
方式三: 使用Session進行大量操作
public void testAdd(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Emp emp=null;
for (int i = 0; i < 10000; i++) {
emp=new Emp(i, "emp"+i);
session.save(emp);
if (i%30==0) {
session.flush();
session.clear();
}
}
tx.commit();
}
little tip:
(1)使用HQL進行大量操作 資料庫層面 executeUpdate()
(2)使用JDBC API進行大量操作 資料庫層面
(3)使用Session進行大量操作 會進緩衝
little tip2:
C.使用Session進行大量操作,資料會被載入到Session緩衝,需注意重新整理並清空緩衝
D.使用Session進行大量操作,適用於需要通過代碼處理的複雜的商務邏輯情境
15.關於HQL的彙總函式使用,說法正確的是(ABCD )。
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用於找到最早入職的員工的入職時間
解釋:HQL面向的是對象和屬性,不是表和欄位
16.關於HQL子查詢中,說法錯誤的是(C )。
A.size( )或size用於擷取集合中元素的數目
B.elements( )擷取集合中的所有元用於素
C.any關鍵字用於子查詢語句返回所有記錄
D.in關鍵字與“=any”意思相同
17.關於原生SQL查詢和命名查詢,說法正確的是(ABC )。
A.執行原生SQL,需使用SQLQuery對象
B.SQLQuery是一個介面,繼承了Query介面
C.Hibernate支援在對應檔中定義字串形式的查詢語句,這樣的語句是命名查詢語句
D.命名查詢語句只能是HQL語句,不能是SQL語句
解釋:原生SQL查詢和命名查詢
Query query=session.createQuery(hql)
SQLQuery query=session.createSQLQuery(sql)
1.原生SQL查詢
@Test
//原生SQL執行
public void testClassicSQL(){
SQLQuery query = session.createSQLQuery("select * from deptY2160new").addEntity(Dept.class);
List<Dept> list = query.list();
for (Dept dept : list) {
System.out.println(dept.getDeptName());
}
tx.commit();
}
2.命名查詢
<!-- -原生SQL NullPointException -->
<sql-query name="selectEmpByDetpNoClassicSQL">
<return alias="e" class="Emp" ></return>
select {e.*} from EmpY2160new e where deptNo=:deptNo
</sql-query>
測試類別
public void testNamedClassicSQL(){
Query query = session.getNamedQuery("selectEmpByDetpNoClassicSQL");
List<Emp> list = query.setParameter("deptNo", 1).list();
/* for (Emp emp : list) {
System.out.println(emp.getEmpName());
}*/
tx.commit();
}
18.在 Hibernate中,關於映射Oracle中的BLOB和CLOB類型的方法,說法正確的是(BCD )。
A.CLOB類型只能映射為java.lang.String
B.BLOB類型可以映射為java.sql.Blob
C.BLOB類型可以映射為byte[]
D.CLOB類型可以映射為java.lang.String或java.sql.Clob
19.在Hibernate中,關於Criteria運算方法說法錯誤的是(CD )。
A.Restrictions.ge( )方法等同於HQL運算子 >=
B.Restrictions.like("empName","s",MatchMode.START)方法用於尋找姓名以s開頭的員工
C.Restrictions.disjunction( )方法用於指定多個邏輯與
D.Restrictions.in( )方法只能用於數組
20.在Hibernate中,關於註解說法正確的是(ABD )。
A.@Id用於聲明持久化類的唯一標識,對應於資料表中的主鍵
B.@Cloumn用於將屬性對應到列
C.@Transient用於忽略該屬性,需要持久化到資料庫
D.@GeneratedValue用於定義主索引值的建置原則
解釋:Hibernate常見註解
@Id
@Column
@Table
@Entity
@GeneratedValue
@ManyToOne
@JoinColumn
/** * 部門類 * @author Happy 2016年9月22日19:40:56 * */@Entity 標識一個類是 持久化類@Table(name="DeptY2160")public class Dept { @Id 持久化類的標識 Hibernate_Session @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen") 定義自己的序列產生器 @SequenceGenerator(name="seq_gen",sequenceName="SEQ_Num",allocationSize=1,initialValue=1) private Integer deptNo; private String deptName; @OneToMany(mappedBy="dept",cascade={CascadeType.ALL})/* @Fetch(FetchMode.JOIN) @LazyCollection(LazyCollectionOption.FALSE)*/ private Set<Emp> emps=new HashSet<Emp>(); public Set<Emp> getEmps() { return emps; } public void setEmps(Set<Emp> emps) { this.emps = emps; } public Dept(Integer deptNo, String deptName) { this.deptNo = deptNo; this.deptName = deptName; } public Dept() { } public Integer getDeptNo() { return deptNo; } public void setDeptNo(Integer deptNo) { this.deptNo = deptNo; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } }
21.下列關於同義字的說法,選項正確的是(C )。
A.只能為表建立同義字,不能為視圖建立同義字
B.同義字只能用於引用其他使用者建立的表
C.公有同義字和私人同義字對同一個表可以同名
D.使用Drop Synonym語句刪除同義字的同時,同義字引用的表也無效
解釋:
主鍵建置原則
@GeneratedValue用於定義主索引值的建置原則 ,相當於native
22.評估CREATE TABLE 語句:
CREATE TABLE products
(
product_id NUMBER(6) CONSTRAINT prod_id_pk PRIMARY KEY,
product_name VARCHAR2(15)
)
下列關於prod_id_pk選項正確的是(B )。
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 )。
A.1
B.10
C.100
D.報錯
24.A_oe和A_hr是資料庫中的2個使用者,A_oe下有一個表Orders,執行下列語句如下:
CREATE ROLE r1; --System下
GRNAT SELECT,INSERT ON A_oe.orders to r1; --A_oe模式下
GRANT r1 to A_hr; --System模式下
GRANT SELECT ON A_oe.orders To A_hr; --A_oe模式下
REVOKE SELECT ON A_oe.orders FROM A_hr;
執行上面語句後結果正確的是(A )。
A.A_hr能夠查詢A_oe.orders表
B.A_hr不能夠查詢A_oe.orders表
C.REVOKE語句將撤銷A_hr的SELECT許可權同時也從r1角色撤銷SELECT許可權
D.REVOKE語句將報錯,因為SELECT許可權已經被r1角色授予
25.對於視圖,下列語句正確的是(CD )。
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).編寫調用程式,要求測試各種情況
《使用Hibernate開發租房系統》自我裝載筆試題