在平常的开发工作中,经常需要对数据库操作。现在好多项目中都会使用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常见的面试题。

知识就是要不断的学习,不断的复习,才会记忆的更加的深刻。加油,美好的风景一直在路上!

更多推荐

面试必问:mybatis精选面试题总结