面试必问:mybatis精选面试题总结
在平常的开发工作中,经常需要对数据库操作。现在好多项目中都会使用mybatis框架。那么,mybatis主要的知识点都有哪些呢?今天,写下mybatis常见面试题总结。
1:mybatis中#和$的区别?
#可以有效的防止sql注入,$不能防止sql注入;#预编译是采用占位符的方式?,$则是字符串值替换。
2:mybatis中resultType和resultMap的区别?
resultType和resultMap都是返回对象的,resultType实体类字段必须和数据库字段一一对应,而resultMap如果两者字段名不同,则可通过定义resultMap进行字段的映射。所以,一般开发中用的resultMap比较多,因为可以自定义,所以用起来比较方便。
3:mapper文件中,常见的xml标签有哪些?
常见的标签:select、insert、update、delete、resultMap、resultType、include、selectKey,动态标签:where、foreach、if、choose、when、otherwise等。
4:批量删除的实现?
<delete id="deleteBatchUser" parameterType="java.util.List">
delete from user where id in
<foreach collection="list" index="index" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</delete>
5:mybatis是如何进行分页的?分页插件的原理是什么?
mybatis可以使用RowBounds对象进行分页,也可以直接编写sql进行分页。RowBounds针对ResultSet结果集进行的内存分页,而非物理分页。会将数据一次性全部查出来,然后根据RowBounds对象传递的值进行分页,可以在其中传递两个参数offset和limit,第一个参数为起始行,第二个参数为取多少条记录。在原有查询接口的基础上,新增参数RowBounds即可。
分页插件的原理是使用用mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
6:mybatis中动态sql是什么意思?都有哪些动态sql的标签?
动态sql可以实现在xml文件中,以标签的形式进行动态sql拼接,完成逻辑判断和动态拼接的功能。mybatis提供了九种动态sql标签:where、foreach、trim、set、when、choose、if、bind、otherwise。
7:如何设置自增长的主键?
<insert id="insertUser" parameterType="com.example.model.entity.User" useGeneratedKeys="true" keyProperty="id" keyColumn = "id">
INSERT INTO USER (username,CODE) VALUES (#{username},#{CODE})
</insert>
8:当实体类对象和表的字段不一致时怎么解决?
resultMap如果两者字段名不同,则可通过定义resultMap进行字段的映射。实例如下:
<resultMap type="student" id="studentResult">
<result property="studentId" column="student_id"/>
<result property="studentName" column="student_name"/>
</resultMap>
9:mybatis中怎样实现模糊查询?
1)使用$,存在sql注入风险,不推荐使用
<select id="query" resultMap="studentResult">
select * from student where name like '%$(name)%'
</select>
2)使用#,预编译,无sql注入风险
<select id="query" resultMap="studentResult">
select * from student where name like "%"#(name)"%"
</select>
3)使用concat拼接:
<select id="query" resultMap="studentResult">
select * from student where name like CONCAT(CONCAT('%', #{name}), '%');
</select>
10:mybatis中的一级缓存和二级缓存?
mybatis的内部缓存结构是HashMap。一级缓存是SqlSession级别的缓存,二级缓存是mapper级别的缓存。mybatis默认开启一级缓存。一级缓存的作用域是SQLSession,在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。当执行SQL查询中间发生了增删改的操作,MyBatis会把SqlSession的缓存清空。
总结:以上总结了mybatis常见的面试题。
知识就是要不断的学习,不断的复习,才会记忆的更加的深刻。加油,美好的风景一直在路上!