《使用Hibernate开发租房系统》内部测试笔试题

                                                    笔试总结

1.在Hibernate中,以下关于主键生成器说法错误的是( C)。

Aincrement可以用于类型为longshortbyte的主键

Bidentity用于如SQL ServerDB2MySQL等支持标识列的数据库

Csequence用于如OracleSQL Server等支持序列的数据库

DnativeHibernate根据底层数据库自行判断采用何种主键生成策略,是由使用的数据库生成主键的值

2.在Hibernate中,关于脏检查和刷新缓存说法正确的是( AB)。

A.当事务提交时,会发生脏检查

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

C.在执行Sessioncommit( )方法之前不会调用Sessionflush( )方法

D.编写代码时,调用commit( )方法之前要调用flush( )方法

解析:1.脏检查是事务提交的时候进行的

      2.刷新缓存:刷新缓存的事情就是脏检查

        两种方式:方式一:事务提交;方式二:session.flush();

3.使用HQL查询所有部门信息,以下正确的是(AD )。

Afrom Dept

Bselect * from cn.jbit.demo.entity.Dept   //应去掉*

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

Dselect d from Dept d

解析: from Dept   检索所有部门的信息

  select d from cn.happy.entity.Student d 检索所有部门的信息 很sb的写法

  select d from Dept d

4.关于Query接口的list( )iterate( )方法,说法正确的是( AD)。

A.执行list( )方法,查询所有符合条件的记录

B.执行iterate( )方法,查询所有符合条件的记录

C.执行list( )方法,查询出所有符合条件的主键值

D.执行iterate ( )方法,查询出所有符合条件的主键值

5.在HQL中,关于Query接口绑定参数的方法,说法正确的是(ABCD )。

AsetParameter( )方法用于绑定任意类型的参数

BsetParameter( )有重载的方法

CsetProperties( )有重载的方法

DsetProperties( )方法用于绑定命名参数

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

D<many-to-one>标签中的column属性值DEPTNOdept表的主键名

解析:D选项中column属性值deptNoemp表中的外键列

7.在Hibernate映射文件中,关于inverse属性说法正确的是(ACD )。

Ainverse属性有两个值:truefalse

B<many-to-one>标签有inverse属性

C<set>标签有inverse属性

Dinverse属性用于指定维护关联关系的那一方

解析:维护关联关系

     true: 自己不维护关联关系,对方维护

     false:自己维护关联关系

8.在Hibernate映射文件中,关于延迟加载配置说法错误的是(BD )

A<class>标签中lazy属性可选值:truefalse

B<set>标签中lazy属性可选值:trueproxyno-proxy

C< set>标签中lazy属性可选值:true、extrafalse

D<many-to-one>标签中lazy属性可选值:proxytruefalse 

解析:延迟加载  lazy  hibernate 3.6.10版    hibernate 5

 分类

    类级别  true(默认),false

    一对多和多对多 truedefault,false,extra(加强延迟加载)

    多对一(没有set)  proxy(default),no-proxy,false

9.在Hibernate映射文件中,关于<component>标签说法正确的是(ABC )。

A<component>标签用来映射组件类

B<component>标签通过<parent>指定组件类所属的整体类

C<component>标签通过<property>指定组件类的属性

D<component>标签有idnameclass属性

解析:没有ID

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

A<sqlMapConfig>

B<configuration>

C<setting>

D<environments>

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

AExecutorType.SIMPLE

BExecutorType.BATCH

CExecutorType.EXECUTE

DExecutorType.REUSE

解析: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)。

AHibernate缓存一般分为三类:一级缓存、二级缓存和查询缓存

BSessionevict( )方法用于从缓存中清除指定的持久化对象

CSessionclear( )方法用于刷新缓存

DSessionflush( )方法用于从缓存中清除所有持久化对象

解析:CD 说反了

13.关于HQL的连接查询,说法错误的是( D)。

Ainner join join用于内连接

Binner join fetchjoin fetch用于迫切内连接

Cleft outer join fetch left join fetch用于迫切左外连接

Dright outer join fetch right join fetch用于迫切右外连接

解析:right outer joinright join用于迫切右外连接

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 )。

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用于找到最早入职的员工的入职时间

 解释:HQL面向的是对象和属性,不是表和字段

16.关于HQL子查询中,说法错误的是( C)。

Asize( )size用于获取集合中元素的数目

Belements( )获取集合中的所有元用于素

Cany关键字用于子查询语句返回所有记录

Din关键字与“=any”意思相同

解析:any关键字用于子查询语句返回任意一条记录

17.关于原生SQL查询和命名查询,说法正确的是(ABC )。

A执行原生SQL,需使用SQLQuery对象

BSQLQuery是一个接口,继承了Query接口

CHibernate支持在映射文件中定义字符串形式的查询语句,这样的语句是命名查询语句

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中的BLOBCLOB类型的方法,说法正确的是( BCD)。

ACLOB类型只能映射为java.lang.String

BBLOB类型可以映射为java.sql.Blob

CBLOB类型可以映射为byte[]

DCLOB类型可以映射为java.lang.Stringjava.sql.Clob

解析:BLOB数据类型:byte[]   java.sql.Blob

        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( )方法用于指定多个逻辑与

DRestrictions.in( )方法只能用于数组

解析:C:逻辑或

         D:还能用于collection

20.在Hibernate中,关于注解说法正确的是( ABD)。

A@Id用于声明持久化类的唯一标识,对应于数据表中的主键

B@Cloumn用于将属性映射到列

C@Transient用于忽略该属性,需要持久化到数据库

D@GeneratedValue用于定义主键值的生成策略

解释:Hibernate常见注解

@Id
@Column
@Table
@Entity
@GeneratedValue
@ManyToOne
@JoinColumn

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 )。

A1

B10

C100

D.报错

24A_oeA_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 )。

AA_hr能够查询A_oe.orders

BA_hr不能够查询A_oe.orders

CREVOKE语句将撤销A_hrSELECT权限同时也从r1角色撤销SELECT权限

DREVOKE语句将报错,因为SELECT权限已经被r1角色授予

25.对于视图,下列语句正确的是( CD)。

A.有列别名的视图不能被修改

B.一个复杂的视图定义中使用子查询不能包含聚合(分组)函数和连接

C.如果一个视图定义中包含DISTINCT关键字,则不能够通过视图进行删除

D.创建视图语法中OR REPLACE 选项被使用,目的是在没有删除视图的情况下修改已存在的视图定义。

原文地址:https://www.cnblogs.com/yangronglin/p/5900593.html