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 面试复习整理的更多相关文章

  1. Java基础(面试复习整理)

    基础知识和语法 Java语言初识 计算机语言发展 机器语言.汇编.C.C++.Java Java的诞生与发展 1995 JavaSE JavaME Android JavaEE 2006(大数据) H ...

  2. Spring面试复习整理

    Spring Spring核心分为三方面: 控制反转(IoC): 就是将创建对象的权利交给框架处理/控制,不需要人为创建,有效降低代码的耦合度,降低了开发成本. 依赖注入(DI): 容器动态地将将某种 ...

  3. Spring MVC面试复习整理

    Spring MVC Spring MVC 是Spring Framework 提供的 web 组件 它的实现基于 MVC 的设计模式:Model(模型层).View(视图层).Controller( ...

  4. Java秋招面试复习大纲(二):Spring全家桶+MyBatis+MongDB+微服务

    前言 对于那些想面试高级 Java 岗位的同学来说,除了算法属于比较「天方夜谭」的题目外,剩下针对实际工作的题目就属于真正的本事了,热门技术的细节和难点成为了面试时主要考察的内容. 这里说「天方夜谭」 ...

  5. php复习整理1--位运算符

    前言    子曰:"温故而知新,可以为师矣." php复习整理系列即是对已掌握的知识的温习,对久不使用的知识点进行重新学习,从而对php基础知识的掌握更加牢固.当然因为是重新温习, ...

  6. linux常用命令大全(linux基础命令入门到精通+命令备忘录+面试复习+实例)

    作者:蓝藻(罗蓝国度) 创建时间:2018.7.3 编辑时间:2019.4.29 前言 本文特点 授之以渔:了解命令学习方法.用途:不再死记硬背,拒绝漫无目的: 准确无误:所有命令执行通过(环境为ce ...

  7. linux常用命令大全(linux基础命令+命令备忘录+面试复习)

    linux常用命令大全(linux基础命令+命令备忘录+面试复习)-----https://www.cnblogs.com/caozy/p/9261224.html

  8. web前端面试知识点整理

    一.HTML5新特性 本地存储 webStorage websocket webworkers新增地理位置等API对css3的支持canvas多媒体标签新增表单元素类型结构标签:header nav ...

  9. MyBatis面试题整理

    MyBatis面试题整理 1.什么是MyBatis? 答:MyBatis是一个可以自定义SQL.存储过程和高级映射的持久层框架. 2.讲下MyBatis的缓存 答:MyBatis的缓存分为一级缓存和二 ...

随机推荐

  1. 【gdal】创建GeoTiff栅格数据

    1 //定义转换参数 2 private readonly double[] d_transform = { 69.999999999999972, 0.01, 0.0, 44.99999999999 ...

  2. mybatis面试题总结

    1.什么是MyBatis? 答:MyBatis是一个可以自定义SQL.存储过程和高级映射的持久层框架. 2.讲下MyBatis的缓存 答:MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在ses ...

  3. Java异常与异常处理

    异常体系结构 1.所有异常都继承于Throwable类,其下有两大子类: (1)Error类:错误,一般编程人员不太接触,如虚拟机错误.线程死锁.硬伤:使程序崩溃 (2)Exception类:异常,编 ...

  4. Java抽象类(abstract)

    抽象类和接口 一.抽象类 1.什么是抽象类? 类和类之间具有共同的特征,将这些特征提取出来,形成的就是抽象类. 类到对象是实例化,对象到类是抽象. 抽象类和具体类是相对的概念."抽象&quo ...

  5. 【C语言】第1章 程序设计与C语言

    第1章 程序设计与C语言 程序:一组计算机能识别和执行的 指令. 计算机语言:人和计算机交流信息的.计算机和人都能识别的语言 C语言允许用两种注释方式: //:单行注释 可单独占一行 可出现在一行中其 ...

  6. 小程序 mpvue page "xxx" has not been registered yet

    新增了几个页面,改了下目录结构,就开始报这个错. 重启了几次不管用,google 一番也无果. 灵机一动试一下 build npm run build build 版本没报错,OK 然后 $ rm - ...

  7. PyQT5基础布局管理

    绝对定位布局 使用move(x, y)可以对窗口进行布局,以窗口左上角为原点,向右为 x 轴正方向,向下为 y 轴正方向,移动(x,y); import sys from PyQt5.QtGui im ...

  8. RabbitMQ之消息模式1

    消息100%的投递 消息如何保障100%的投递成功? 什么是生产端的可靠性投递? 保障消息的成功发出 保障MQ节点的成功接收 发送端收到MQ节点(Broker)确认应答 完善的消息进行补偿机制 BAT ...

  9. 20210809 Merchant,Equation,Rectangle

    做过,但当时咕了 T3 Merchant 先特判 \(t=0\),之后斜率一定会起作用. 考虑最终选择的物品集合,它们的斜率和一定大于 \(0\),因此答案具有单调性,可以二分. 实现的时候注意细节 ...

  10. K8S_第一课作业_20200407

    (1)通过cgroup来限制memory ##消耗内存脚本 /tmp/xmem.sh #!/bin/bash mkdir /tmp/memory mount -t tmpfs -o size=2048 ...