从0开始回顾Mybatis

简介: 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. 结果处理:对返回结果的类型进行处理,根据对象映射规则,返回相应的对象。
相关文章
|
15小时前
|
SQL 缓存 Java
浅谈mybatis
浅谈mybatis
10 1
|
9月前
|
Java 数据库连接 测试技术
Mybatis-PLUS详解
Mybatis-PLUS详解
179 0
|
6月前
|
SQL Java 关系型数据库
mybatis plus很好,但是我被它坑了!
作者今天在开发一个后台发送消息的功能时,由于需要给多个用户发送消息,于是使用了 mybatis plus 提供的 saveBatch() 方法,在测试环境测试通过上预发布后,测试反应发送消息接口很慢得等 5、6 秒,于是我就登录预发布环境查看执行日志,发现是 mybatis plus 提供的 saveBatch() 方法执行很慢导致,于是也就有了本篇文章。
32 1
|
7月前
|
SQL Java 数据库连接
14MyBatis - MyBatis介绍
14MyBatis - MyBatis介绍
22 0
|
12月前
|
SQL Java 数据库连接
mybatis
mybatis
59 0
|
SQL XML 存储
|
SQL XML 缓存
Mybatis详解(1)
你好看官,里面请!今天笔者讲的是Mybatis详解(1)。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
208 2
|
SQL Java 数据库连接
mybatis 中的updateByPrimaryKey与updateByPrimaryKeySelective
mybatis 中的updateByPrimaryKey与updateByPrimaryKeySelective
|
SQL 算法 Oracle
MyBatis-Plus的使用
MyBatis-Plus的使用
140 1
MyBatis-Plus的使用