抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

Mybatis

什么是JDBC

JDBC(Java Database Connectivity)就是数据库连接,白话就是 使用java语言操作数据库或者说是由Sun公司提供的一套访问数据库的规范API叫做JDBC。各个厂商提供自家数据库的接口叫做 驱动

JDBC 架构图

什么是Mybatis

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

Mybatis关键词

SqlSession

负责执行 select、insert、update、delete 等命令, 同时负责获取映射器和管理事务; 其底层封装了与 JDBC 的交互, 可以说是 mybatis 最核心的接口之一。

SqlSessionFactory

负责创建 SqlSession 的工厂, 一旦被创建就应该在应用运行期间一直存在, 不需要额外再进行创建

SqlSessionFactoryBuilder

主要是负责创建 SqlSessionFactory 的构造器类, 其中使用到了构建者设计模式; 仅负责创建 SqlSessionFactory

Configuration

Mybatis 最重要的配置类, 没有之一, 存储了大量的对象配置。

MappedStatement

MappedStatement 是保存 SQL 语句的数据结构, 其中的类属性都是由解析 .xml 文件中的 SQL 标签转化而成。

Executor

SqlSession 对象对应一个 Executor, Executor 对象作用于 增删改查方法 以及 事务、缓存 等操作。

Mybatis的优点

  1. 基于SQL语句编程,十分灵活,可以自定义SQL语句,支持动态SQL语句编写,并且可以重用。
  2. 与JDBC原生开发来比,减少了50%的代码量,消除了大量的冗余代码,且不需要手动开关连接。
  3. 能够与Spring很好的兼容。

Mybatis的缺点

  1. SQL语句编写的工作量比较大,大部分都是重复性CRUD代码。
  2. SQL语句依赖于数据库,可移植性差

Mybatis适合场景

  1. Mybatis专注于SQL本身,可以自定义高性能SQL语句,适合有性能要求的项目。
  2. 对于需求不断变化的项目,SQL可以快速修改,适合如今互联网项目。

Mybatis和Hibernate的区别

  1. Mybatis不完全是一个ORM框架,它需要程序员自己编写SQL语句。
  2. Mybatis支持直接编写SQL语句,因此它自己严格控制SQL的执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发, 因为这类软件需求变化频繁, 一但需求变化要求迅速输出成果。
  3. Hibernate 对象/关系映射能力强, 数据库无关性好, 对于关系模型要求高的软件, 如果用 hibernate 开发可以节省很多代码, 提高效率。

#{}和${}的区别

#{}是预处理编译,${}是字符串替换。

因此${}容易导致SQL注入攻击。

Dao 接口的工作原理是什么?Dao 接口里的方法, 参数不同时,方法能重载吗?

Dao 接口即 Mapper 接口。接口的全限名,就是映射文件中的 namespace 的值; 接口的方法名, 就是映射文件中 Mapper 的 Statement 的 id 值; 接口方法内的参数, 就是传递给 sql 的参数.

Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值, 可唯一定位一个 MapperStatement。在 Mybatis 中, 每一个 select、insert 、update、delete标签, 都会被解析为一个MapperStatement 对象. 举例: com.mybatis3.mappers.StudentDao.findStudentById, 可以唯一 找 到 namespace 为 com.mybatis3.mappers.StudentDao 下 面 id 为findStudentById 的 MapperStatement 。 Mapper 接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。Mapper 接口的工作原理是 JDK 动态代理, Mybatis 运行时会使用 JDK 动态代理为 Mapper 接口生成代理对象 proxy, 代理对象会拦截接口方法, 转而执行 MapperStatement 所代表的 sql, 然后将 sql 执行结果返回。

为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

Hibernate 属于全自动 ORM 映射工具, 使用 Hibernate 查询关联对象或者关联集合对象时, 可以根据对象关系模型直接获取, 所以它是全自动的。而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 ORM 映射工具。