zoukankan      html  css  js  c++  java
  • Mybatis 面试总结

    1.mybatis是什么?
    mybatis是一个优秀的持久层框架,他对jdbc操作数据库的过程进行了封装,使开发着只用关注sql本身,不用去关注例如注册驱动,加载链接,

    得到statement,处理结果集等复杂的过程。mybatis通过xml或者注解的方式,将要执行的各种sql语句配置起来,并通过Java对象和statement

    中的sql语句映射生成最终的sql语句,最后由mybatis框架执行sql语句,并将结果映射成Java对象返回


    2.工作原理
    mybatis通过配置文件创建sqlsessionFactory,sqlsessionFactory根据配置文件,配置文件来源于两个方面:一个是xml,一个是Java中的注解,

    获取sqlSession。SQLSession包含了执行sql语句的所有方法,可以通过SQLSession直接运行映射的sql语句,完成对数据的增删改查和事物

    的提交工作,用完之后关闭SQLSession


    3.mybatis解决的问题

    1.使用数据库连接池管理链接,避免了频繁创建了、关闭链接,浪费资源,影响性能的问题。
    2.用xml管理sql语句,让Java代码和sql语句分离,使得代码更易维护。
    3.解决了sql语句参数不定的问题。xml中可以通过where条件决定sql语句的条件参数。mybatis将Java对象映射到sql语句,通过statement的parameterType定义输入参数的类型。
    4.mybatis自动将结果集封装成Java对象, 通过statement的resultType定义输出的类型。避免了因sql变化,对结果集处理麻烦的问题


    4、#{}和${}的区别

    ${}是properties文件的变量占位符,它可以用于xml标签属性值和sql内部,属性字符串替换。
    eg: ${driver}会被静态替换为com.mysql.jdbc.Driver
    ${}也可以对传进来的参数原样拼接在SQL中,所以有SQL注入的风险。
    #{}是sql的参数占位符,Mybatis会将SQL中的#{}替换为 ?,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的 ?占位符设置参数值,比如ps。setInt(0, paremeterValue)。所以,#{}是预编译处理,可以有效防止SQL注入,提高系统的安全性。


    5、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
    Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。

    而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具


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

    mybatis支持延迟加载,主要包括association一对一关联对象和collection一对多关联对象。在Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false

    原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独

    发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理


    7、MyBatis与Hibernate有哪些不同?

    1、Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句

    2、Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。

        但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。

    3、Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率


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

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

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


    9、Mybatis的一级、二级缓存:

    一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之

    间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。

    二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
    UserMapper有一个二级缓存区域(按namespace分),其它mapper也有自己的二级缓存区域(按namespace分)。每一个namespace的mapper
    都有一个二级缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中
  • 相关阅读:
    powerview使用小记
    OPENWRT自动检测断线脚本
    openwrt路由在中继模式下掉线检测重启脚本
    OPENWRT断网自动关闭WIFI脚本
    jsp <li>中的多个input怎么换行
    联想笔记本G480怎么安装双系统?
    Java中List集合与Set集合
    JS中onfocus()事件,onblur()事件,onload()事件
    java之Date(日期)、Date格式化、Calendar(日历)
    如何一条SQL语句就能统计出多个表中某数据的数量?
  • 原文地址:https://www.cnblogs.com/baizhuang/p/13193625.html
Copyright © 2011-2022 走看看