[知了堂学习笔记]mybatis面试题整理01

1.MyBatis的架构和框架
这里写图片描述

Mybatis的功能架构分为三层:

  • API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  • 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

2.MyBatis中的缓存机制

  • 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush或 close 之后,该Session中的所有 Cache 就将清空。
  • 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
  • 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D操作后,默认该作用域下所有 select 中的缓存将被clear。

3.MyBatis和JDBC和Hibernate的对比

这里写图片描述

4.MyBatis如何使用

  • 导入mybatis的jar包
  • 使用XML配置mybatis,创建SqlSessionFactory
  • 从SqlSessionFactory中获取SqlSession
  • mybatis-config.xml+mapper.xml+test.java

5.使用MyBatis时如何做一些优化

  • 连接数据库的配置单独放在一个properties文件中
  • 为实体类定义别名,简化sql映射xml文件中的引用

6.resultType和resultMap的应用场景

  • resultType是直接表示返回类型的(对应着我们的model对象中的实体)
  • resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key–>value关系)
  • ①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
  • ②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

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

  • #{}用来传入参数,sql在解析的时候会加上” “,当成字符串来解析
  • #{}能够很大程度上防止sql注入
  • 用${}传入数据直接显示在生成的sql中
  • ${}方式无法防止sql注入
  • $一般用入传入数据库对象,比如数据库表名

8.批量操作的实现

<insert id="batchInsertUsers" parameterType="java.util.List">  
        insert into mhc_user(userName,password) values  
        <foreach collection="list" item="item" index="index" separator=",">  
            (#{item.userName},#{item.password})  
        </foreach>  
    </insert>  

9.如何获取自动生成的主键

  • 对于支持自动生成主键的数据库,如Mysql、sqlServer,可以通过 Mybatis元素useGeneratedKeys返回当前插入数据主键值到输入类中。
<insert id="insertTest" useGeneratedKeys="true" keyProperty="id" 
 parameterType="com.kq.domain.IdentityTest">
        insert into identity_test(name)
        values(#{name,jdbcType=VARCHAR})
</insert>
  • 对于不支持自动生成主键的数据库。Oracle、DB2等,可以用元素selectKey 回当前插入数据主键值到输入类中。(同时生成一个自定义的随机主键)
<insert id="insertTest" useGeneratedKeys="true" keyProperty="id" 
 parameterType="com.kq.domain.IdentityTest">
 <selectKey keyProperty="id" resultType="String" order="BEFORE">
        SELECT  REPLACE(UUID(),'-','')  
  </selectKey>
        insert into identity_test(name)
        values(#{name,jdbcType=VARCHAR})
</insert>

10.如何进行多参数绑定

Public User selectUser(String name,String area);

select * from user_user_t where user_name = #{0} and user_area=#{1}

其中,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。


PublicUser selectUser(Map paramMap);

select * from user_user_t where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}

PrivateUserxxxSelectUser(){

Map paramMap=new hashMap();

paramMap.put(“userName”,”对应具体的参数值”);

paramMap.put(“userArea”,”对应具体的参数值”);

Useruser=xxx. selectUser(paramMap);}


Public User selectUser(@param(“userName”)String name,@param(“userArea”)String area);


select * from user_user_t where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}


请关注“知了堂学习社区”,地址:http://www.zhiliaotang.com/portal.php

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值