zoukankan      html  css  js  c++  java
  • Mybatis常见面试题

    Mybatis解决JDBC编程的问题

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

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

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

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

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

    • 解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型

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

    • 解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型

    #{}和${}的区别是什么?

    在Mybatis中,有两种占位符

    • #{}解析传递进来的参数数据

    • ${}对传递进来的参数原样拼接在SQL中

    • #{}是预编译处理,${}是字符串替换

    • 使用#{}可以有效的防止SQL注入,提高系统安全性。

    当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

    第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致

    第2种: 通过来映射字段名和实体类属性名的一一对应的关系

    如何获取自动生成的(主)键值?

    如果我们一般插入数据的话,如果我们想要知道刚刚插入的数据的主键是多少,我们可以通过以下的方式来获取

    需求:

    • user对象插入到数据库后,新记录的主键要通过user对象返回,通过user获取主键值。

    解决思路:

    • 通过LAST_INSERT_ID()获取刚插入记录的自增主键值,在insert语句执行后,执行select LAST_INSERT_ID()就可以获取自增主键。

    在mapper中如何传递多个参数?

    第一种:使用占位符的思想

    • 在映射文件中使用#{0},#{1}代表传递进来的第几个参数

    • 使用@param注解:来命名参数

    • {0},#{1}方式

    //对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。
    <select id="selectUser"resultMap="BaseResultMap">  
        select *  fromuser_user_t   whereuser_city = #{0} anduser_area=#{1}  
    </select>  
    • @param注解方式

            public interface usermapper { 
             user selectuser(@param(“usercity”) string usercity, @param(“hashedpassword”) string hashedpassword); 
            }
        <select id=”selectuser” resulttype=”user”> 
             select id, usercity, hashedpassword 
             from some_table 
             where usercity = #{usercity} 
             and hashedpassword = #{hashedpassword} 
        </select>

    第二种:使用Map集合作为参数来装载

    Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

    • Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能

    • Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。

    • 其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能

    Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

    如果配置了cityspace那么当然是可以重复的,因为我们的Statement实际上就是cityspace+id

    如果没有配置cityspace的话,那么相同的id就会导致覆盖了。

    通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

    • Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的cityspace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。

    • Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement

    Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略

    Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

    接口绑定有几种实现方式,分别是怎么实现的?

    接口绑定有两种实现方式:

    • 一种是通过注解绑定,就是在接口的方法上面加上@Select@Update等注解里面包含Sql语句来绑定

    • 另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的cityspace必须为接口的全路径名.

    Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

    Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

    它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getcity(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getcity()方法的调用。这就是延迟加载的基本原理。

    当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。

    Mybatis都有哪些Executor执行器?它们之间的区别是什么?

    Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor

    • SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象

    • ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map

      内,供下一次使用。简言之,就是重复使用Statement对象

    • BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同

    作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。

     

     

     

     

     

  • 相关阅读:
    python 中文文档地址总结
    清除celery 任务队列
    celery work logging 问题
    mysql 数据库 存储数据类型
    python 补0的方法
    lunix 命令积累
    python3 import Crypto 失败的解决办法 (AES对称加密使用 模块)
    从excel 获取内容 模块:xlrd
    api h5 sdk 接入的说明
    Excel 打开两个单独的页面
  • 原文地址:https://www.cnblogs.com/yjh1995/p/13893841.html
Copyright © 2011-2022 走看看