欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-04 23:21:59
...

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

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