一、填空题
1、MyBatis配置文件的根标签为<configuration>。
2、在MyBatis 中用于设置别名的元素为<typeAlias>。
3、在MyBatis中用于配置数据源的元素是<dataSource>。
4、在MyBatis 中用于配置环境的元素是<environment>。
5、<resultMap>中用于映射主键的元素为<id>。
6、<resultMap>中用于映射普通字段的元素为<result>。
7、映射结果集中用于指定POJO类的变量的属性为property。
8、映射结果集中用于指定表的字段的属性为column。
9、<association>元素的javaType属性用于指定POJO中属性的类型。
10、<collection>元素的ofType的属性用于指定多方的数据表对应的POJO类。
11、在Mybatis的映射文件中,用于映射一对一关系的元素是<association>。
12、在Mybatis的映射文件中,用于映射一对多关系的元素是<collection>。
13、在<selectKey>元素的属性中,用于指定数据表主键字段的是keyColumn。
14、<if>元素主要用于条件判断,它类似于Java代码中的if语句,通常与test属性联合使用。
15、<choose>元素适用于多个判断条件的场景,它类似于Java代码中的switch语句。
16、<foreach>元素用于遍历集合,通常用于SQL语句中的in关键字。
17、在 MyBatis 中,一级缓存是SqlSession级别的缓存。
18、在MyBatis中,二级缓存是 Mapper级别的缓存。
19、在MyBatis中,一级缓存是默认开启的,二级缓存是手动开启的。
20、Spring 常用的依赖注入有构造函数注入和setter函数注入。
21、<property>元素中使用value属性表示传递基本数据类型,使用ref属性表示传递Bean。
22、在Spring 配置文件中<bean>元素的class属性指定Bean对应类的全路径。
23、在Spring配置文件中<bean>元素的scope属性指定Bean 的作用域。
24、在Spring 配置文件中<bean>元素的parent属性指定 Bean的父 Bean。
25、lazy-init 属性使得Bean在调用getBean()时才会被实例化。
26、在Spring配置文件中<property>元素用于setter函数注入(属性注入)。
27、在Spring配置文件中<constructor-arg>元素用于构造器注入。
28、在Spring配置文件中,基本数据类型的传递使用value属性,对象的传递使用ref属性。
29、直接作用于属性以实现自动装配的注解为@Autowired。
30、对属性进行初始化的注解为@Value。
31、若userBean的name不为空,则使用该值,否则赋予变量默认值admin,满足以上条件的注解应该为@Value("#{userBean.name?:'admin'}")。
32、若外部配置文件中定义jdbc.name,则使用该值,否则赋予变量默认值admin,满足以上条件的注解应该为@Value("${jdbc.name:admin}")。
33、@Resource注解完成byname模式的自动装配。
34、@Autowired 实现的是byType模式的自动装配。
35、使用@Qualifier注解可在多个同类型的 Bean中指定具体需要匹配 Bean的id。
36、@Value用于注入外部配置文件的标识符为${},用于注入SpEL表达式对应的内容的标识符为#{}。
37、用于扫描所有组件类的元素为<context:component-scan>。
38、用于扫描指定类的元素为<context:include-filter>。
39、用于过滤指定类的元素为<context:exclude-filter>。
40、Spring AOP的实现机制有JDK动态代理和CGLib动态代理。
41、在默认情况下,Spring AOP的实现方式是JDK动态代理。
42、Spring JDBC的核心类为JdbcTemplate。
43、使用Spring JDBC封装 Dao时,可以通过继承JdbcDaoSupport类的方式实现。
44、Spring配置文件中<bean>元素用于自动装配的属性为autowire。
45、按照属性名进行自动装配的属性值为byName。
46、按照属性数据类型进行自动装配的属性值为byType。
47、按照构造器进行自动装配的属性值为constructor。
48、单例模式下Bean的scope的值为singleton。
49、原型模式下Bean的scope的值为prototype。
50、Bean的默认作用域为singleton。
51、事务的四个特性分别是原子性、隔离性、一致性和持久性。
52、在Spring事务中,默认的事务传播行为是PROPAGATION_REQUIRED。
53、在Spring中用于事务管理的注解为@Transactional。
54、在Spring中,事务管理主要有两种方式,他们分别为编程式和声明式。
55、Spring的声明式事务管理需要基于Spring AOP实现。
56、@Transactional注解中用于指定事务隔离级别的属性为isolation。
57、@Transactional注解中用于指定事务传播行为的属性为propagation。
58、@Transactional注解中用于指定导致事务回滚的异常类型的属性为rollbackFor。
59、@Transactional注解中用于指定不会导致事务回滚的异常类型的属性为noRollbackFor。
60、@Transactional注解中用于设置隔离级别的枚举类为Isolation。
61、@Transactional注解中用于设置事务传播行为的枚举类为Propagation。
62、@Transactional默认的事务传播行为为Propagation.REQUIRED。
63、Spring MVC提供的@RequestMapping注解用于处理请求地址映射。
64、Spring MVC提供的@RequestParam注解用于将请求参数赋值给方法的形参。
65、Spring MVC提供的@PathVariable注解用于获取URL中的动态参数。
66、Spring MVC提供的@CookieValue注解用于获取Cookie数据。
67、Spring MVC提供的@RequestHeader注解用于获取请求头中的数据。
68、Spring MVC前端控制器为DispatcherServlet。
69、在Spring MVC的控制器中,用户提交请求的数据是通过方法形参来接收的。
70、Spring MVC 默认支持的绑定参数类型有HttpServletRequest、HttpServletResponse、HttpSession、Model/ModelMap。
71、在绑定POJO类型时,如果POJO类中的属性名称与请求名称不一致可以使用@RequestParam注解标注。
72、在实际开发的过程中,当遇到无法解析的数据类型时可以自定义参数解析接口HandlerMethodArgumentResolver。
73、使用@ExceptionHandler注解可以实现一个专门用于处理异常的Controller。
74、使用@ControllerAdvice和@ExceptionHandler注解可以实现全局的异常捕捉。
75、HandlerInterceptor接口的三个方法分别是preHandle方法,postHandle方法和afterCompletion方法。
76、拦截器的拦截功能是基于Java的动态代理来实现的。
77、用于配置自定义参数解析器的标签<mvc:argument-resolvers>。
78、在目标方法执行之前执行增强代码的通知为前置通知,对应注解为@Before,对应的Spring AOP的XML元素为<aop:before>。
79、在目标方法正常执行之后执行增强代码的通知为返回通知,对应注解为@AfterReturing,对应的Spring AOP的XML元素为<aop:after-returing>。
80、在目标方法执行之后执行的通知为后置通知,对应注解为@After,对应的Spring AOP的XML元素为<aop:after>。
81、在目标方法执行之前和之后都可以执行增强代码的通知为环绕通知,对应注解为@Around,对应的Spring AOP的XML元素为<aop:around>。
82、在目标方法抛出异常时执行的通知为异常通知,对应注解为@AfterThrowing,对应的Spring AOP的XML元素为<aop:after-throwing>。
二、选择题
1、在MyBatis的功能架构中,负责具体的参数映射、SQL解析、SQL执行和执行结果映射处理等的是(B)。
A、API接口层
B、数据处理层
C、基础支撑层
D、SQL执行层
2、关于MyBatis的配置文件,下列选项错误的是(B)。
A、MyBatis 通过其配置文件获取基础配置信息
B、MyBatis的配置相对简单,在编写配置文件时无须关心元素顺序
C、MyBatis配置文件的根元素是<configuration>元素
D、在编写MyBatis配置文件时,不是所有的元素都必须配置
3、关于MyBatis的一级缓存,下列选项错误的是(D)。
A、当程序对数据库执行DML操作后,MyBatis 会删除一级缓存
B、当一级缓存开启时,如果SqlSession第一次执行某查询语句,MyBatis会将结果自动写入一级缓存
C、当一级缓存开启时,如果SqlSession第二次执行某查询语句,MyBatis可以获取与第一次一样的结果
D、MyBatis一级缓存不能关闭
4、以下元素使用错误的是(C)。
A、<property name="id" value="1">
B、<property name="spellChecker" ref="spellChecker">
C、<property ref="spellChecker">
D、<constructor-arg ref="spellChecker">
E、<constructor-arg value="1">
F、<constructor-arg name="id" value="1">
G、<constructor-arg name="spellChecker" ref="spellChecker">
5、下列注解中,可用于指定Bean的作用域的是(C)。
A、@Controller
B、@Repository
C、@Scope
D、@Service
6、关于AOP,下列选项错误的是( B)。
A、AOP是Spring框架的一个重要特性
B、AOP引入了抽象、封装、继承的概念
C、AOP主张将程序中相同的业务逻辑进行横向隔离
D、AOP能够降低耦合,提升程序的可维护性
7、关于JDK动态代理,下列选项错误的是(D)。
A、JDK动态代理主要通过InvocationHandler和Proxy这两个API
B、InvocationHandler是一个接口,可以通过实现该接口来定义逻辑
C、Proxy利用InvocationHandler 动态生成目标类的代理对象
D、当目标对象为一个类时,Spring AOP通过使用JDK动态代理来实现
8、关于Spring AOP配置文件中的元素,下列选项错误的是 (D)。
A、<aop:config>元素是AOP配置的根元素
B、<aop:aspect>元素用于定义切面
C、<aop:pointcut>元素用于指定切点
D、<aop:after-exception>元素指定异常通知
9、在下列注解中,可以指定切面优先级的是(B)。
A、@Aspect B、@Order C、@Pointcut D、@Around
10、关于Spring JDBC,下列选项错误的是(B)。
A、Spring JDBC是对传统JDBC的改进和增强
B、Spring JDBC和传统JDBC 完全没有关联
C、Spring JDBC的core包负责提供核心功能
D、Spring JDBC的support包负责提供支持类
11、在下列选项中,不属于C3PO连接池必备属性的是 (D)。
A、driverClass B、jdbcUrl C、user D、initialPoolSize
12、在JdbcTemplate类提供的方法中,用于查询单条记录的是(C)。
A、batchUpdate() B、queryForList()
C、queryForObject() D、update()
13、关于Spring JDBC的结果集处理,下列选项错误的是 (B)。
A、如果要将表记录映射为自定义的类,则需要使用RowMapper<T>接口
B、如果查询返回的结果为int类型,则调用query(sql)方法直接返回结果
C、RowMapper<T>接口定义了mapRow()方法并通过该方法提供功能
D、BeanPropertyRowMapper<T>是RowMapper<T>接口的实现类
14、关于Spring JDBC的结果集处理,下列选项错误的是(A)。
A、execute()常用于执行DQL操作
B、queryForList()常用于执行DQL操作
C、 update()常用于执行DML操作
D、queryForObject()常用于执行DQL操作
15、在下列隔离级别中,允许可重复读并且可以避免脏读、不可重复读的是( C)。
A、ISOLATION_READ_UNCOMMITTED
B、ISOLATION_READ_COMMITTED
C、ISOLATION_REPREATABLE_READ
D、ISOLATION_SERIALIZABLE
16、在TransactionTemplate类提供的方法中,用于定义需要在事务环境中执行的数据访问逻辑的是(A)。
A、 execute() B、getTransactionManager()
C、rollbackOnException() D、commit()
17、关于Spring MVC的功能组件,下列选项错误的是 (B)。
A、前端控制器负责拦截客户端请求并分发给其他组件
B、处理器适配器负责根据客户端请求的URL寻找处理器
C、处理器负责对客户端的请求进行处理
D、视图解析器负责视图解析,它可以将处理结果生成View
18、关于Spring MVC的工作流程,下列选项错误的是 (B)。
A、客户端发送HTTP请求,请求将首先由DispatcherServlet处理
B、DispatcherServlet 接受到请求后,通过相应的HandlerAdapter解析出目标Handler
C、DispatcherServlet通过ViewResolver'完成逻辑视图名到真实View对象的解析
D、DispatcherServlet将最终的View对象响应给客户端并展示给用户
19、在ModelAndView类提供的API中,用于设置视图名称的是(B)。
A、setView() B、setViewName() C、 hasView() D、addObject()
20、下列类中,充当处理器映射器的是 (A)。
A、HandlerMapping B、Handler C、HandlerAdapter D、ViewResolver
21、在RequestMapping注解提供的属性中,用于指定该方法可以处理的HTTP请求方式的是(B)。
A、value B、method C、consumes D、params
22、关于Spring MVC的参数绑定,下列选项正确的是(C)。
A、Spring MVC中默认支持的参数绑定类型,可以不用声明直接使用
B、在参数传递时,如果参数名称不同,但是参数的类型、个数、顺序都相同,即可完成参数的绑定
C、在参数传递时,如果参数名称不同,可以使用@RequestParam注解标注
D、Spring MVC在控制器类中只能通过getParameter方法接受参数
23、HandlerMethodArgumentResolver接口中包括(A)两个方法。
A、supportParameter、resolveArgument
B、addObject、handler
C、 preHandle、postHandle
D、addAccount、updateAccount
24、关于Spring MVC支持的参数绑定类型,下列选项正确的是 (D)。
A、Spring MVC不支持绑定自定义的数据类型
B、Spring MVC不支持绑定的集合类型
C、Spring MVC不支持绑定数组类型
D、以上说法均错误
25、以下关于HandlerInterceptor 中的三个方法说法正确的是 (A)。
A、postHandle在业务处理器处理请求执行完成后,视图解析之前执行
B、afterConmpletion返回值为ModelAndView
C、postHandle返回值为Boolean
D、preHandele没有返回值
26、下列关于HandlerInterceptor和WebRequestInterceptor的说法错误的是(D)。
A、两个接口都可用于Controller层请求拦截,接口中定义的方法作用也是一样的
B、WebRequestInterceptor的入参WebRequest包装了HttpServletRequest和
HttpServletResponse
C、WebRequestInterceptor的preHandle是没有返回值的,说明该方法中的逻辑并不会影响后续的方法执行
D、HandleInterceptor的 preHandle是没有返回值的,说明该方法中的逻辑并不会影响后续的方法执行
27、下列说法错误的是(D)。
A、拦截器Interceptor的拦截功能是基于Java的动态代理来实现的
B、拦截器可用于拦截Controller 层接口,表现形式像Spring AOP
C、WebRequestInterceptor接口与HandleInterceptor接口的用法相似,只是WebRequestInterceptor的preHandle没有返回值
D、所有拦截器都不需要配置在Spring MVC的配置文件中
三、程序填空题
1、若需返回自增主键对应的类变量为cardId,请完善以下代码:
<insert id ="insert" parameterType="CardPOJO" useGeneratedKeys="true" keyProperty="cardId">
...
</insert>
2、若存在唯一的SpellChecker类型的 bean,则将其注入,否则匹配 id为spell的bean。请按以上要求完善以下代码。
public TextEditor {
@Autowired
@Qualifier("spell")
private SpellChecker spellChecker;
}
3、Spring 只会将非Controller类型的 Bean注入IOC容器,请根据以上要求完善以下代码。
<context:component-scan base-package="cn.edu.hnit.example" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
4、请将数据访问层和业务层载入IOC容器,并数据访问层自动注入到业务层,请根据以上要求完善以下代码。
@Repository
public class UserDaoImpl extends BaseDaoImpl<User>{
...
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDaoImpl userDao;
...
}
5、完善以下代码。
public class StudentDaolmpl extends JdbcDaoSupport {
public void insert(StudentPOJO student){
String sql = "insert into student (student_name,age,course) value(?,?,?)";
getJdbcTemplate().update (sql,student.getStudentName(),student.getAge(), student.getCourse());
}
}
6、完善以下代码。
public static void main(String[] args) throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class);
String sql = "select * from student where student_id= ?";
RowMapper<StudentPOJO> rowMapper = new StudentRowMapper<StudentPOJO>();
StudentPOJO student = jdbcTemplate.query(sql, rowMapper, "1");
}
7、填写完善以下代码,使得请求/get/ {id}与get方法匹配。
@Controller
public class StudentController {
@RequestMapping(value= "/get/{id}", produces="applicationljson; charset=UTF-8")
public StudentPOJO get(@PathVariable("id") String studentld){}
}
8、填写完善以下代码,使得请求/student/insert 与insert方法匹配,请求方式为POST。
@Controller
@RequestMapping("student")
public class StudentController {
@PostMapping("/insert")
public void insert(@RequestBody StudentPOJO studentPOJO){}
}
9、填写完善以下代码,使得请求/get 与get方法匹配,请求方式为Get,请求参数名为id,响应数据以JSON格式返回。
@Controller
public class StudentController {
@GetMapping("get")
@ResponseBody
public StudentPOJO get(@RequestParam("id") String studentld){}
}
10、将在SpringMVC配置文件中完成自定义参数解析器的配置。
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.example.MyResovler"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
四、编程题
1、根据以下表字段与类属性的对应关系,在Mybatis配置文件中定义get方法,该方法可根据主键card_id获取card_info表数据,表对应的类的别名为CardPOJO。请给出定义的<ResultMap>和<select>。
<resultMap id ="cardResultMap" type="CardPOJO">
<id property="cardId" column="card_id">
<result property="balance" column="balance">
</resultMap>
<select id="get" resultMap="cardResultMap">
select * from card where card_id = #{cardId}
</select>
2、请根据以下POJO类的属性写出对应的 BlogPOJO对应的ResultMap,POJO类变量对应表字段名一致,BlogPOJO类的别名为BlogPOJO。
public class BlogPOJO{
int id;
String title;
AuthorPOJO authorPOJO;
}
public class AuthorPOJO{
int authorId;
String name;
}
<resultMap id="blogResultMap" type=BlogPOJO">
<id property=id" column="id"/>
<result property="title" column="title"/>
<association property="authorPOJO" javaType="AuthorPOJO">
<id property="authorld" column="authorId"/>
<result property="name" column="name"/>
</association>
</resultMap>
3、请根据以下POJO类的属性写出对应的AuthorPOJO对应的ResultMap,POJO类的变量与表的字段名一致。
public class AuthorPOJO{
int id;
String name;
List<BlogPOJO> blogList;
}
public class BlogPOJO{
int blogId;
String title;
}
<resultMap id="authorResultMap" type="AuthorPOJO">
<id property="id" column="id">
<result property="name" column="name"/>
<collection property="blogList" javaType="ArrayList" ofType="BlogPOJO">
<id property="blogId" column="blogId"/>
<result property="title" column="title"/>
</collection>
</resultMap>
4、当major 不为空时,执行select *from student where major = ?;当name不为空时,执行select * from student where name = ?;以上两个条件不满足则执行select * from student where class = ?。请使用Mybatis的动态SQL实现以上功能。注意:该SQL语句对应的方法名为get,返回数据类型的别名为StudentPOJO。
<select id="get" resultType="StudentPOJO">
select * from student
where
<choose>
<when test="major!=null and major!=''" >major = #{major }</when>
<when test="name!=null and name!=''" >name = #{name}</when>
<otherwise>class = #{class}</otherwise>
</choose>
</select>
5、DAO接口存在方法List<User> getByIds(List<Integer> ids),请使用Mybatis的动态语言按照学号的逆序返回user表中 id存在于参数列表中的记录,注意,数据库表的字段与POJO类的字段名一致,POJO类的别名为User。
<select id="getBylds" resultType="User">
select * from user
where id in
<foreach collection="list" item="id" index="index" separator="," open="(" close=")">
#{id}
</foreach>
order by id desc
</select>
6、如果major,name,class 不为空,则根据id更新对应数据。请使用Mybatis使用以上功能。注意DAO接口对应的方法为void update(Student student),Mybatis定义POJO类Student的别名为Student,数据库表student的字段与POJO类的字段名一致。
<update id="update">
update student
<set>
<if test="major != null and major !=''">major= #{major} ,</if>
<if test="name != null and name !=''">name = #{name}>,</if>
<if test="class != null and class !=''">class= #{class}>,</if>
</set>
</update>
7、使用动态SQL实现person表的查询,接口方法为List<PersonPOJO> getList(HashMap<String, Object> map),map 中键的取值范围为minAge,maxAge和address,筛选条件如下:
(1)当address的值不为空时,根据其值做模糊匹配
(2)当minAge或maxAge不为空时,根据其中做age范围限定
(3)当以上条件都不满足时,检索整张表的记录。
PersonPOJO类的别名为PersonPOJO,表的字段与POJO类的属性命名一致。
<select id="getList" resultType="PersonPOJO">
select * from person
<where>
<if test="address != null and address != ''">desc like #{address}</if>
<if test="minAge != null" >AND age >= #{minAge}</if>
<if test="maxAge != null">AND age <= #{maxAge}</if>
</where>
</select>
8、根据以下表字段与类属性的对应关系,在Mybatis配置文件中定义insertOne方法,该方法可根据将CardPOJO类的数据插入card_info表中。请给出定义的<insert>。
<insert id="insertOne">
insert into card_info(card_id, balance) values (#{cardId}, #{balance})
</insert>
五、简答题
1、简述MyBatis自带的—级和二级缓存的工作原理?
—级缓存是 SqlSession级别的缓存,其生命周期即为SqlSession的生命周期。当执行查询操作时,MyBatis 会将结果写入一级缓存,当在SqlSession中执行更新(DML)操作时,一级缓存会被清空。
二级缓存是Mapper级别的缓存,其是基于事务的。当执行查询操作且提交事务后,MyBatis才会将结果写入二级缓存,当在同一个Mapper 中执行更新(DML)操作时,二级缓存会被清空。
2、简述AOP的概念。
AOP是 Aspect Oriented Programming (面向切面编程)的缩写,和OOP不同,它主张将程序中的相同业务逻辑进行横向隔离,并将重复的业务逻辑抽取到一个独立的模块中,最终实现提升程序可复用性和开发效率的目的。
3、简述AOP的实现原理。
AOP的本质是由AOP框架修改业务组件的多个方法的源代码,按照AOP框架修改源代码的时机,可以将其分为两类:
静态AOP实现,AOP框架在编译阶段对程序源代码进行修改,生成了静态的AOP代理类,比如AspectJ。
动态AOP实现,AOP框架在运行阶段通过JDK动态代理或CGLib动态地生成AOP代理动态生成代理对象,如Spring AOP。
4、简述Spring AOP的实现原理。
Spring AOP通过动态代理实现,根据动态代理实现方式的不同可以分为JDK动态代理和CGLib动态代理。
JDK动态代理:利用反射机制生成一个实现代理接口的类。
CGLib 动态代理:利用ASM (开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
5、简述Spring MVC的工作流程。
(1)客户端发送请求给前端控制器,前端控制器分发请求给具体的后端处理器
(2)后端处理器执行具体业务逻辑,并返回ModelAndView
(3)视图解析器解析并返回视图
(4)前端控制器渲染视图,并将其返回给客户端
6、简述MyBatis具有的功能架构。
API接口层:提供给外部使用的接口API,开发人员通过这些API来操纵数据库。API接口层接收到调用请求时,它会调用数据处理层来完成具体的数据处理。
数据处理层:负责具体的参数映射、SQL解析、SQL执行和执行结果映射处理等。它主要的功能是根据调用的请求完成—次数据库操作。
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载、缓存处理等,MyBatis将这些共用的功能抽取出来作为最基础的组件,为上层的数据处理层提供支持。