MyBatis 面试复习整理
MyBatis
MyBatis 是一款优秀的ORM(对象关系映射)框架,可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中。它内部封装了 JDBC ,使开发者只需要关注 SQL语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 Statement 等繁杂的过程。通过 XML 和注解的方式将要执行的各种 Statement 配置起来,并通过 Java 对象和 Statement 中的动态参数进行映射生成最终执行的 Sql 语句,最后要 MyBatis 框架执行 SQL 并将结果映射为 Java 对象并返回。
MyBatis提供了普通 SQL 查询、事物、存储过程等功能。
优点
- 相比于 JDBC 需要编写的代码更少
- 使用灵活,支持动态 SQL
- 提供映射标签,支持对象与数据库的字段关系映射
缺点
- SQL 语句依赖数据库,移植性较差
- SQL 语句编写工作量大
MyBatis 工作流程
工作流程旨在要完成MyBatis的初始化工作,具体的做法是
第一步要创建一个mybatis-config.xml文件,这个文件中包含了环境配置,全局设置项以及mapper声明这样的核心配置信息,这个mybatis-config.xml文件起到了一个全局配置作用;
SqlSessionFactoryBuilder --构建–》 SqlSessionFactory --构建–》SqlSession(保证全局唯一)
第二步是在我们程序运行的过程中,通过SqlSessionFactoryBuilder这个构建器对象来构建SqlSessionFactory,用于创建SqlSession对象,SqlSession必须保证全局唯一。通过这个SqlSessionFactory对象创建了对应的SqlSession,是我们对数据表进行增删改查的核心。
第三部对应的mapper.xml文件包含了大量的SQL语句,我们通过session来访问mapper.xml,进而来执行与之对应的增删查改SQL语句,那么对于写操作来说,执行完以后,千万不要忘记我们对事务及时进行commit的提交或者是rollback回滚,只有这样才能保证我们的数据被成功写入到数据库中。
最后通过session.close来关闭会话任务。
MyBatis数据查询步骤
创建实体类
创建Mapper XML
编写 SQL 标签
开启驼峰命名映射
新增
SQLSession执行select语句
resultType 指的是某个具体的对象
resultType=“com.*.students”:返回的是单表查询的对象或结果集
resultType=“java.util.Map”:返回的是多表查询的Map结果集
resultMap可以将查询结果映射为复杂类型的Java对象,适合于Java对象保存多表关联结果,支持对象关联查询
parameterType: 外侧要传入的参数的类型
1.MyBatis 和 Hibernate 有哪些不同?
- 灵活性:MyBatis 更加灵活,自己手写 SQL语句
- 可移植性:每个数据库的 SQL 不同,移植性差
- 开发效率:Hibernate 对 SQL 语句做了封装,可直接使用,效率高
- 门槛:MyBatis 入门比较简单
2.“#” 和 “$” 有什么区别?
"#" 是预编译处理,通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换
#{}可以接受简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,#{} 括号中可以是value或其他名称
使用 "#" 时,MyBatis 会将SQL 中的参数替换成 "?"配合 PreparedStatement set 方法赋值,有效的防止 SQL 注入。
"$" 是字符串替换。通过${} 可以将 parameterType 传入的内容拼接在 SQL 中且不进行 jdbc 类型转换
${} 可以接受简单数据类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,#{} 括号中只能是 value
3.MyBatis 有几种分页方式?
逻辑分页:使用 MyBatis 自带的RowBounds 进行分页,一次性查询很多数据,并非全部。
物理分页:手写 SQL 分页或分页插件。
4.RowBounds 是 一次性查询全部结果吗?
不是,因为 MyBatis 是对 JDBC 的封装
在 JDBC 驱动中有一个 FetchSize 的配置,它规定了每次最多能查询多少数据倘若要查询更多数据,会在执行 next() 的时候,去查询更多的数据。
5.什么是动态 SQL?
可以根据不同的参数信息来动态拼接不确定的SQL叫做动态SQL(if、choose、when、otherwise、where、set、foreach)
6.如何设置延迟加载?
延迟加载:在 MyBatis-config.xml 设置 <setting name="lazyLoadingEnabled" value="true"/>
7.JDBC和 MyBatis编程的比较
JDBC | MyBatis | |
---|---|---|
系统性能 | 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能 | 可在配置文件中数据连接池,使用连接池管理数据库连接 |
Sql 语句 | Sql 语句写在代码中造成代码不易维护,实际应用 Sql 变化的可能较大,Sql 变动需要改变 Java 代码 | 将 Sql 语句配置在映射文件中与 Java 代码相分离 |
传参数 | 向 Sql语句传参数麻烦,因为 Sql 语句的 where 条件不一定,可能多也可能少,占位数需要和参数对应 | MyBatis 自动将 Java 对象映射至 Sql 语句,通过 Statement 中的 parameterType 定义输入参数的类型 |
结果解析 | 对结果集解析麻烦,Sql 变化导致解析代码变化,且解析前需要遍历 | MyBatis自动将 Sql 执行结果映射至 Java 对象,通过 Statement 中的 resultType 定义输出结果的类型 |
8.MyBatis 配置文件详解
配置环境以及数据池的配置
映射文件中的参数涵义
namespace 属性:取值必须是持久层(Dao)接口的全限定类名
resultType 属性:用于指定结果集的类型
parameterType 属性:用于指定传入参数的类型
mappers 映射器
<mapper resource=""/>: 使用相对于类路径的资源 <mapper resource="com/hyx/dao/IUserDao.xml"/>
<mapper class=""/>: 使用 mapper 接口类路径 <mapper resource="com.hyx.dao.UserDao"/>
<package name=""/>: 注册指定包下的所有 mapper 接口 <package name="com.hyx.mapper"/>
谢谢观看,待更新…
MyBatis 面试复习整理的更多相关文章
- Java基础(面试复习整理)
基础知识和语法 Java语言初识 计算机语言发展 机器语言.汇编.C.C++.Java Java的诞生与发展 1995 JavaSE JavaME Android JavaEE 2006(大数据) H ...
- Spring面试复习整理
Spring Spring核心分为三方面: 控制反转(IoC): 就是将创建对象的权利交给框架处理/控制,不需要人为创建,有效降低代码的耦合度,降低了开发成本. 依赖注入(DI): 容器动态地将将某种 ...
- Spring MVC面试复习整理
Spring MVC Spring MVC 是Spring Framework 提供的 web 组件 它的实现基于 MVC 的设计模式:Model(模型层).View(视图层).Controller( ...
- Java秋招面试复习大纲(二):Spring全家桶+MyBatis+MongDB+微服务
前言 对于那些想面试高级 Java 岗位的同学来说,除了算法属于比较「天方夜谭」的题目外,剩下针对实际工作的题目就属于真正的本事了,热门技术的细节和难点成为了面试时主要考察的内容. 这里说「天方夜谭」 ...
- php复习整理1--位运算符
前言 子曰:"温故而知新,可以为师矣." php复习整理系列即是对已掌握的知识的温习,对久不使用的知识点进行重新学习,从而对php基础知识的掌握更加牢固.当然因为是重新温习, ...
- linux常用命令大全(linux基础命令入门到精通+命令备忘录+面试复习+实例)
作者:蓝藻(罗蓝国度) 创建时间:2018.7.3 编辑时间:2019.4.29 前言 本文特点 授之以渔:了解命令学习方法.用途:不再死记硬背,拒绝漫无目的: 准确无误:所有命令执行通过(环境为ce ...
- linux常用命令大全(linux基础命令+命令备忘录+面试复习)
linux常用命令大全(linux基础命令+命令备忘录+面试复习)-----https://www.cnblogs.com/caozy/p/9261224.html
- web前端面试知识点整理
一.HTML5新特性 本地存储 webStorage websocket webworkers新增地理位置等API对css3的支持canvas多媒体标签新增表单元素类型结构标签:header nav ...
- MyBatis面试题整理
MyBatis面试题整理 1.什么是MyBatis? 答:MyBatis是一个可以自定义SQL.存储过程和高级映射的持久层框架. 2.讲下MyBatis的缓存 答:MyBatis的缓存分为一级缓存和二 ...
随机推荐
- linux 常用命令(三)——(centos7)MySql 5.7添加用户、删除用户与授权
一.创建用户:以root用户登录到数据库进行用户创建 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 例如: CREATE US ...
- 你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?
JavaScript 中 Arguments 对象的用途总结. 前言 相信我们很多人在代码开发的过程中都使用到过一个特殊的对象 -- Arguments 对象. 在实际开发中,Arguments 对象 ...
- jq的常用事件及其案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- eval()函数的使用
1.eval() 函数作用:可以接受一个字符串str作为参数,并把这个参数作为脚本代码来 执行. 2.参数情况:(1)如果参数是一个表达式,eval() 函数将执行表达式: (2) 如果参数是Java ...
- redhat9 linux 网卡无法激活排障
先查看自己的系统版本! [root@localhost root]# uname -a Linux localhost 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 ...
- 为什么Class实例可以不是全局唯一的——自定义类加载器
为什么Class实例可以不是全局唯一的 通过定义两个类加载器加载同一字节码文件来证明Class实例为什么不是全局唯一的 1.将一个名为Demo(没有后缀)的字节码文件放在D盘根目录 2.定义两个类加载 ...
- k8s 存活探针,滚动更新
文章原文 存活探针 Kubelet使用liveness probe(存活探针)来确定何时重启容器.例如,当应用程序处于运行状态但无法做进一步操作,liveness探针将捕获到deadlock,重启处于 ...
- springmvc图片上传、json
springmvc的图片上传 1.导入相应的pom依赖 <dependency> <groupId>commons-fileupload</groupId> < ...
- python 并行计算
一.进程和线程 原文链接:https://zhuanlan.zhihu.com/p/356220352 进程是分配资源的最小单位,线程是系统调度的最小单位.当应用程序运行时最少会开启一个进程,此时计算 ...
- 第05课:GDB 常用命令详解(上)
本课的核心内容如下: run 命令 continue 命令 break 命令 backtrace 与 frame 命令 info break.enable.disable 和 delete 命令 li ...