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

    1.mybatis是什么?   

      (1)mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

      (2)mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。

      (3)MyBatis 支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO映射成数据库中的记录。

    2.MyBatis如何使用

      导入mybatis的jar包

      使用XML配置mybatis,创建SqlSessionFactory

      从SqlSessionFactory中获取SqlSession

      SqlMapConfig.xml+xxxMapper.xml+xxx.java

     3.工作的流程   

      mapper接口:

      接口的全类名是xml文件中namespace的值。

    • 接口中的方法名是xml文件中mapper statement的id值。
    • 接口中方法的参数就是传递给sql的参数
    • mapper接口是没有实现类的,当调用一个方法时,接口的全类名定位一个配置文件,接口的方法名定位这个配置文件中的一个mapperStatment,所以说mapper的方法名是不能重载的,因为mapperStatment的保存和寻找策略。
    • mapper接口的工作原理是,mybatis会使用jdk动态代理方式为mapper接口创建proxy对象,代理对象会拦截接口中的方法,转而执行mapperStatment所代表的sql语句,然后将执行的结果封装返回。

    4.mybatis解决的问题

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

    5.JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

      ① 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
      解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

      ② Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
      解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

      ③ 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
      解决: Mybatis自动将java对象映射至sql语句。

      ④ 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
      解决:Mybatis自动将sql执行结果映射至java对象。

    6.MyBatis编程步骤是什么样的?

      ① 创建SqlSessionFactory 
      ② 通过SqlSessionFactory创建SqlSession 
      ③ 通过sqlsession执行数据库操作 
      ④ 调用session.commit()提交事务 
      ⑤ 调用session.close()关闭会话

    7.MyBatis与Hibernate有哪些不同?

        Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。 
      
        Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。 
      
        Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的缺点是学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。 
    总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

    8.使用MyBatis的mapper接口调用时有哪些要求?

      ①  Mapper接口方法名和mapper.xml中定义的每个sql的id相同 
      ②  Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同 
      ③  Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同 
      ④  Mapper.xml文件中的namespace即是mapper接口的类路径。

    9.SqlMapConfig.xml中配置有哪些内容?

    SqlMapConfig.xml中配置的内容和顺序如下: 
    properties(属性)
    settings(配置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境集合属性对象)
    environment(环境子属性对象)
    transactionManager(事务管理)
    dataSource(数据源)
    mappers(映射器)

     10.简单的说一下MyBatis的一级缓存和二级缓存?

      Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
      Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。

    11.Mapper编写有哪几种方式?

      ①接口实现类继承SqlSessionDaoSupport

      使用此种方法需要编写mapper接口,mapper接口实现类、mapper.xml文件

      1、在sqlMapConfig.xml中配置mapper.xml的位置

    <mappers>
        <mapper resource="mapper.xml文件的地址" />
        <mapper resource="mapper.xml文件的地址" />
    </mappers>

      2、定义mapper接口

      3、实现类集成SqlSessionDaoSupport

      mapper方法中可以this.getSqlSession()进行数据增删改查。

      4、spring 配置

    <bean id=" " class="mapper接口的实现">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>

      ②使用org.mybatis.spring.mapper.MapperFactoryBean

    1、在sqlMapConfig.xml中配置mapper.xml的位置

    如果mapper.xml和mappre接口的名称相同且在同一个目录,这里可以不用配置 

    <mappers>
        <mapper resource="mapper.xml文件的地址" />
        <mapper resource="mapper.xml文件的地址" />
    </mappers>

    2、定义mapper接口

    注意

    1、mapper.xml中的namespace为mapper接口的地址

    2、mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致

    3、 Spring中定义 

    <bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface"   value="mapper接口地址" /> 
        <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
    </bean>

    ③使用mapper扫描器

     1、mapper.xml文件编写,

    注意:

      mapper.xml中的namespace为mapper接口的地址

      mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致

      如果将mapper.xml和mapper接口的名称保持一致则不用在sqlMapConfig.xml中进行配置 

    2、定义mapper接口

      注意mapper.xml的文件名和mapper的接口名称保持一致,且放在同一个目录

    3、配置mapper扫描器 

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="mapper接口包地址"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> 
    </bean>

    4、使用扫描器后从spring容器中获取mapper的实现对象

       扫描器将接口通过代理方法生成实现对象,要spring容器中自动注册,名称为mapper 接口的名称。

    12.resultType和resultMap的应用场景

      resultType是直接表示返回类型的(对应着我们的model对象中的实体)

      resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key–>value关系)

        ①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。

        所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。

        ②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

  • 相关阅读:
    兼容ie6的ul水平居中对齐
    button小手设置 css的cursor
    virtualbox xp连不上网
    转发与重定向的区别(forward与redirect的区别)
    注册表单输入框检测
    html中块元素的居中。及兼容性
    centos下不重装php——给PHP添加新扩展库
    linux编译安装时常见错误解决办法
    Swift可选链
    jQueryMobile(一)
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/9537622.html
Copyright © 2011-2022 走看看