java学习day18MyBatis2

MyBatis2

缺点

编写SQL语句工作量较大,对开发人员编写SQL语句的功底有一定的要求。

SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

优点

MyBatis是免费且开源的。

与JDBC相比,减少了50%以上的代码量。

MyBatis是最简单的持久化框架,小巧并且简单易学。

MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML中,和程序逻辑代码分离,降低耦合度,便于统一管理和优化,提高了代码的可重用性。

提供XML标签,支持编写动态SQL语句。

提供映射标签,支持对象与数据库的ORM字段关系映射

支持存储过程。MyBatis以存储过程的形式封装SQL,可以将业务逻辑保留在数据库之外,增强应用程序的可移植性、更易于部署和测试。

MyBatis 缓存 ( 一级缓存和二级缓存 )

MyBatis提供了一级缓存和二级缓存的支持。默认情况下,MyBatis只开启一级缓存。

一级缓存:

一级缓存是基于PerpetualCache(MyBatis自带)的HashMap本地缓存,作用范围为SQLsession域内。当session flush(刷新)或者close(关闭)之后,该session中所有的cache(缓存)就会被清空。

在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用同一个mapper的方法,往往只执行一次SQL。因为使用SqlSession第一次查询后,MyBatis会将其放在缓存中,再次查询时,如果没有刷新,并且缓存没有超时的情况下,SqlSession会取出当前缓存的数据,而不会再次发送SQL到数据库

由于SqlSession是相互隔离的,所以如果你使用不同的SqlSession对象,即使调用相同的Mapper、参数和方法,MyBatis还是会再次发送SQL到数据库执行,返回结果。

二级缓存

二级缓存是全局缓存,作用域超出SQLsession范围之外,可以被所有SqlSession共享。手动开启

resultMap 元素

resultMap是MyBatis中最复杂的元素,主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象。

一对一关联查询:

通过<resultMap>元素的子元素<association>处理一对一级联关系

<association>元素中通常使用以下属性:

property:指定映射到实体类的对象属性

column:指定表中对应的字段(即查询返回的列名)

javaType:指定映射到实体对象属性的类型

select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询

一对多关联查询:

通过<resultMap>元素的子元素<collection>处理一对多级联关系,collection可以将关联查询的多条记录映射到一个list集合属性中

<collection>元素中通常使用以下属性:

property:指定映射到实体类的对象属性

column:指定表中对应的字段(即查询返回的列名)

javaType:指定映射到实体对象属性的类型

select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询

resultType和resultMap的区别:

MyBatis的每一个查询映射的返回类型都是resultMap,只是当我们提供的返回类型是resultType时,MyBatis会自动把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap时,MyBatis会将数据库中的列数据复制到对象的相应属性上,可用于复制查询。

MyBatis 动态 SQL

动态SQL只有几个基本元素,与JSTL或XML文本处理器相似,十分简单明了,大量的判断都可以在MyBatis的映射XML文件里配置,以达到许多需要大量代码才能实现的功能

动态SQL大大减少了编写代码的工作量,更体现了MyBatis的灵活性、高度可配置性和可维护性。

if标签:

MyBatis if类似于Java中的if语句,是MyBatis中最常用的判断语句。使用if标签可以节省许多拼接SQL的工作,把精力集中在XML的维护上。

语法:

<if test="判断条件">SQL语句</if>

当判断条件为true时,才会执行所包含的SQL语句

choose、when和otherwise标签:

MyBatis中动态语句choose-when-otherwise类似于Java中的switch-case-default语句。由于MyBatis并没有为if提供对应的else标签,如果想要达到<if>...<else>...</else></if>的效果,可以借助<choose>、<when>、<otherwise>来实现。

(&lt;表示< &gt;表示> &lt;=表示<=)

where标签:

where标签主要用来简化SQL语句中的条件判断,可以自动处理AND/OR条件

set标签:

在MyBatis中,update语句可以使用set标签动态更新列。set标签可以为SQL语句动态的添加set关键词,剔除追加到条件末尾多余的逗号

foreach标签:

foreach标签用于循环语句,它很好的支持了数组和List、set接口的集合,并对此提供遍历的功能

foreach标签主要有以下属性:

item:表示集合中每一个元素进行迭代时的别名

index:指定一个名字,表示在迭代过程中每次迭代到的位置

open:表示该语句以什么开始(既然是in条件语句,所以必然以(开始)

separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是in条件语句,所以必然以,作为分隔符)

close:表示该语句以什么结束(既然是in条件语句,所以必然以)开始)

注意:

使用foreach标签时,最关键、最容易出错的是collection属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下3种情况:

1.如果传入的是单参数且参数类型是一个List,collection属性值为list

2.如果传入的是单参数且参数类型是一个array数组,collection的属性值为array

3.如果传入的参数是多个,需要把他们封装成一个Map,当然单参数也可以封装成Map。Map的key是参数名,collection属性值是传入的List或array对象在自己封装的Map中的Key。

bind标签:

bind标签可以通过OGNL[对象导航图语言(Object Graph Navigation Languge)]表达式自定义一个上下文变量

trim标签:

trim一般用于去除SQL语句中多余的AND关键字、逗号,或者给SQL语句前拼接where、set等后缀,可用于选择性插入、更新、删除或者条件查询等操作

相关推荐
七星静香13 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员13 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU14 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie617 分钟前
在IDEA中使用Git
java·git
数据与后端架构提升之路18 分钟前
从神经元到神经网络:深度学习的进化之旅
人工智能·神经网络·学习
一行127 分钟前
电脑蓝屏debug学习
学习·电脑
Elaine20239132 分钟前
06 网络编程基础
java·网络
G丶AEOM34 分钟前
分布式——BASE理论
java·分布式·八股
落落鱼201335 分钟前
tp接口 入口文件 500 错误原因
java·开发语言
想要打 Acm 的小周同学呀36 分钟前
LRU缓存算法
java·算法·缓存