商务服务
SpringBoot结合MyBatis 【超详细】
2024-10-31 20:14

1、SpringBoot+老杜MyBatis

SpringBoot结合MyBatis 【超详细】

一、简单回顾一下MyBatis

二、快速入门

​三、简易插入删除更改

四、查询

①、按其中一个字段查询

②、按所有字段进行查询

​五、详解MyBatis核心配置(复习)

六、结合Web及SpringMVC

2、MyBatis小技巧

一、#{}与${}及模糊查询

二、别名机制与mapper标签

三、插入使用生成的主键值

3、MyBatis参数处理

一、单个简单类型参数

二、Map参数

①、插入信息

②、查询单个汽车信息

③、返回多个Map

④、返回Map,map>

三、实体类参数

四、多参数@Param

五、resultMap结果映射

①、使用resultMap进行结果映射(常用

②、开启驼峰命名规范自动映射

六、获取总记录条数

4、动态SQL(注:使用了驼峰命名规范)

一、if标签

二、where标签

三、trim标签

四、set标签

五、choose where otherwise

六、foreach标签

①批量删除

②批量添加

七、sql、include标签

5、高级映射及延迟加载

一、多对一

二、多对一延迟加载

三、一对多

四、一对多延迟加载

6、MyBatis缓存机制

一、一级缓存

二、二级缓存

7、MyBatis使用PageHelper

一、limit分页

二、PageHelper插件


        舞台再大 你不上台 永远是个观众

        平台再好 你不参与 永远是局外人

        能力再大 你不行动 只能看别人成功

        没有人会在乎你付出多少努力 撑得累不累 摔得痛不痛

        他们只会看你最后站在什么位置 然后羡慕或鄙夷

  • 核心对象包括以下三个

    • SqlSessionFactoryBulider

    • SqlSessionFactory

    • SqlSession

    • SqlSessionFactoryBuilder --> SqlSessionFactory --> SqlSession

  • 关于MyBatis的事务管理机制(两种

     

JDBC事务管理器 MyBatis框架自己管理事务,自己采用原生的JDBC代码去管理事务

在JDBC事务中,没有执行conn.setAutoCommit(false);那么autoCommit就是true。 如果autoCommit是true,就表示没有开启事务。只要执行任意一条DML语句就提交一次。代码如下MANAGED事务管理器中有展示。

MANAGED事务管理器 MyBatis不再负责事务的管理了。事务管理交给其它容器来负责。对于我们当前的单纯的只有MyBatis的情况下,如果配置为:MANAGED 那么事务这块是没人管的。没有人管理事务表示事务压根没有开启。没有人管理事务就是没有事务。

  • JDBC中的事务: 如果你没有在JDBC代码中执行下面这条语句,那么默认的autoCommit是true。

     
  • 只要你的autoCommit(自动提交)是true,就表示没有开启事务。

在SpringBoot+MyBatis项目中就不用写事务相关的东西了,但是用到业务层Service就需要了

第一步:引入依赖

第二步:编写yml配置文件(此处我将properties后缀改成了yml

其中包含连接数据库以及MyBatis的核心配置信息(但在SpringBoot框架中无需用MyBatis原核心配置文件

第三步:构建实体类(在pojo包下,与表中字段一一对应

第四步:创建接口,用来写方法  

 第五步:每一个实体类对应一个mapper映射文件,在resources的mapper包下写映射文件(SQL语句

其实这里的Sql语句是有问题的,查询到控制台的有问题,这里做个伏笔后面会知道为什么。

第六步:先测试自己是否成功连接到了数据库,不然你不管怎么测试方法都不知道你为什么爆红

测试成功,开心开心(这里控制台输出的null是我埋下的伏笔,下面会讲) 

①、按其中一个字段查询

通过控制台你会仔细的发现:除了id和brand其他皆为null。

原因就在于:属性名与表名不一致造成的,所以我们应该编写Sql语句就可以完成查询

②、按所有字段进行查询

这也是我在快速入门那里留下的伏笔,其实那个select也要进行修改

这里就当复习了,因为是看的老杜讲解的,更加细致。

这里老杜的是使用MVC架构模式,然后优化使用了动态代理写了两个工具类

但我是基于SpringBoot框架的基础上去复习老杜的MyBatis,所以会使用到SpringMVC去实现老杜的课程

一个项目从前往后写才知道具体需要实现的功能是什么(老杜教的

修改成功和失败的页面就不截图展示了

项目目录如下以及超简易页面以及数据库表结构

 ①根据表结构去编写实体类做到与表中字段一一对应

②根据网页所知功能需求是银行转账,在Mapper接口编写方法

③根据Mapper接口的方法在映射文件中写Sql语句

④根据Mapper接口所需方法在业务层中实现  

⑤根据想抛出的异常去编写异常类

⑥数据层和业务层方法实现后在表示层编写

这里就不多写了,详细可以看我博客另外一条文章:花了几天整理了学完的Mybatis框架(内含源码及面试题)_慢慢ovo的博客-CSDN博客

放一点笔记出来品品

 

简单类型包括

  • 七种数据类型(除了boolean)以及他们的包装类

  • String

  • java.util.Date

  • java.sql.Date

parameterType属性的作用: 告诉MyBatis框架这个方法的参数类型是什么类型 MyBatis框架自身带有类型自动推断机制,所以大部分情况下parameterType属性都是可以省略不写的

①、插入信息

②、查询单个汽车信息

③、返回多个Map

查询结果大于等于1条数据,则可以返回一个存储Map集合的List集合,List<Map>等同于List<Car>

 ④、返回Map<String,Map>

通过Car的id做Key,以后取出对应的Map集合时更方便

1={carType=燃油车, carNum=1001, guidePrice=10.00, produceTime=2022-10-1, id=1, brand=宝马520Li},

2={carType=新能源, carNum=1002, guidePrice=55.00, produceTime=2022-10-2, id=2, brand=奔驰E300L},

6={carType=新能源, carNum=1111, guidePrice=30.00, produceTime=2022-10-3, id=6, brand=奔驰},

7={carType=新能源, carNum=111, guidePrice=30.00, produceTime=2022-10-2, id=7, brand=奔驰},

10={carType=新能源, carNum=111, guidePrice=30.00, produceTime=2022-10-2, id=10, brand=奔驰},

11={carType=新能源, carNum=111, guidePrice=30.00, produceTime=2022-10-8, id=11, brand=奔驰}

}

不需要使用arg0、arg1、param1、param2等等,直接使用@Param注解增强可读性

需求:根据name和age查询学生信息

 

①、使用resultMap进行结果映射(常用

查询结果的列名和java对象的属性名对应不上的做法

  • 第一种方式:as 给列起别名 as可以省略不写,我们前面的做法就是如此

  • 第二种方式:使用resultMap进行结果映射

  • 第三种方式:是否开启驼峰命名自动映射(设置settings)

在一对标签中resultType和resultMap两者只能有一个 当查询要返回对象

而且属性和字段不一致的时候用resultMap。 

 ②、开启驼峰命名规范自动映射

使用这种方式的前提是:属性名遵循Java的命名规范,数据库表的列名遵循SQL的命名规范。

Java命名规范:首字母小写,后面每个单词首字母大写,遵循驼峰命名方式。

SQL命名规范:全部小写,单词之间采用下划线分割。

什么是动态SQL

  • SQL的内容是变化的, 可以根据条件获取到不同的SQL语句 主要是where部分发生变化。 动态SQL的实现, 使用的是MyBatis提供的标签

为什么使用动态SQL

  • 使用动态SQL可以解决某些功能的使用 例如使用条件查询某个商品 输入价格,地区等等进行筛选,如果使用静态SQL可能会查询出来的是一个空内容 但使用动态SQL可以很好的解决这种问题

动态SQL的标签

where标签的作用:让where子句更加动态智能。

  • 所有条件都有空时,where标签保证不会生成where子句。

  • 自动去除某些条件前面多余的and或or

主要使用在update语句当中,用于生成set关键字,同时去掉最后多余的","

比如我们只更新提交的不为空的字段,如果提交的数据是空或者"",那么这个字段我们将不更新。

这三个标签是在一起使用的

Mapper映射语法格式

等同于Code语法格式

 

①批量删除

②批量添加

sql标签用来声明sql片段

include标签用来将声明的sql片段包含到某个sql语句当中

作用:代码复用、易维护

在我跟着老杜学的MyBatis中。他提过一句查询语句最好不要使用星号,因为这会使MySQL索引失效从而导致查询性能下降。所以我上面的笔记没有使用到星号,都是用具体字段进行查询。

多种方式,常见的包括三种

  • 第一种方式:一条SQL语句,级联属性映射

  • 第二种方式:一条SQL语句,association

  • 第三种方式(常用:两条SQL语句,分步查询。 优点:可复用、支持懒加载

表的结构如下

 两个实体类如下

第一种方式:级联属性映射

第二种方式:association

 第三种方式:分步查询

实际开发中的模式

        把全局的延迟加载打开,如果某个映射文件不需要那么就在association标签里使用fetchType="eager"关闭

 一对多的实现,通常是在一的一方中有List集合属性。

在Class(教室)类中添加List<Student> studentList属性。

一对多的实现通常包括两种实现方式

  • 第一种方式:collection

  • 第二种方式:分步查询

两个实体类如下

第一种方式:collection

 注意:控制台输出的clazz=null是没有问题的

第二种方式:分步查询

与上面的多对一延迟加载相同,可以回去重新看一下。

缓存:cache

缓存的作用:通过减少IO的方式来提高程序的执行效率。

MyBatis的缓存:将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取,不需要查询数据库。一方面是减少了IO,另一方面不再执行繁琐的查找算法,效率大大提升。

MyBatis缓存包括

  • 一级缓存:将查询到的数据存储到SqlSession中。

  • 二级缓存:将查询到的数据存储到SqlSessionFactory中。

  • 其他集成第三方的缓存:比如EhCache【Java语言开发的】、Memcache【c语言开发的】等。

缓存只针对于DQL语句,也就是说缓存机制只对应select语句

一级缓存是默认开启的,不需要做任何配置(后半句指在纯MyBatis框架中)。

它的作用范围是在同一个SqlSession中,即在同一个SqlSession中共享。

原理:只要使用同一个SqlSession对象执行同一条SQL语句就会走缓存

        我们会发现在SpringBoot结合MyBatis中没有自动开启一级缓存机制,查询相同的id使用了两次查询。但是我们在方法名上添加@Transactional注解就会发现控制台发生了变化:只执行了一次查询语句。也就是说添加了@Transactional注解就能够使用一级缓存,换言之就是同一个SqlSession。

简单回顾一下在纯MyBatis框架中如何使一级缓存失效

只要在第一次DQL和第二次DQL之间做了两件事中的任意一件就会使一级缓存清空。

  • 1、执行了SqlSession的clearCache()方法,这是手动清空缓存

  • 2、执行了INSERT或DELETE或UPDATE语句,不管是操作哪张表都会清空缓存

二级缓存的范围是SqlSessionFactory

使用二级缓存需要具备以下几个条件

  • 1、在核心配置文件添加cache-enabled: true(全局性地开启或关闭所以映射器配置文件已配置的任何缓存

但这是默认开启的,所以可以不用添加

  • 2、在需要的mapper映射文件中的<mapper></mapper>里添加<cache />

  • 3、使用二级缓存的实体类对象必须是可序化的,也就是必须实现java.io.Serializable接口

  • 4、纯MyBatis中需要将SqlSession对象关闭或提交之后,一级缓存才会被写入二级缓存中,此时二级缓存才可用

 二级缓存的失效:只要两次查询之间出现了增删改操作,当然这样同样使一级缓存失效

这是我在之前学习MyBatis中没有学习到的东西,由于学MyBatisPlus的时候接触到感觉陌生所以这里就重新学了。

回顾MySQL的limit后面两个数字

  • 第一个数字:startIndex(起始下标,下标从0开始)

  • 第二个数字:pageSize(每页显示的记录条数)

假设已知页码pageNum,还有每页显示的记录条数pageSize,第一个数字如何动态获取

  • startIndex = (pageNum - 1) * pageSize

使用PageHelper插件进行分页更加的快捷。

直接引入依赖即可,不需要配置核心配置文件

这个极其重要,需要在核心启动类Application中的@SpringBootApplication注解后面添加

接下来就可以进行我们的测试了。

 PageInfo

pageNum=1, pageSize=3, size=3, startRow=0, endRow=2, total=3, pages=1,

    以上就是本篇文章【SpringBoot结合MyBatis 【超详细】】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/news/1311.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多   
最新新闻
云南网络营销软件哪个好?权威推荐助您快速选择
在数字化时代,网络营销软件成为了许多企业实现营销目标的重要工具。然而,市面上网络营销软件琳琅满目,选择一个适合自己的并不
宫崎骏的时代结束了
在《你想活出怎样的人生》之前,宫崎骏一直是著名的退休诈骗犯。七次退休又七次复出,年过八旬,创作欲还是旺盛到令人害怕。然而
个人大数据信用查询平台哪个更准确一些?蘑菇画像个人大数据信用报告查询平台更好用
个人大数据信用查询平台哪个更准确一些?蘑菇画像个人大数据信用报告查询平台更好用,个人大数据信用查询平台市面上还是比较多的
小红书关键词热度查询!国风大潮下,品牌怎么玩出花样、玩出水平?
国风,是当下年轻人钟爱的潮流。汉服穿搭、文物手办、国潮仿妆……频频出圈。“民族的就是世界的”,国风的影响力可谓深远,一说
app推广接单发布平台哪个好?怎么领取任务赚钱?
最近几年,随着互联网的快速发展,利用网络兼职的赚钱方式也呈现越来越火,非常受大众欢迎的趋势。而且其种类也非常多:微商、社
【可打印】文学常识常考100题汇总,初中生练一练!(部编版初中语文)
关注本公众号,私信发送数字:2493,领取电子打印版文学常识1、成语“万事俱备,只欠东风”是根据《三国演义》________ (战役)
“迎旅发大会 游美丽望城”望城首届文旅短视频大赛,最高3万奖励等你来拿!
湘江水浩浩奔腾,流淌沧桑巨变。铜官窑静穆肃然,在这里诉说着望城的厚重历史,流传着“君生我未生,我生君已老”凄美爱情故事;落日
mysql导入大txt文件怎么打开_mysql怎么导入txt文件?
有时候我们在使用mysql数据库的时候,想导入txt文本文档,要怎么操作呢?下面本篇文章就来给大家介绍一下方法
寸头抖音短视频教程_人开始衰老的迹象是什么
岁月不饶人,我才50出头,可是许多衰老迹象已经越来越明显,惹得中医闺蜜笑话这样的我。1、觉得右后背和肩膀疼,出现“五十肩”
什么是网站页脚:以及最佳页脚设计示例
主体内容外,网站还包括页眉和页脚,用于帮助访问者的特定目的。由于我们认为网站页脚设计同样重要,我们整理了10个最佳免费网站
本企业新闻

点击拨打: