type
status
date
slug
summary
tags
category
icon
password
AI summary
notion image
Author:Aaron
Version:9.0.2

一、引言


1.1 什么是框架?

软件的半成品,解决了软件开发过程当中的普适性问题,从而简化了开发步骤,提供了开发的效率。

1.2 什么是ORM框架?

ORM(Object Relational Mapping)对象关系映射,将程序中的一个对象与表中的一行数据一一对应。ORM框架提供了持久化类与表的映射关系,在运行时参照映射文件的信息,[把对象持久化到数据库中`]()。

1.3 使用JDBC完成ORM操作的缺点?

存在大量的冗余代码。手工创建 Connection、Statement 等。手工将结果集封装成实体对象。查询效率低,没有对数据访问进行过优化(Not Cache)。

二、MyBatis框架


2.1 概念

MyBatis本是Apache软件基金会的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了Google Code,并且改名为MyBatis 。2013年11月迁移到Github。MyBatis是一个优秀的基于Java的持久层框架,支持自定义SQL,存储过程和高级映射。MyBatis对原有JDBC操作进行了封装,几乎消除了所有JDBC代码,使开发者只需关注 SQL 本身。MyBatis可以使用简单的XML或Annotation来配置执行SQL,并自动完成ORM操作,将执行结果返回。

2.2 访问与下载

官方网站:http://www.mybatis.org/mybatis-3/

三、构建Maven项目


3.1 新建项目

使用IDEA打开已创建的文件夹目录

notion image

3.2 选择Maven目录

选择Maven项目

notion image

3.3 GAV坐标

GAV坐标

notion image

四、MyBatis环境搭建【重点


4.1 pom.xml中引入MyBatis核心依赖

在pom.xml中引入相关依赖

4.2 创建MyBatis配置文件

创建并配置mybatis-config.xml
  • 注意:mapper.xml默认建议存放在resources中,路径不能以/开头

五、MyBatis开发步骤【重点


5.1 建表

5.2 定义实体类

定义所需CURD操作的实体类

5.3 定义DAO接口

根据所需DAO定义接口、以及方法

5.4 编写Mapper.xml

在resources目录中创建Mapper.xml文件

5.5 注册Mapper

将Mapper.xml注册到mybatis-config.xml中

5.6 测试一

MyBatis的API操作方式

5.7 测试二【了解】

iBatis传统操作方式

六、细节补充


6.1 解决mapper.xml存放在resources以外路径中的读取问题

在pom.xml文件最后追加< build >标签,以便可以将xml文件复制到classes中,并在程序运行时正确读取。

6.2 properties配置文件

对于mybatis-config.xml的核心配置中,如果存在需要频繁改动的数据内容,可以提取到properties中。
修改mybatis-config.xml。

6.3 类型别名

为实体类定义别名,提高书写效率。

6.4 创建log4j配置文件

pom.xml添加log4j依赖
创建并配置log4j.properties
级别
描述
ALL LEVEL
打开所有日志记录开关;是最低等级的,用于打开所有日志记录。
INFO
输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。
WARN
输出警告信息;表明会出现潜在错误的情形。
ERROR
输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。
FATAL
输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。
OFF LEVEL
关闭所有日志记录开关;是最高等级的,用于关闭所有日志记录。

七、MyBatis的CRUD操作【重点


7.1 查询

标签:< select id="" resultType="" >

7.1.1 序号参数绑定

7.1.2 注解参数绑定【推荐】

7.1.3 Map参数绑定

7.1.4 对象参数绑定

7.1.5 模糊查询

7.2 删除

标签:< delete id="" parameterType="" >

7.3 修改

标签:< update id="" parameterType="" >

7.4 添加

标签:< insert id="" parameterType="" >

7.5 主键回填

标签:< selectKey id="" parameterType="" order="AFTER|BEFORE">

7.5.1 通过last_insert_id()查询主键

7.5.2 通过uuid()查询主键

八、MyBatis工具类【重点


8.1 封装工具类

Resource:用于获得读取配置文件的IO对象,耗费资源,建议通过IO一次性读取所有所需要的数据。SqlSessionFactory:SqlSession工厂类,内存占用多,耗费资源,建议每个应用只创建一个对象。SqlSession:相当于Connection,可控制事务,应为线程私有,不被多线程共享。将获得连接、关闭连接、提交事务、回滚事务、获得接口实现类等方法进行封装。

8.2 测试工具类

调用MyBatisUtils中的封装方法。

九、ORM映射【重点


9.1 MyBatis自动ORM失效

MyBatis只能自动维护库表”列名“与”属性名“相同时的一一对应关系,二者不同时,无法自动ORM。
自动ORM失效

notion image

9.2 方案一:列的别名

在SQL中使用 as 为查询字段添加列别名,以匹配属性名。

9.3 方案二:结果映射(ResultMap - 查询结果的封装规则)

通过< resultMap id="" type="" >映射,匹配列名与属性名。

十、MyBatis处理关联关系-多表连接【重点


实体间的关系:关联关系(拥有 has、属于 belong)
  • OneToOne:一对一关系(Passenger--- Passport)
  • OneToMany:一对多关系(Employee --- Department)
  • ManyToMany:多对多关系(Student --- Subject)
Table建立外键关系

notion image

Entity添加关系属性

notion image

Mapper中将属性与列名对应

notion image

10.1 OneToOne

SQL参考OneToOneExample.sql

10.2 OneToMany

SQL参考OneToManyExample.sql

10.3 ManyToMany

SQL参考ManyToManyExample.sql
建立第三张关系表

notion image

10.4 关系总结

一方,添加集合;多方,添加对象。
双方均可建立关系属性,建立关系属性后,对应的Mapper文件中需使用< ResultMap >完成多表映射。
持有对象关系属性,使用< association property="dept" javaType="department" >
持有集合关系属性,使用< collection property="emps" ofType="employee" >

十一、动态SQL【重点


MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接成完整的SQL之后再执行,以达到SQL复用、简化编程的效果。

11.1 < sql >

11.2 < where >

11.3 < set >

11.4 < trim >

< trim prefix="" suffix="" prefixOverrides="" suffixOverrides="" >代替< where > 、< set >

11.5 < foreach >

参数
描述
取值
collection
容器类型
list、array、map
open
起始符
(
close
结束符
)
separator
分隔符
index
下标号
从0开始,依次递增
item
当前项
任意名称(循环中通过 #{任意名称} 表达式访问)

十二、缓存(Cache)【重点


内存中的一块存储空间,服务于某个应用程序,旨在将频繁读取的数据临时保存在内存中,便于二次快速访问。
无缓存:用户在访问相同数据时,需要发起多次对数据库的直接访问,导致产生大量IO、读写硬盘的操作,效率低下

notion image

有缓存:首次访问时,查询数据库,将数据存储到缓存中;再次访问时,直接访问缓存,减少IO、硬盘读写次数、提高效率

notion image

12.1 一级缓存

SqlSession级别的缓存,同一个SqlSession的发起多次同构查询,会将数据保存在一级缓存中。

12.2 二级缓存

SqlSessionFactory级别的缓存,同一个SqlSessionFactory构建的SqlSession发起的多次同构查询,会将数据保存在二级缓存中。

12.2.1 开启全局缓存

< settings >是MyBatis中极为重要的调整设置,他们会改变MyBatis的运行行为,其他详细配置可参考官方文档。

12.2.2 指定Mapper缓存

12.2.3 缓存清空并重新缓存

十三、Druid连接池


13.1 概念

Druid 是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和 SQL 解析器组成。该项目主要是为了扩展 JDBC 的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计 SQL 信息、SQL 性能收集、SQL 注入检查、SQL 翻译等,程序员可以通过定制来实现自己需要的功能。

13.2 不同连接池对比

测试执行申请归还连接 1,000,000(一百万)次总耗时性能对比。

13.2.1 测试环境

环境
版本
OS
OS X 10.8.2
CPU
Intel i7 2GHz 4 Core
JVM
Java Version 1.7.0_05

13.2.2 基准测试结果对比

JDBC-Conn Pool
1 Thread
2 threads
5 threads
10 threads
20 threads
50 threads
tomcat-jdbc
1,269
1,378
2,029
2,103
1,879
2,025
DBCP
2,324
5,055
5,446
5,471
5,524
5,415
BoneCP
3,738
3,150
3,194
5,681
11,018
23,125
jboss-datasource
4,377
2,988
3,680
3,980
32,708
37,742
C3P0
10,841
13,637
10,682
11,055
14,497
20,351
Proxool
16,337
16,187
18,310(Ex)
25,945
33,706(Ex)
39,501 (Ex)

13.2.3 测试结论

  • Proxool 在激烈并发时会抛异常,不适用。
  • C3P0 和 Proxool 都相当慢,影响 sql 执行效率。
  • BoneCP 性能并不优越,采用 LinkedTransferQueue 并没有能够获得性能提升。
  • 除了 bonecp,其他的在 JDK 7 上跑得比 JDK 6 上快。
  • jboss-datasource 虽然稳定,但性能很糟糕。

13.3 配置pom.xml

引入Druid依赖

13.4 创建DruidDataSourceFactory

MyDruidDataSourceFactory并继承PooledDataSourceFactory,并替换数据源。

13.5 修改mybatis-config.xml

mybatis-config.xml中连接池相关配置。

十四、PageHelper


14.1 概念

PageHelper是适用于MyBatis框架的一个分页插件,使用方式极为便捷,支持任何复杂的单表、多表分页查询操作。

14.2 访问与下载

官方网站:https://pagehelper.github.io/

14.3 开发步骤

PageHelper中提供了多个分页操作的静态方法入口。

14.3.1 引入依赖

pom.xml中引入PageHelper依赖。

14.3.2 配置MyBatis-config.xml

在MyBatis-config.xml中添加< plugins >。

14.3.3 PageHelper应用方式

使用PageHelper提供的静态方法设置分页查询条件。

14.4 PageInfo对象

PageInfo对象中包含了分页操作中的所有相关数据。
PageInfo结构图

notion image

14.4.1 PageInfo应用方式

使用PageInfo保存分页查询结果。

14.4.2 注意事项

只有在PageHelper.startPage()方法之后的第一个查询会有执行分页。分页插件不支持带有“for update”的查询语句。分页插件不支持“嵌套查询”,由于嵌套结果方式会导致结果集被折叠,所以无法保证分页结果数量正确。。

14.4.3 分页练习

使用Servlet+JSP+MyBatis+分页插件,完成分页查询功能。

十五、补充【了解】


以下内容并非必备知识,了解即可。

15.1 MyBatis注解操作

通过在接口中直接添加MyBatis注解,完成CRUD。

15.1.1 查询

15.1.2 删除

15.1.3 修改

15.1.4 插入

15.2 $符号的应用场景

${attribute} 属于字符串拼接SQL,而非预编译占位符,会有注入攻击问题,不建议在常规SQL中使用,常用于可解决动态生降序问题。

15.2.1 $符号参数绑定

15.2.2 $符号注入攻击

注入攻击,拼接的内容,改变了原sql语义,被攻击!

notion image

15.3 MyBatis处理关联关系-嵌套查询【了解】

思路:查询部门信息时,及联查询所属的员工信息。
  • DepartmentDao接口中定义selectDepartmentById,并实现Mapper。
  • EmployeeDao接口中定义selectEmployeesByDeptId,并实现Mapper,
  • 当selectDepartmentById被执行时,通过< collection >调用selectEmployeesByDeptId方法,并传入条件参数。

15.3.1 主表查询

定义selectEmployeesByDeptId,并书写Mapper,实现根据部门ID查询员工信息

15.3.2 及联调用

定义selectDepartmentById,并书写Mapper,实现根据部门ID查询部门信息,并及联查询该部门员工信息

15.3.3 延迟加载

mybatis-config.xml中开启延迟加载
 
ServletLayUI