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查询到数据将存在相同的二级缓存区域中
  • 相关阅读:
    防删没什么意思啊,直接写废你~
    绝大多数情况下,没有解决不了的问题,只有因为平时缺少练习而惧怕问题的复杂度,畏惧的心理让我们选择避让,采取并不那么好的方案去解决问题
    Java 模拟面试题
    Crossthread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on
    一步步从数据库备份恢复SharePoint Portal Server 2003
    【转】理解 JavaScript 闭包
    Just For Fun
    The database schema is too old to perform this operation in this SharePoint cluster. Please upgrade the database and...
    Hello World!
    使用filter筛选刚体碰撞
  • 原文地址:https://www.cnblogs.com/baizhuang/p/13193625.html
Copyright © 2011-2022 走看看