JavaWeb编程面试题
面试题持续更新中…
1.什么是 MyBatis?(简述题)
(1)MyBatis 是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态 SQL,可以严格控制SQL执行性能,灵活度高。
(2)MyBatis 可以使用 XML或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
(3)通过 XML 文件或注解的方式将要执行的各种statement配置起来,并通过Java对象和statement中SQL的动态参数进行映射生成最终执行的SQL语句,最后由mybatis框架执行SQL并将结果映射为Java对象并返回。(从执行SQL到返回result的过程)
2.MyBatis 优缺点?(简述题)
优点:
(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 中,解除SQL与程序代码的耦合,便于统一管理。提供 XML 标签,支持编写动态SQL语句,并可重用;
(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库 MyBatis都支持);
(4)能够与Spring 很好的集成(MyBatis官方提供与Spring的整合包);
(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
缺点:
(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
3.MyBatis 框架适用场合?(简述题)
MyBatis专注于SQL自身,是一个足够灵活的DAO层解决方案。对性能的要求很高,或者需求变化较多的项目,例如Web项目,互联网项目等等,MyBatis都是不错的选择。
5.MyBatis 和 Hibernate 的区别?(简述题)
(1)MyBatis 和 Hibernate 不同,它不是一个完全的 ORM 框架,因为 MyBatis 需要程序员自己编写 SQL 语句;
(2)MyBatis 直接编写原生态SQL,可以严格控制SQL执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一旦有需求变化可以迅速输出成果。但是灵活的前提是 MyBatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套SQL映射文件,工作量大。
(3)Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用Hibernate开发可以节省很多代码,提高效率。
6.MyBatis 有哪些动态标签?(简述题)
7.mybatis中一对一如何实现?(简述题)
在映射文件中 resultMap元素里配置 association节点,配置一对一的类就可以完成。
8.mybatis中一对多如何实现?(简述题)
在映射文件中 resultMap 里面配置 collection 节点,配置一对多的类就可以完成。
9.mybatis编程步骤?(简述题)
10.简述MyBatis的一级缓存和二级缓存?(简述题)
11.#{} 和 ${} 区别?(简述题)
#{}
表示一个占位符号,可以有效防止sql注入。${}
表示拼接sql串,在低版本中括号中只能是value。#{}
表示一个占位符号,通过#{}
可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}
可以有效防止sql注入。#{}
可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}
括号中可以是value或其它名称。${}
表示拼接sql串,通过${}
可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转 换${}
可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,低版本中${}
括号中只能是value。12.Mybatis的mapper.xml文件中常用标签有哪些?(简述题)
13.Mybatis的xml映射文件中,不同的xml映射文件,id是否可以重复?(简述题)
不同的xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;原因就是namespace+id是作为Map
备注:在旧版本的Mybatis中,namespace是可选的,不过新版本的namespace已经是必须的了。
14.MyBatis 分页如何处理?(简述题)
mybatis分页查询有两种方案:
15.Mybatis是如何进行分页的?分页插件的原理是什么?(简述题)
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
16.如何获取自动生成的主键?(简述题)
自增主键返回
<insert id="insertTeacher" parameterType="Teacher" >
<selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER">
SELECT LAST_INSERT_ID()
selectKey>
INSERT INTO teacher (name,idcard,sex) VALUES (#{name},#{idcard},#{sex})
insert>
<insert id="insertTeacher" parameterType="Teacher" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO teacher (name,idcard,sex) VALUES (#{name},#{idcard},#{sex})
insert>
非自增主键返回
mysql 使用 uuid 实现主键,需要修改表中 id 字段类型为 varchar,长度至少36位。
执行思路:先通过 uuid() 查询到主键,将主键输入到 SQL 语句中。执行 uuid() 语句顺序相对于 insert语句在之前。
<insert id="insertTeacher" parameterType="Teacher">
<selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE">
SELECT UUID()
selectKey>
INSERT INTO teacher (id,name,idcard) VALUES (#{id},#{name},#{idcard})
insert>
17.在mapper中如何传递多个参数?(简述题)
第一种:直接多个参数
// DAO层 接口
User listUsers(String name, String sex);
<select id="listUsers" resulType="User">
select * from user where name=#{0} and sex=#{1}
select>
第二种:使用@param注解
// DAO层 接口
User listUsers(@param("uname") String name, @param("usex") String sex);
<select id="listUsers" resulType="User">
select * from user where name=#{uname} and sex=#{usex}
select>
第三种:多个参数封装成map集合
// 映射文件的命名空间.sql片段的id,就可以调用对应的映射文件的SQL
// 由于参数超过了两个,而方法中只有一个Object参数收集,因此我们使用Map集合来封装参数
Map<String, Object> map = new HashMap<>();
map.put("uname", "张三");
map.put("usex", "男");
sqlSession.selectList("user.listUsers", map);
<select id="listUsers" resulType="User">
select * from user where name=#{uname} and sex=#{usex}
select>
18.使用mapper接口开发DAO时有哪些要求?(简述题)
19.MyBatis的配置文件sqlMapConfig.xml中有哪些内容?(简述题)
配置内容和顺序如下: