[Java面试七]Mybatis总结以及在面试中的一些问题.

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

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

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

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

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

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

建立 SqlSessionFactory
 经过SqlSessionFactory建立 SqlSession
经过sqlsession执行数据库操做
调用session.commit()提交事务
调用session.close()关闭会话

3.MyBatis与Hibernate有哪些不一样?

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

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

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

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

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

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

Mybatis首先去缓存中查询结果集,若是没有则查询数据库,若是有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMapkeyhashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

Mybatis的二级缓存即查询缓存,它的做用域是一个mapper的namespace,即在同一个namespace中查询sql能够从缓存中获取数据。二级缓存是能够跨SqlSession的。

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

接口实现类继承SqlSessionDaoSupport

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

一、在sqlMapConfig.xml中配置mapper.xml的位置程序员

 

  1. <mappers>
  2.     <mapper resource="mapper.xml文件的地址" />
  3.     <mapper resource="mapper.xml文件的地址" />
  4. </mappers>

 

二、定义mapper接口web

三、实现类集成SqlSessionDaoSupportspring

mapper方法中能够this.getSqlSession()进行数据增删改查。sql

四、spring 配置数据库

 

  1. <bean id=" " class="mapper接口的实现">
  2.     <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
  3. </bean>
使用org.mybatis.spring.mapper.MapperFactoryBean

 

一、在sqlMapConfig.xml中配置mapper.xml的位置编程

若是mapper.xml和mappre接口的名称相同且在同一个目录,这里能够不用配置缓存

 

  1. <mappers>
  2.     <mapper resource="mapper.xml文件的地址" />
  3.     <mapper resource="mapper.xml文件的地址" />
  4. </mappers>

 

二、定义mapper接口session

注意mybatis

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

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

三、 Spring中定义

 

  1. <bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
  2.     <property name="mapperInterface"   value="mapper接口地址" /> 
  3.     <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
  4. </bean>
使用mapper扫描器

 

一、mapper.xml文件编写,

注意:

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

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

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

二、定义mapper接口

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

三、配置mapper扫描器

 

  1. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  2.     <property name="basePackage" value="mapper接口包地址"></property>
  3.     <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> 
  4. </bean>
四、使用扫描器后从spring容器中获取mapper的实现对象

 

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

相关文章
相关标签/搜索