从0开始回顾Mybatis

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Mybatis1、什么是Mybatis?概念:1. Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。2. MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。缺点:1. SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求

Mybatis

1、什么是Mybatis?

概念:

  1. Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。
  2. MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

缺点:

  1. SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
  2. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

ORM是什么?

ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单来说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。

2、JDBC执行过程?

  1. 加载JDBC驱动程序;
Class.forName(com.mysql.jdbc.Driver" );
  1. 建立并获取数据库连接;
connection=DriverManager.getConnection(url,user,password);
  1. 使用数据库连接创建声明;
Statement stmt = conn.createStatement();
  1. 设置SQL语句的传入参数;
  2. 执行SQL语句并获得查询结果;
ResultSet rs = stmt.executeQuery("sql");
  1. 对查询结果进行转换处理并将处理结果返回;
  2. 释放相关资源;


3、JDBC有哪些缺点,MyBatis是如何解决的?

  1. 数据连接创建、释放频繁造成系统资源浪费从而影响系统性能。
  • 解决:在mybatis-config.xml中配置数据链接池,使用连接池统一管理数据库连接。
  1. sql语句写在代码中造成代码不易维护
  • 解决:将sql语句配置在XXXXmapper.xml文件中与java代码分离。
  1. 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
  • 解决:Mybatis自动将java对象映射至sql语句。
  1. 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
  • 解决:Mybatis自动将sql执行结果映射至java对象。


4、MyBatis使用过程?

MyBatis基本使用过程如下:

  1. 创建SqlSessionFactory

可以从配置或者直接编码来创建SqlSessionFactory。

  1. 通过SqlSessionFactory创建SqlSession

SqlSession(会话)可以理解为程序和数据库之间的桥梁。

  1. 通过sqlsession执行数据库操作

可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。

  1. 调用session.commit()提交事务:

如果是更新、删除语句,我们还需要提交一下事务。

  1. 调用session.close()关闭会话:

最后一定要记得关闭会话。

5、MyBatis生命周期?

MyBatis生命周期就是各种组件的生命周期:

  1. SqlSessionFactoryBuilder
  • SqlSessionFactoryBuilder一旦创建了 SqlSessionFactory,就不再需要它了。因此SqlSessionFactoryBuilder 实例的生命周期只存在于方法的内部。
  1. SqlSessionFactory
  • SqlSessionFactory 是用来创建SqlSession的,相当于一个数据库连接池,每次创建SqlSessionFactory都会使用数据库资源,多次创建和销毁是对资源的浪费。所以SqlSessionFactory是应用级的生命周期,而且应该是单例的。
  1. SqlSession
  • SqlSessionSqlSession相当于JDBC中的Connection,SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的生命周期是一次请求或一个方法。
  1. Mapper
  • 映射器是一些绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的,它的生命周期在sqlsession事务方法之内,一般会控制在方法级。

6、在mapper中如何传递多个参数?

  1. 顺序传参法:
  • #{}里面的数字代表传入参数的顺序。
  • 这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错。
public User selectUser(String name, int deptId);
<select id="selectUser" resultMap="UserResultMap">
    select * from user
    where user_name = #{0} and dept_id = #{1}
</select>
  1. @Param注解传参法
  • #{}里面的名称对应的是注解@Param括号里面修饰的名称。
  • 这种方法在参数不多的情况还是比较直观的(推荐使用)。
public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);
<select id="selectUser" resultMap="UserResultMap">
    select * from user
    where user_name = #{userName} and dept_id = #{deptId}
</select>
  1. Map传参法
  • #{}里面的名称对应的是Map里面的key名称。
  • 这种方法适合传递多个参数,且参数易变能灵活传递的情况。
public User selectUser(Map<String, Object> params);
<select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">
    select * from user
    where user_name = #{userName} and dept_id = #{deptId}
</select>
  1. Java Bean传参法
  • #{}里面的名称对应的是User类里面的成员属性。
  • 这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑处理方便,推荐使用
public User selectUser(User user);
<select id="selectUser" parameterType="com.jourwon.pojo.User" resultMap="UserResultMap">
    select * from user
    where user_name = #{userName} and dept_id = #{deptId}
</select>

7、#{}和${}的区别?

  1. #{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理。
  2. Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值。
  3. #{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL 注入
  4. #{} 的变量替换是在DBMS 中;${} 的变量替换是在 DBMS 外

8、Mybatis的一级、二级缓存?

  1. 一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为SqlSession,各个SqlSession之间的缓存相互隔离,当 Session flush 或 close 之后,该 SqlSession 中的所有 Cache 就将清空,MyBatis默认打开一级缓存。

  1. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同之处在于其存储作用域为 Mapper(Namespace),可以在多个SqlSession之间共享,并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置。

9、MyBatis的工作原理?

  1. 读取 MyBatis 配置文件——mybatis-config.xml 、加载映射文件——映射文件即 SQL 映射文件,文件中配置了操作数据库的 SQL 语句。最后生成一个配置对象。
  2. 构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
  3. 创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
  4. Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
  5. StatementHandler:数据库会话器,串联起参数映射的处理和运行结果映射的处理。
  6. 参数处理:对输入参数的类型进行处理,并预编译。
  7. 结果处理:对返回结果的类型进行处理,根据对象映射规则,返回相应的对象。
相关文章
|
SQL 算法 Java
Mybatis-plus超详细讲解(2022)
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
3883 1
|
9月前
|
SQL Java 数据库连接
|
9月前
|
XML 缓存 Java
从0开始回顾Spring---系列一
IOC 1、什么是IOC?什么是DI? IOC lOC:控制反转,以前创建对象的时候都需要自己手动的new,而现在创建对象的任务全部交给spring来管理,降低了对象之间的耦合,当我们需要使用这个对象的时候直接从IOC中获取就行了。 DI DI(依赖注入):指的是容器在实例化对象的时候把它依赖的类注入给它。 2、IOC的实现原理? Spring的IoC的底层实现原理是工厂模式+反射+XML配置文件 。即先写一个接口,再写该接口的一个实现类,通过解析XML配置文件获取该实现类的配置属性,在工厂类中使用反射机制得到实现类相应的对象。 3、 说说BeanFactory和ApplicantCon
|
Java 数据库连接 数据库
JDBC知识【JDBC练习】第五章
JDBC知识【JDBC练习】第五章
|
9月前
|
C++
从0开始回顾数据结构---链表与堆
#include <iostream> #include <algorithm> #include <string.h> using namespace std; const int N = 100010; int h[N], ph[N], hp[N], cnt; void heap_swap(int a, int b) { swap(ph[hp[a]],ph[hp[b]]); swap(hp[a], hp[b]); swap(h[a], h[b]); } void down(int u) { int t = u; if (u * 2 <= cnt &&
|
9月前
|
前端开发 Java 数据库连接
从0开始回顾Spring---系列一
基础 1、Spring是什么?有哪些特性? Spring是什么? ● Spring 是一个轻量级、非入侵式的控制反转 (IoC) 和面向切面 (AOP) 的框架。 Spring有哪些特性呢?(优点) 1. IOC 和 DI 的支持 ● Spring 的核心就是一个大的工厂容器,可以维护所有对象的创建和依赖关系,Spring 工厂用于生成 Bean,并且管理 Bean 的生命周期,实现高内聚低耦合的设计理念。 2. AOP 编程的支持 ● Spring 提供了面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等切面功能。 3. 声明式事务的支持 ● 支持通过配置就来完成对事务的管理,而不
|
9月前
|
SQL 关系型数据库 MySQL
从0开始回顾MySQL---系列九
SQL优化 1、一条sql语句执行很慢的原因有哪些? ⚡ 一个SQL执行的很慢,我们要分两种情况讨论: 1. 大多数情况下很正常,偶尔很慢,则有如下原因: ● 数据库在刷新脏页(内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页),例如redo log 写满了需要同步到磁盘。 ● 执行的时候,遇到锁,如表锁、行锁。 ● sql语句写的不好。 2. 这条SQL语句一直执行的很慢,则有如下原因: ● 没有用上索引或者索引失效:比如该字段没有索引,由于对字段进行运算、函数操作导致无法用索引。 ● 有索引可能会走全表扫描: ○ 怎样判断是否走全表扫描? ○ 某
|
9月前
|
Java 关系型数据库 MySQL
从0开始回顾Spring---系列三
AOP 1、什么是AOP? AOP概念: 面向切面编程,主要将一些与业务代码不相关,但却对多个对象产生影响的公共行为和逻辑,抽取到一个独立的模块中,让业务逻辑更加清爽。 AOP好处: AOP 可以将遍布应用各处的功能分离出来形成可重用的组件。 在编译期间、装载期间或运行期间实现在不修改源代码的情况下给程序动态添加功能。从而实现对业务逻辑的隔离,提高代码的模块化能力。 2、AOP实现原理? 实现 AOP 的技术,主要分为两大类: 静态代理 - 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强; 动态代理 - 在运行时在内存中“临时”生成 AO
|
9月前
|
存储 缓存 关系型数据库
从0开始回顾MySQL---系列二
InnoDB记录结构 1、InnoDB行格式 ? ● 我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 。 ● 设计InnoDB 存储引擎的作者到现在为止设计了4种不同类型的 行格式 ,分别是 Compact 、Redundant 、Dynamic 和 Compressed 行格式。 2、COMPACT行格式 ? 一条完整的记录其实可以被分为 记录的额外信息 和 记录的真实数据 两大部分。 记录的额外信息 这部分信息是服务器为了描述这条记录而不得不额外添加的一些信息,这些额外信息分为3类,分别是 变长字段长度列表 、 NULL值列表 和
|
9月前
|
存储 关系型数据库 MySQL
从0开始回顾MySQL---系列一
基础 1、数据库的三范式是什么? 数据库范式是设计数据库时,需要遵循的一些规范。各种范式是条件递增的联系,越高的范式数据库冗余越小。常用的数据库三大范式为: 1. 第一范式(1NF):每个列都不可以再拆分,强调的是列的原子性,即数据库表的每一列都是不可分割的原 子数据项。 2. 第二范式(2NF):在满足第一范式的基础上,非主属性完全依赖于主码(主关键字、主键),消除非主属性对主码的部分函数依赖。 3. 第三范式(3NF):在满足第二范式的基础上,表中的任何属性不依赖于其它非主属性,消除传递依赖。简而言之,非主键都直接依赖于主键,而不是通过其它的键来间接依赖于主键。 2、MySQL 支持哪

热门文章

最新文章