【笔记学习篇】一篇文章搞定Mybatis-快速回顾

devtools/2024/10/11 0:42:08/

在这里插入图片描述

概述

5.1.1 Mybatis简介
Mybatis是一款优秀的持久层框架,它以sql为中心,支持定制化sql、存储过程以及高级映射。
使用Mybatis框架,可以无需手动编写基础的JDBC代码、无需手动设置参数和转换结果集到对象。
Mybatis可以使用简单的xml或注解来配置和映射原声类型、接口和Java的pojo为数据库中的记录。
Mybatis框架本身是对JDBC的轻量级封装,学习成本低,而sql语句也方便优化,执行效率高,使用灵活,更加适合在电商等互联网项目中使用。

Mybatis的简介

在介绍Mybatis框架时,以mysql数据库操作为例。
首先,创建一个用户表作为后续讲解的操作基础,表结构如图5.1所示:
在这里插入图片描述

其次,创建g_ac_user表,并添加一条记录:

在这里插入图片描述

Mybatis底层也是基于JDBC的,与数据库之间的访问操作通过JDBC完成。

JDBC全称为Java Database Connectivity,是一种用于执行sql语句的Java API,可以为多种关系数据库提供统一访问接口。JDBC隔离了操作不同数据库的访问差异。

(2)JDBC访问操作数据库流程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

一般来说,JDBC代码耦合性强,需要在代码中拼接sql语句,编码与传参方式不灵活,同时每一次操作都需要创建与销毁连接。
Mybatis框架针对这些不足有相应的解决方案。使用Mybatis框架后,可以在xml中写sql语句,使sql语句与Java代码分离。

5.2 Mybatis初探

在g_ac_user数据表定义的基础上,介绍Mybatis框架使用的基本流程。
现在通过定义一个非常简单的需求–根据id查询用户详情,来完成第一个Mybatis程序。

1.添加依赖库
首先,需要添加Mybatis的依赖包,这里主要是引入mysql的驱动包。

在这里插入图片描述

2.在build中添加资源引入配置

2.在build中添加资源引入配置

在这里插入图片描述
3.创建实体类
在这里插入图片描述
4.创建对应数据表
创建数据库语句
在这里插入图片描述

创建数据表语句,这里设置主键id为自动递增:

在这里插入图片描述

  1. 添加xml映射文件

在这里插入图片描述

  1. 添加mybatis.xml配置文件
    在这里插入图片描述
  2. 测试

每个基于 Mybatis的应用都是以一个SqlSessionFactory的实例为核心的。

SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得,而
SqlSessionFactoryBuilder则可以从xml配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。

Mybatis封装了对数据库的访问,把对数据库的会话和事务控制放到了SqlSession对象中。
Mybatis操作数据库有两种方式:
(1)从ibatis继承的传统的SqlSession接口操作
(2)使用Mapper的操作方式
接下来结合实例看看这两种方式。

Mybatis操作数据库有两种方式:
(1)从ibatis继承的传统的SqlSession接口操作

在这里插入图片描述
在这里插入图片描述

Mybatis操作数据库有两种方式:
(2)使用Mapper的操作方式

在这里插入图片描述

在这里插入图片描述
Mybatis操作数据库有两种方式:
以上两种操作方式的输出结果是一致的,输出结果为:

在这里插入图片描述

5.3.1 Xml映射文件

在Mybatis框架中,数据库操作映射是由xml配置文件和mapper映射方法共同组成的。随后分别对数据库操作常用的增删改查操作的配置方式进行简要介绍。

数据库常用操作配置方式

  1. 增加:
    (1)不传参
    在这里插入图片描述

上述是最简单的方式,在语句中直接给sql语句写上固定的值,然后对应的mapper方法只需要写成:
在这里插入图片描述

数据库常用操作配置方式

  1. 增加:
    (2)parameterType指定类型
    在这里插入图片描述

对应的mapper方法如下:
在这里插入图片描述

数据库常用操作配置方式

  1. 增加:
    (3)@Param注解指定名称
    在这里插入图片描述
    对应的mapper方法:
    在这里插入图片描述
    数据库常用操作配置方式
  2. 删除:
    在delete标签中写删除语句::
    在这里插入图片描述
    对应mapper接口方法
    在这里插入图片描述

数据库常用操作配置方式
3. 修改:
在delete标签中写修改语句:

对应mapper接口方法:

在这里插入图片描述在这里插入图片描述
数据库常用操作配置方式
4. 查询:
在select标签中写查询语句:
在这里插入图片描述

对应mapper接口方法:
在这里插入图片描述
数据库常用操作配置方式
4. 查询:
(1)模糊查询
在sql中模糊查询使用like关键词,在之前的学习中了解到等号的使用方式就是直接在等号后面写上变量即可,那么like在Mybatis中怎么使用呢?
方法一:方法一:使用模板变量
在这里插入图片描述

方法二:使用双引号包裹%

在这里插入图片描述

方法三:CONCAT函数连接字符串

在这里插入图片描述

数据库常用操作配置方式
4. 查询:
(2)结果映射
resultMap是Mybatis中提供的一个非常强大的功能,虽然通过resultType=java.util.HashMap也可以来指定返回值的包装,在大部分情况下都够用,但是HashMap不是一个较好的领域模型。
更多的会使用JavaBean和POJO作为领域模型,Mybatis对两者都提供了支持,但两者不能同时使用。

数据库常用操作配置方式
4. 查询:
(2)结果映射
select的resultMap值对应resultMap标签的id,实例如下。

在这里插入图片描述

数据库常用操作配置方式
4. 查询:
(3)结果缓存
Mybatis缓存机制有两级,一级缓存已经自动开启,无需手动操作,而且不能关闭;二级缓存需要手动开启。
开启方式:在全局配置文件的settings标签中增加或修改如下配置:
在这里插入图片描述

然后在响应的xml映射文件中增加cache标签:
在这里插入图片描述

数据库常用操作配置方式
4. 查询:
(3)结果缓存
cache元素用来开启当前mapper的namespace下的二级缓存,该元素的属性设置如下:
flushInterval:刷新间隔,可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段,默认情况下是不设置的,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

size:缓存数目,可以被设置为任意正整数,要记住缓存对象数目和运行环境可用内存资源数目,默认值是1024。

readOnly:只读,属性可以被设置为true或false。因为只读的缓存会给所有调用者返回缓存对象的相同实例,所以这些对象不能被修改。这提供了很重要的性能优势,可读写的缓存会返回缓存对象的拷贝(通过序列化),这个操作会慢一些,但是安全,因此默认是false。
eviction:收回策略,默认为LRU,有如下几种:
LRU:最近最少使用的策略,移除最长时间不被使用的对象。
FIFO:先进先出策略,按对象进入缓存的顺序来移除它们。
SOFT:软引用策略,移除基于垃圾回收器状态和软引用规则的对象。WEAK:弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对象。

5.3.2 动态sql语句

动态sql语句也是Mybatis非常强大的一个特性,可以让开发者在sql语句编写过程中减少出错的几率。
动态sql语句通过使用类似xml的语法来进行逻辑的判断与处理,Mybatis 3通过使用功能强大的OGNL表达式,大大精简了元素的种类,使得学习成本更低了。
在动态sql语句中,#方式能很大程度防止sql注入, 方式无法防止 s q l 注入。 方式无法防止sql注入。 方式无法防止sql注入。一般用于传入数据库对象,比如表名、列名。KaTeX parse error: Expected 'EOF', got '#' at position 47: …其安全性受到更多威胁,一般能用#̲的就尽量不用
动态sql相关标签包括条件、循环、关联和包含几个分类。

(1)条件型
根据条件判断是否拼接语句,包含标签组if、choose(when、otherwise)、trim等。

  1. if、where
    通常作为where子句的一部分。一般用来根据前端传过来的条件进行筛选,比如当前端要在设备列表中根据设备名称查询设备列表。

  2. if、where
    在传统的写法中,为了减少后续代码的判断,通常会在where后跟上一个1=1这样一个无意义的条件,以方便后续的条件拼接,如:

在这里插入图片描述

  1. if、where
    如果放在where标签内,则where标签会自动帮助开发者判断,当where中的条件有一项if是true而拼接了and或or语句,那么就会自动将where加上;否则将不会加上where。

在这里插入图片描述
2. chose
主要包含的标签有以下两个:
when
Otherwise
choose标签包含when和otherwise两个子标签,来实现在多个选项中进行判断的逻辑。有些类似于Java代码中switch语句。

  1. chose
    在Mybatis中没有else标签,要实现if、elseif、else功能,也需要借助于这个标签来实现。这里实现当前端不传某个设备状态的时候,查询的设备列表中不包含标记为“已删除”状态的设备,示例语句如下:
    在这里插入图片描述

  2. chose
    虽然在大部分情况下,前面的条件判断标签已经能满足日常使用的需求,但是假如在特殊场景下,用户依然会有灵活控制的需求。
    通过trim标签,可以实现类似于自定义标签的功能,实现更灵活的控制。下面以实现一个where为例,与where标签等价的trim标签如下

在这里插入图片描述

循环型主要使用foreach标签。foreach标签对集合进行操作,可以用来进行多条数据的插入或更新,以及查询语句的自动拼接。
(1)根据id数组查询列表

在这里插入图片描述

对应的mapper接口方法:

在这里插入图片描述
(2)批量插入
模板sql语句:

在这里插入图片描述

对应的mapper接口方法
在这里插入图片描述

(3)关联

关联查询一般有两种方式,分别是“嵌套结果”和“嵌套查询”。
嵌套查询的语句一般结构简单,但是在一次查询中要执行多条sql语句,效率会比较低;嵌套结果的语句结构比较复杂,但是语句只执行一次,性能相对高一些。
关联查询的场景包括一对一、一对多、多对一。

  1. 一对一
    示例:如果一条账号信息对应一条用户信息,那么登录表和用户表就是一对一的关系。所以,需要先创建账号信息表和身份信息表,再定义映射文件。
    在这里插入图片描述

  2. 一对一
    创建账号信息表:

在这里插入图片描述

创建身份信息表:
在这里插入图片描述

  1. 一对一
    定义sql映射文件
    方法一:嵌套结果(实际上就是通过join表连接查询,然后通过resultMap指定返回值结构包装)

在这里插入图片描述

  1. 一对一
    定义sql映射文件
    方法二:嵌套查询:实际是做多次查询,将表之间关联的数据关系拆分为多条语句执行。

在这里插入图片描述

  1. 一对一
    定义sql映射文件
    方法二:嵌套查询:实际是做多次查询,将表之间关联的数据关系拆分为多条语句执行。

在这里插入图片描述

  1. 一对多
    这里,假设一个账号对应多条用户信息。
    指定collection标签的property属性,通过select属性指定下一步查询使用的语句id,通过column属性向下一步查询传递参数。

  2. 一对多
    方法一:嵌套结果

在这里插入图片描述

  1. 一对多
    方法一:嵌套查询

在这里插入图片描述

  1. 多对一
    人员属于某个单位,这里创建单位表,包含字段id、unit_name
    方法一:嵌套结果

在这里插入图片描述

  1. 多对一
    方法二:嵌套结果

在这里插入图片描述

面向对象的三大特性,封装是其中之一。
Mybatis也提供了include和sql标签来实现包含的功能。可以通过sql标签定义通用语句,比如将条件查询拆分然后在多处引用,Mybatis会在编译阶段将其合并。
比如对于查询用户列表,拆分前如下代码所示,条件判断只能在这一处使用。

在这里插入图片描述

拆分后,将if条件判断放入sql标签内,那么whereCondition就是一个可复用的语句块,可以在多个地方引用,减少代码重复。
在这里插入图片描述

5.3.2* mapper

Mybatis中的mapper就是指Mybatis执行数据库操作的接口和方法,在非注解模式下还包括与当前mapper类所对应的xml文件。
在Mybatis提供的功能中,可以直接在java mapper接口上及其方法参数上使用注解,可用注解如下:
@Insert : 新增 , 和xml insert sql语法完全一样;
@Select : 查询, 和xml select sql语法完全一样;
@Update : 更新, 和xml update sql语法完全一样;
@Delete : 删除, 和xml delete sql语法完全一样;
@Param : 入参,通过value指定sql语句中可用的参数名称;
@Results : 结果集合;
@Result : 结果。

5.3.3 Mybatis的xml配置

xml映射配置文件包含了对Mybatis框架运行较为重要的settings、properties和typeAliases信息等,以下分别予以介绍。

  1. properties
    这些属性都是可以外部配置并且可以动态替换的,既可以在典型的Java属性文件中配置,也可以通过properties元素的子元素来传递,例如:

在这里插入图片描述

  1. properties
    其中的属性就可以在整个配置文件中使用来替换需要动态配置的属性值,比如
    在这里插入图片描述

driver和url属性将会由config.properties文件中对应的值来替换,这样就为配置提供了诸多灵活选择,属性也可以被传递到SqlSessionBuilder.build()方法中。例如:

在这里插入图片描述

  1. properties
    如果属性在多个地方进行了配置,那么Mybatis加载的顺序为:
    (1)在properties元素体内指定的属性首先被读取
    (2)然后根据properties元素中的resource属性读取类路径下的属性文件,或者根据url属性文件或根据url属性指定的路径读取属性文件,并覆盖已经读取的同名属性。
    (3)最后读取作为方法参数传递的属性,并覆盖已经读取的同名属性。
    因此,通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,properties中指定属性优先级最低。以下对Mybatis配置中的重要参数进行介绍。

  2. settings
    这是Mybatis中极为重要的参数调整,它们会改变Mybatis的运行时行为。一个完整的settings元素的示例如下:
    在这里插入图片描述

  3. typeAliases
    类型别名是为Java类型设置一个短的名字,它只和XML配置有关,存在的意义仅在于用来减少类完全限定类型的冗余,例如:
    在这里插入图片描述

当这样配置时,Blog不仅可以用在任何使用domain.blog.Blog的地方,也可以指定一个包名,Mybatis会在包名下搜索需要的Java Bean,比如:

在这里插入图片描述

每一个在包domain.blog中的Java Bean,在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为它的别名。(比如domain.blog.Author的别名为author;若有注解,则别名为其注解值。)

5.3.4 日志

一般来说,Mybatis内置日志工厂在运行时选择合适的日志工具,并且内置的日志工厂将从以下日志实现中按顺序查找。

  1. slf4j
  2. Apache Commons Logging
  3. Log4j 2
  4. Log4j
  5. JDK Logging
    如果未找到,那么日志功能不启用。

一些Java服务器中已经内置了Apache Commons Logging的实现,所以当Mybatis的运行环境在这些服务器中时,需要在配置文件中添加一个setting配置。

5.3.4 日志
日志输出需要用到src/main/resources下的log4j.properties配置文件,示例如下:
logImpl可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是实现了接口org.apache.ibatis.logging.Log 的,且构造方法是以字符串为参数的类的完全限定名。

在这里插入图片描述

5.4.1 代码生成

在代码编写过程中,其中一项比较繁琐的工作就是各种目录和文件的创建,以及其中基础内容的添加。这些工作如果完全由人工手动完成,那么将占用开发者大量时间在这样的重复工作之中,这个时候,代码生成器就是至关重要的了。
Mybatis通过Mybatis Generator提供代码生成的功能。
要使用Mybatis Generator提供的代码生成功能,需要引入相关的jar包。

(1)添加配置文件
在src/main/resources中新增generator-config.xml配置文件,配置数据库连接、指定生成的文件和位置,以及所要生成的数据库表。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(1)添加配置文件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(2)生成方式
通常来说,生成方式主要有如下几种:
命令行方式
使用ant
使用maven
使用Java代码
Eclipse插件
下面分别对命令行生成、Java代码生成和Eclipse插件生成三种方式进行简要介绍。

插件机制是使用框架编程过程中一种非常优秀的机制,可以在不改动原有程序文件代码的情况下实现功能的扩展。 Mybatis允许在映射语句执行的某一点进行拦截增强,默认情况下,Mybatis可以被拦截的接口和方法有列举如下:
Executor(update、query、flushStatements、commint、rollback、getTransaction、close、isClosed)
ParameterHandler(getParameterObject、setParameters)
ResultSetHandler(handleResultSets、handleOutputParameters)
StatementHandler(prepare、parameterize、batch、update、query)
由于这些都是Mybatis的基础模块,所以编写插件的时候需要非常小心,以免影响Mybatis本身功能的稳定性。

(1)插件模板
Mybatis插件实现org.apache.ibatis.plugin.Interceptor接口,在实现类中进行插件功能逻辑的编写。Interceptor接口的结构如下:

在这里插入图片描述

从结构上可以看到包含3个方法需要实现:
1.intercept方法:是拦截器实现的主要方法。这种实现方法及命名在其它框架中也有使用,插件所需要做的主要操作逻辑也应该是在这个方法内部完成的。
2.plugin方法:这个函数中的参数target就是被拦截器拦截的对象,此方法会在目标对象执行前被调用,方法的实现很简单,只需要调用org.apache.ibatis.plugin.Plugin类的静态方法wrap即可拦截目标对象.
3.setProperties方法:是用来传递插件的参数,不同的参数可以影响插件的行为。这里的参数通过在mybatis-config.xml文件中配置插件来传入

(2)注解配置拦截器及签名
除了需要实现拦截器接口之外,还需要给实现类配置拦截器添加注解org.apache.ibatis.plugin.@Interceps和org.apache.ibatis.plugin.@Signature。这两个注解是用来配置拦截器要拦截的接口的方法。配置签名如下:

在这里插入图片描述

5.5.2 插件使用

打开前面“开发第一个Mybatis程序中的UserMapper类”,按着键盘ctrl键,然后将鼠标移动到接口方法上,可以看到其中多了一个选项“Open … in *.xml”,这就是mybatipse插件对于提示功能的增强,如图5.11所示。

在这里插入图片描述


http://www.ppmy.cn/devtools/123902.html

相关文章

java速成指南

密码都是 123 适用于php .net 7天转java 【腾讯文档】快速上手培训-阿龙 分享给你多个文件 https://docs.qq.com/s/jUcRQ4VPA4grzx8SPYzrBa 第一节 安装jdk,maven,idea_哔哩哔哩_bilibili

心觉:开发潜意识的详细流程和步骤是什么

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作195/1000天 最近领教了一下潜意识的力量和吸引力法则 我想要一张可以放在榻榻米壁柜上的迷你型的电动升降桌,桌面60cm…

网络编程(17)——asio多线程模型IOThreadPool

十七、day17 之前我们介绍了IOServicePool的方式,一个IOServicePool开启n个线程和n个iocontext,每个线程内独立运行iocontext, 各个iocontext监听各自绑定的socket是否就绪,如果就绪就在各自线程里触发回调函数。为避免线程安全问题&#xf…

Python测试框架--Allure

严格意义上讲 Allure 不算是测试框架,但是它是生成漂亮测试报告的开源工具,搭配 Pytest 测试框架食用更搭。 也就是说 Allure 是在 Pytest 执行完生成的测试数据的基础上,对测试数据进行处理统计,生成格式统一、美观的测试报告。 …

分治算法(3)_快速选择_数组中的第K个最大元素

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 分治算法(3)_快速排序_数组中的第K个最大元素 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论&#…

速盾:游戏被攻击怎么办?

随着游戏行业的发展,游戏被攻击的情况也越来越多见。游戏被攻击可能导致游戏服务器崩溃、用户数据泄露、游戏体验受影响等问题。作为游戏开发者或运营商,面对游戏被攻击的情况,应该采取一系列的措施来应对。 首先,要及时发现游戏…

Python 基于 flask 的前程无忧招聘可视化系统,Python大数据招聘爬虫可视化分析

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

牛客:[NOIP2002]字串变换(双向bfs)

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 已知有两个字串 A, B及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在A中的子串 A1可以变换为 B1、A2可以变换为 B2…