Mybatis面试题分享

1.mybatis是什么

是一个半自动ORM(对象关系映射)框架,内部封装了JDBC,开发时只需要关注SQL就可以,不需要花费精力去处理数据库驱动、数据库连接等过程。

2.mybatis的优点和缺点

优点:
①因为内置JDBC,所以减少了大量的代码冗余。
②基于SQL编程,很灵活,SQL写在xml文件里,与程序解耦,便于管理。
③兼容各种数据库。
④提供映射标签,对象和数据库字段的相互映射。
缺点:
①SQL的编写量很大的时候,对开发人员的SQL功底有要求。
②SQL依赖数据库,导致数据库移植性差,不能随意更换数据库。

3.#{}和${}的区别

都是一种占位符,都是去实现动态sql的一种方式,通过这两种方式可以把参数传递到xml里面,在执行之前mybatis对这俩个占位符进行动态的解析

#占位符等同于jdbc里面的一个?占位符,是预编译的,可以防止sql注入

$相当于字符串拼接,会有sql注入问题

SQL注入问题:
select * from user_table where username=' "+userName+" ' and password=' "+password"'

传入参数:
 username = "1' OR '1'='1";
 password = "1' OR '1'='1";
 变为:导致我们直接进入系统
 select * from t_user where (username = '1' or '1'='1') and (password = '1' or '1'='1');

4.resultType和resultMap的区别

resultMap: 返回自定义实体类。

如果查询出来的结果的列名和实体属性不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系

<!--结果返回类型采用resultMap定义-->
<select id="findCardById" parameterType="int" resultMap="findCard">
    select * from card where id=#{id}
</select>
 
<!--对上述resultMap进行自定义映射-->
<resultMap id="findCard" type="card">
    <id property="id" column="id"/>
    <result property="number" column="number"/>
</resultMap>


resultType: 返回我们的实体类、Integer、Map等.

resultType使用resultType进行输出映射,只有查询结果显示的列名和实体的属性名一致时,该列才可以映射成功

<!--结果返回类型采用resultType定义-->
<select id="findCardById" parameterType="int" resultType="card">
    select * from card where id=#{id}
</select>

5.如何进行分页

1.在Mybatis Mapper配置文件直接在select语句上增加数据库提供的分页关键字,然后在应用程序里面传递当前页,以及每页展示条数即可

2.使用Mybatis提供的RowBounds对象,实现内存级别分页,一次性加载所有符合条件的目标数据,根据设置的参数在内存里面实现分页,不适合数据量较大的场景,可能会频繁访问数据库,造成比较大的压力

3.基于Mybatis里面Interceptor拦截器,在select语句执行之前动态拼接分页关键字,Interceptor针对不同生命周期的拦截器,比如拦截执行器方法,拦截参数的处理,拦截结果集的处理,拦截sql语法构建的处理,通过拦截不同阶段的处理,实现mybatis里面相关功能的扩展,好处可以通过统一的处理机制,不需要我们单独维护分页相关的功能,pageHelper,myBatis-plus,tkmybatis这些框架都是通过Mybatis的拦截器进行一个扩展,去实现分页的封装,不需要去关心分页相关的一些配置,节省开发和配置的时间

6.mybatis的一级,二级缓存

一级缓存: 默认开启,在同一个sqlSession会话下的操作都会存入缓存,请求查询的数据都会存入缓存。当会话,有增删改操作,并提交的时候,缓存清空,没有失效时间,会随会话结束而结束。
二级缓存: 默认关闭,会话是全局的,一个sqlSessionFactory里面可能有多个sqlSession,sqlSession之间共享数据。当一级缓存关闭或者清除的时候会存进二级缓存。当会话中,有增删改的操作,并且commit时,缓存就会清空。有失效时间,cache默认是一小时,每当有数据存进来,就会判断是否超过一小时,如果超过就释放二级缓存。实体类还需要实现反序列化(Serializable接口)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值