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等后缀,可用于选择性插入、更新、删除或者条件查询等操作

相关推荐
Jelena157795857922 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
神明不懂浪漫3 小时前
【第五章】Java中的继承与多态
java·开发语言
GeekArch4 小时前
第28讲:避坑——AI堆栈分配错误、栈溢出BUG
c语言·人工智能·stm32·mcu·学习·bug
BullSmall4 小时前
PostgreSQL 14 pg_dumpall 完整备份指南
数据库·postgresql·oracle
AI多Agent协作实战派5 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
gaolei_eit5 小时前
Java+Ai+vue
java·spring·maven
qq_2518364575 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
LayZhangStrive5 小时前
JUC相关的函数、注解、变量杂记
java·面试·多线程·juc
未秃头的程序猿5 小时前
给公司做了个AI客服Agent,用的Spring AI 1.0,3天上线领导拍板了
java·后端·ai编程
曹牧5 小时前
Eclipse 批量文本替换
java·ide·eclipse