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

1.MyBatis的架构和框架
[知了堂学习笔记]mybatis面试题整理01_第1张图片

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的对比

[知了堂学习笔记]mybatis面试题整理01_第2张图片

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.批量操作的实现

"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>  
      

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

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

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

你可能感兴趣的:(mybatis学习笔记)