面试-框架-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.工作的流程
mapper接口:

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

  • 接口中的方法名是xml文件中mapperstatement的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变化,对结果集处理麻烦的问题。


1、mybatis的编程步骤?
创建sqlSessionFactory
通过sqlSessionFactory创建SqlSession
sqlSession执行数据库操作
调用session.commit()提交事务
调用session.close()关闭会话

2、jdbc有哪些不足之处,mybatis是如何解决的?
数据库频繁的创建和释放影响性能
解决:在SqlMapConfig.xml中配置数据连接池,管理数据库连接

sql语句写在代码中不易维护,实际应用中sql的变化很大
解决:将sql语句中配置在xml文件中与java代码分离

向sql语句中传参麻烦,where的条件不一定或多或少,占位符要与参数对应
解决:Mybatis自动将java对象映射到sql中

对结果集解析麻烦,sql变化对结果也有变化
解决:Mybatis自动将sql执行结果映射到java对象

3、mybatis的一级缓存、二级缓存
一级缓存:mysql内部缓存存储是一个hashMap,key是hashcode+sqlId+sql,value为查询出来的对象
二级缓存:作用域是一个mapper的namespace,即一个namespace中查询sql可以从缓存中获取数据,可以跨sqlsession


  1. MyBatis的编程步骤
    1. 创建SqlSessionFactory
    2. 通过SqlSessionFactory创建SqlSession
    3. 通过SqlSession执行数据库操作
    4. 调用session.commit()提交事务
    5. 调用session.close()关闭事务
  2. #{}和${}的区别是什么?
    1. #{}是预编译处理,${}是字符串替换;
    2. MyBatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
    3. MyBatis在处理
    1. {}替换成变量的值
    2. 使用#{}可以有效防止SQL注入,提高系统的安全性
  3. Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
    1. <resultMap>、<parameterMap>、<sql>、<include>、,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等
  4. JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
    1. JDBC编程的不足之处
      1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
      2. Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
      3. 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
      4. 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
    2. MyBatis的解决方案
      1. 在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
      2. 将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
      3. Mybatis自动将java对象映射至sql语句。
      4. Mybatis自动将sql执行结果映射至java对象。
  5. MyBatis的优缺点
    1. 优点
      1. 易于上手和掌握
      2. Sql写在xml里面,便于统一管理和优化
      3. 减少Sql与程序代码的耦合
      4. 提供xml标签,支持动态Sql编写
    2. 缺点
      1. Sql工作量大,尤其是字段多,关联表多时,更是如此
      2. Sql依赖于数据库,导致数据库移植性差
      3. 由于xml里面标签id必须唯一,导致DAO中方法不支持方法重载。所以dao层必须是接口
  6. 使用MyBatis的mapper接口调用时有哪些要求?
    1. Mapper接口方法名和mapper.xml中定义的每个sql的id相同
    2. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
    3. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
    4. Mapper.xml文件中的namespace即是mapper接口的类路径
  7. Mybatis和Hibernate的区别
    1. Hibernate是全自动ORM映射工具,而Mybatis是半自动ORM映射工具
      1. hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。
      2. 而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。
    2. Hibernate数据库移植性远大于mybatis
    3. hibernate拥有完整的日志系统,mybatis则欠缺一些。
      1. hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多。
    4. mybatis相比hibernate需要关心很多细节
    5. sql直接优化上,mybatis要比hibernate方便很多。

猜你喜欢

转载自blog.csdn.net/lovezhaohaimig/article/details/80287532