锁屏面试题百日百刷-Mybatis篇(一)

  锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cc/#/introductionPage。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你在面试中先人一步,吊打面试官!接下来的是今日的面试题:

 

====Mybatis #$的区别

 

#相当于对数据 加上 双引号,$相当于直接显示数据

 

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成 sql 时的值为 order by "111", 如果传入的值是 id,则解析成的 sql order by "id".

 

2. $将传入的数据直接显示生成在 sql 中。如:order by $user_id$,如果传入的值是 111,那么解析成 sql 时的值为order by 111, 如果传入的值是 id,则解析成的 sql order by id.

 

3. #方式能够很大程度防止 sql 注入。$方式无法防止 Sql 注入。

 

4.$方式一般用于传入数据库对象,例如传入表名.

 

5.一般能用#的就别用$.

 

 

 

====Mybatis 的编程步骤是什么样的?

 

1、创建 SqlSessionFactory

 

// 根据 mybatis-config.xml 配置的信息得到 sqlSessionFactory

 

String resource = "mybatis-config.xml";

 

InputStream inputStream = Resources.getResourceAsStream(resource);

 

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

 

2、通过 SqlSessionFactory 创建 SqlSession

 

3、通过 sqlsession 执行数据库操作

 

4、调用 session.commit()提交事务

 

5、调用 session.close()关闭会话

 

 

 

====JDBC 编程有哪些不足之处,MyBatis 是如何解决这些问题的

 

 

 

1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

 

解决:在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。

 

2. Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。

 

解决:将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。

 

3. sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数一一对应。

 

解决: Mybatis 自动将 java 对象映射至 sql 语句。

 

4. 对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析比较方便。

 

解决:Mybatis 自动将 sql 执行结果映射至 java 对象。

 

 

 

====使用 MyBatis mapper 接口调用时有哪些要求?

 

1. Mapper 接口方法名和 mapper.xml 中定义的每个 sql id 相同

 

2. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql parameterType 的类型相同

 

3. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql resultType 的类型相同

 

4. Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径。

 

 

 

====讲一讲Mybatis 中一级缓存与二级缓存?

 

1. 一级缓存: 基于 PerpetualCache HashMap 本地缓存,其存储作用域为 Session,当 Session flush

 

close 之后,该 Session 中的所有 Cache 就将清空。

 

2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCacheHashMap 存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如 Ehcache。作用域为 namespance 是指对该 namespance 对应的配置文件中所有的 select 操作结果都缓存,这样不同线程之间就可以共用二级缓存。启动二级缓存:在 mapper 配置文件中配置<cache />节点

 

<mapper namespace="com.yihaomen.mybatis.dao.StudentMapper">

 

    <!--开启本mappernamespace下的二级缓存-->

 

    <!--

 

eviction:代表的是缓存回收策略,目前MyBatis提供以下策略。

 

        (1) LRU,最近最少使用的,一处最长时间不用的对象

 

        (2) FIFO,先进先出,按对象进入缓存的顺序来移除他们

 

        (3) SOFT,软引用,移除基于垃圾回收器状态和软引用规则的对象

 

        (4) WEAK,弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。这里采用的是LRU,移除最长时间不用的对形象

 

flushInterval:刷新间隔时间,单位为毫秒,这里配置的是100秒刷新,如果你不配置它,那么当SQL被执行的时候才会去刷新缓存。

 

      size:引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。这里配置的是1024个对象

 

      readOnly:只读,意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有办法修改缓存,他的默认值是false,不允许我们修改-->

 

    <cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"/>

 

</mapper>

3.对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存 Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear

 

====MyBatis 如何设置在 insert 插入操作时返回主键 ID

 

数据库为 MySql 时:

 

<insert id="insert" parameterType="com.test.User" keyProperty="userId"

 

useGeneratedKeys="true" > “keyProperty”表示返回的 id 要保存到对象的那个属性中,“useGeneratedKeys”表示主键 id 为自增长模式。

 

MySQL 中做以上配置就 OK

 

数据库为 Oracle 时:

 

 <insert id="insert" parameterType="com.test.User">

 

  <selectKey resultType="INTEGER" order="BEFORE" keyProperty="userId">

 

SELECT SEQ_USER.NEXTVAL as userId from DUAL

 

</selectKey>

 

insert into user (user_id, user_name, modified, state)

 

values (#{userId,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR},

 

#{modified,jdbcType=TIMESTAMP}, #{state,jdbcType=INTEGER})

 

</insert>

 

由于 Oracle 没有自增长一说法,只有序列这种模仿自增的形式,所以不能再使用“useGeneratedKeys”属性。而是使用<selectKey>ID 获取并赋值到对象的属性中,insert 插入操作时正常插入 id

 

 

 

 

  更多面试题可关注"demo锁屏面试题"公众号通过小程序或App获取面试题和学习资源

                                         

 

posted @ 2021-07-07 23:09  demo锁屏面试题  阅读(40)  评论(0)    收藏  举报