Spring框架学习笔记(四)-- Mybatis

Mybatis是什么

  • MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
  • MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码
  • Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

未使用Mybatis之前我们会怎么做(使用jdbc)

  1. 加载数据库驱动
  2. 创建并获取数据库链接
  3. 创建jdbc statement对象
  4. 设置sql语句
  5. 设置sql语句中的参数(使用preparedStatement)
  6. 通过statement执行sql并获取结果
  7. sql执行结果进行解析处理
  8. 释放资源(resultSet、preparedstatement、connection)

使用jdbc导致的问题

  • 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
  • Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
  • 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
  • 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

Mybatis框架介绍

sqlMapConfig.xml-->sqlsessionFactory-->sqlsession-->Executor-->Mapped statement-->数据库

  1. sqlMapConfig.xml:是mybatis的全局配置文件,配置了mybatis的运行环境等信息
  2. sqlsessionFactory:会话工厂,创建sqlsession
  3. sqlsession:会话,操作数据库(增、删、改、查)
  4. Executor:执行器,sqlsession通过执行器操作数据库
  5. Mapped statement:底层封装对象,对数据库存储封装,包括sql语句、输入参数、输出结果类型
  6. 数据库:database,我们操作的最终目标

Mybatis中的延迟加载

定义:先从单表查询,需要时再从关联表进行关联查询,这个称作延迟加载。

这样可以大大提高数据库性能,因为毕竟查询单表时比关联查询速度要快。

用网上的一个栗子很好说明(借用https://blog.csdn.net/eson_15/article/details/51668523,特此说明)

关联查询:SELECT orders.*, user.username FROM orders, USER WHERE orders.user_id = user.id 
延迟加载:SELECT orders.*, (SELECT username FROM USER WHERE orders.user_id = user.id)username FROM orders

可以使用Mybatis中的association和collection去实现延迟加载的方法。

使用延迟加载,先去查询简单的sql,再按照需求加载关联查询的其他信息。

Mybatis中的查询缓存

Mybatis提供了查询缓存机制,包括一级缓存和二级缓存。用于减轻数据压力,提高数据库性能(如果有缓存机制,就可以不从数据库中获取数据,大大提高了系统性能)。

一级缓存:

是SqlSession级别的缓存。

在操作数据库时需要构造 sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

二级缓存:

是mapper级别的缓存。

多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

猜你喜欢

转载自blog.csdn.net/sihailongwang/article/details/79651990