Mybatis
MyBatis框架最新完整版视频教程(idea版)mybatis实战入门讲解_哔哩哔哩_bilibili
【尚硅谷】2022版MyBatis教程(细致全面,快速上手)_哔哩哔哩_bilibili
1|0MyBatis 框架
2|0第一章 框架的概述
2|11.三层架构
mvc:web开发中,使用mvc架构模式。 m:数据, v:视图, c:控制器。
mvc作用:
三层架构:
1.界面层(视图层):接收用户的请求,调用service, 显示请求的处理结果的。 包含了jsp,html,servlet等对象。 对应的包controller,
2.业务逻辑层:处理业务逻辑, 使用算法处理数据的。 把数据返回给界面层。 对应的是service包,和包中的很多的XXXService类。 例如: StudentService , OrderService, ShopService
3.持久层(数据库访问层):访问数据库,或者读取文件,访问网络。获取数据。 对应的包是dao。 dao包中很多的StudentDao, OrderDao, ShopDao等等。
2|22. 三层架构请求的处理流程
用户发起请求---->界面层----->业务逻辑层---->持久层---->数据库(mysql)
2|33. 为什么要使用三层?
1,结构清晰、耦合度低, 各层分工明确
2,可维护性高,可扩展性高
3,有利于标准化
4,开发人员可以只关注整个结构中的其中某一层的功能实现
5,有利于各层逻辑的复用
2|44. 三层架构模式和框架
每一层对应着一个框架
1)界面层---SpringMVC框架
2)业务层---Spring框架
3)持久层---MyBatis框架
2|55 .框架
- 什么是框架(framework)
框架:就是一个软件, 完成了部分的功能。 软件中的类和类之间的方法调用都已经规定好了。 通过这些可以完成某些功能。 框架看做是模版。
框架是可以升级的,改造的。 框架是安全的。
框架是对某一个方面有用的,不是全能的。
2|66. 框架解决的问题
1)框架能实现技术的整合。
2)提供开发的效率。 降低难度。
2|77. jdbc访问数据库的优缺点
优点:
- 直观,好理解
缺点:
- 创建很多对象 Connection ,Statement, ResultSet
- 注册驱动
- 执行sql语句
- 把ResultSet转为 Student , List集合。
- 关闭资源
- sql语句和业务逻辑代码混在一起
2|88 MyBatis框架
什么 mybatis: 是一个持久层框架, 原名是ibatis, 2013改名为 MyBatis. MyBatis可以操作数据库,对数据执行增删改查。 看做是高级的jdbc。 解决jdbc的缺点。
mybatis能做什么?
1) 注册驱动 。
2) 创建jdbc中使用的Connection, Statement,ResultSet
-
执行sql语句, 得到ResultSet
-
处理ResultSet, 把记录集中的数据转为java对象, 同时还能把java对象放入到List集合。
5)关闭资源
6)实现sql语句和java代码的解耦合。
mybatis的文档: https://mybatis.org/mybatis-3/zh/index.html
3|0第二章 MyBatis入门
3|12.1 第一个例子
实现步骤:
创建student表(id,name,email,age)
新建maven项目
修改pom.xml
- 加入依赖 mybatis依赖, mysql驱动, junit
- 在
加入资源插件
pom.xml
创建实体类Student,定义属性, 属性名和列名保持一致
Student.java
创建Dao接口, 定义操作数据库的方法
StudentDao.java
创建xml文件(mapper文件), 写sql语句
StudentDao.xml
mybatis框架推荐是把sql语句和java代码分开
mapper文件:定义和dao接口在同一目录, 一个表一个mapper文件。
创建mybatis的主配置文件(xml文件):有一个, 放在resources目录下
mybatis.xml
1)定义创建连接实例的数据源(DataSource)对象
- 指定其他mapper文件的位置
创建测试的内容
使用main方法,测试mybatis访问数据库
也可以使用junit 访问数据库
MyTest.java
3|22.2 概念
1.自动提交:当你的 sql语句执行完毕后, 提交事务。 数据库更新操作之间保存到数据
2.手动(手工)提交事务:在你需要提交事务的位置, 执行方法,提交事务或者回顾事务。
3|32.3 MyBatis的一些重要对象
1) Resources : mybatis框架中的对象, 一个作用读取 主配置信息。
2)SqlSessionFactoryBuilder:负责创建SqlSessionFactory对象
3)SqlSessionFactory: 重要对象
SqlSessionFactory是重量级对象:创建此对象需要使用更多的资源和时间。 在项目中有一个就可以了。
SqlSessionFactory接口:作用是SqlSession的工厂, 就是创建SqlSession对象。
DefaultSqlSessionFactory实现类
SqlSessionFactory接口中的方法
openSession(): 获取一个默认的SqlSession对象, 默认是需要手工提交事务的。
openSession(boolean): boolean参数表示是否自动提交事务。
- SqlSession对象
SqlSession对象是通过SqlSessionFactory获取的。 SqlSession本身是接口
DefaultSqlSession: 实现类
SqlSession作用是提供了大量的执行sql语句的方法:
注意SqlSession对象不是线程安全的, 使用的步骤:
①:在方法的内部,执行sql语句之前,先获取SqlSession对象
②:调用SqlSession的方法,执行sql语句
③:关闭SqlSession对象,执行SqlSession.close()
3|42.4 使用模版
创建模版,mapper文件模版和mybatis主配置文件模版
创建模版的步骤:
创建模版文件:
创建文件选择使用的模版:
3|52.5 使用工具类
MyBatisUtil
StudentDao
StudentDao.xml
测试类
实现Dao接口的方式
StudentDaoImpl
测试类
4|0第三章 MyBatis的Dao代理
4|13.1 dao代理
3.1.1 mybatis提供代理:
mybatis创建Dao接口的实现类对象, 完成对sql语句的执行。 mybatis创建一个对象代替你的 dao实现类功能。
3.1.2 使用mybatis代理要求
1)mapper文件中的namespace 一定dao接口的全限定名称
2)mapper文件中 标签的id是dao接口方法名称
3.1.3 mybatis代理实现方式
使用SqlSession对象的方法 getMapper(dao.class)
例如: 现在有 StudentDao接口。
所以2.5中的测试方法可以写成
4|23.2 理解参数
理解参数是: 通过java程序把数据传入到mapper文件中的sql语句。 参数主要是指dao接口方法的形参
3.2.1 parameterType
parameterType:表示参数的类型, 指定dao方法的形参数据类型。 这个形参的数据类型是给mybatis使用。 mybatis在给sql语句的参数赋值时使用。 PreparedStatement.setXXX( 位置, 值)
3.2.2 dao接口方法是一个简单类型的参数
可以通过${}
和#{}
以任意的名称
获取参数值,但是需要注意${}
的单引号问题
但是一般来说,不会使用任意的名称,还是会以传输过来的参数名去当名称(为了见名识义)
3.2.3 dao接口方法有多个简单类型的参数,使用位置
此时MyBaits会将这些参数放在一个map集合中,以两种方式进行存储
- 以 arg0、arg1……为键,以参数为值
- 以 param0、param1……为键,以参数为值
因此只需要通过 #{}
和 ${}
以键的方式访问值即可,但是需要注意 ${}
的单引号问题
3.2.4 dao接口参数是一个Map
map作为dao接口的参数, 使用 key 获取参数值,mapper文件中,语法格式 #{key}
mapper文件
测试,调用方法的位置
3.2.5 dao接口方法使用一个对象作为参数
方法的形参是一个java对象。这个java对象表示多个参数。使用对象的属性值作为参数使用
java对象
dao接口中的方法定义
mapper文件
3.2.6 使用@Param标识参数
此时 MyBatis 会将这些参数放在一个 map 集合中,以两种方式进行存储
- 以@Param注解的值为键,以参数为值
- 以 param1、param2……为键,以参数为值
dao接口,方法的定义
mapper文件
也可以(以 param1、param2……为键)
总结
建议分成两种情况进行处理
实体类类型的参数
使用@Param标识参数
4|33.3 #和$的区别
${}
本质是字符串拼接
#{}
本质是占位符赋值
3.3.1 # 占位符
语法: #{字符}
mybatis处理#{}
使用jdbc对象是 PrepareStatment对象
#{}
特点:
1)使用的PrepareStatement对象,执行sql语句,效率高。
2)使用的PrepareStatement对象,能避免sql注入, sql语句执行更安全。
3) #{}
常常作为列值使用的, 位于等号的右侧, #{}
位置的值和数据类型有关的。
3.3.2 $ 占位符
语法 : ${字符}
mybatis执行${}
占位符的sql语句
${}
的特点
1)使用Statement对象,执行sql语句,效率低
2)${}
占位符的值,使用的字符串连接方式, 有sql注入的风险。 有代码安全的问题
${}
数据是原样使用的, 不会区分数据类型。
4)${}
常用作 表名或者列名, 在能保证数据安全的情况下使用 ${}
3.3.3 区别
3.3.4 $ 的用处
现在有一个需求,需要根据id、name、email等字段分别排序,如果分开写的话会有好几个重复的方法
如果用 #{}
,会有问题
这里自动拼接完成后,select * from student order by 'name'
,并不能起到根据name
排序的作用
得换成${}
。以下是组合使用的一个例子
4|43.4 封装MyBatis输出结果
封装输出结果: MyBatis执行sql语句,得到ResultSet, 转为java对象。
讲两个 resultType, resultMap(不能同时使用)
resultType:设置默认的映射关系
resultMap:设置自定义的映射
默认的映射关系
:当我们把实体类类型设置出来之后,会自动的把我们当前查询出来的结果的字段名来作为属性名为这个当前类中的属性进行赋值,如果能匹配到属性则赋值,如果匹配不到就不赋值。所以在默认的映射关系中,我们尽量要保证实体类中的属性名要跟我们数据库的表的字段包保持一致
自定义的映射
:如果字段名跟属性名不一致的情况,用resultMap,或者多对一和一对多关系
3.4.1 resultType
resultType属性: 在执行select时使用, 作为<select>
标签的属性出现的。
resultType:表示结果类型 , mysql执行sql语句,得到java对象的类型。 它的值有两种
-
java类型的全限定名称
-
使用别名
resultType:表示java自定义对象
resultType表示简单类型
dao方法
mapper文件
测试类
resultType:表示一个map结构
dao方法
mapper文件
测试类
练习题:
输入一个省份id ,得到 省份id ,省份name, 城市id,城市名称
例如输入 省份id=1
1 河北 1 石家庄
1 河北 2 秦皇岛
3.4.2 resultMap
resultMap: 结果映射。 自定义列名和java对象属性的对应关系。 常用在列名和属性名不同的情况。
用法:
-
先定义 resultMap标签, 指定列名和属性名称对应关系
-
在select标签使用resultMap属性,指定上面定义的resultMap的id值
4|53.5 自定义别名
mybatis提供的对java类型定义简短,好记名称。
自定义别名的步骤:
- 在mybatis主配置文件,使用 typeAliases标签声明别名
- 在mapper文件中, resultType="别名"
声明别名(mybatis主配置文件)
mapper文件中使用
4|63.6 列名和java对象属性名称不一样解决方式
1) 使用resultMap: 自定义列名和属性名称对应关系
2)使用resultType: 使用列别名,让别名和java对象属性名称一样
4|73.7 like
第一种方式: 在java程序中,把like的内容组装好。 把这个内容传入到sql语句
mapper
执行like
第二种方式: 在sql语句,组织like的内容。
sql语句like的格式: where name like "%"空格#{name}空格"%"
总体上感觉,第一种方式更灵活一点
5|0第四章 动态sql
动态 SQL,通过 MyBatis 提供的各种标签对条件作出判断以实现动态拼接 SQL 语句。这里的条件判断使用的表达式为 OGNL 表达式。常用的动态 SQL 标签有<if>/<where>/<choose>/<foreach>
等。 MyBatis 的动态 SQL 语句,与 JSTL 中的语句非常相似。
动态 SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据 用户提交的查询条件进行查询。提交的查询条件不同,执行的 SQL 语句不同。 若将每种可能的情况均逐一列出,对所有条件进行排列组合,将会出现大量的 SQL 语句。此时,可使用动态 SQL 来解决这样的问题
在 mapper 的动态 SQL 中若出现大于号(>)、小于号(<)、大于等于 号(>=),小于等于号(<=)等符号,最好将其转换为实体符号。否则, XML 可能会出现解析出错问题。
特别是对于小于号(<),在 XML 中是绝不能出现的。否则解析 mapper 文件会出错。
实体符号表:
< | 小于 | < |
---|---|---|
> | 大于 | > |
>= | 大于等于 | >= |
<= | 小于等于 | <= |
5|14.1 if 标签
对于该标签的执行,当 test 的值为 true 时,会将其包含的 SQL 片断拼接 到其所在的 SQL 语句中。
语法:
例子:
5|24.2 where 标签
<if>
标签的中存在一个比较麻烦的地方:需要在 where 后手工添加 1=1 的子句。因为,若 where 后的所有条件均为 false,而 where 后若又没 有 1=1 子句,则 SQL 中就会只剩下一个空的 where,SQL 出错
。所以,在 where 后,需要添加永为真子句 1=1,以防止这种情况的发生。但当数据量很大时,会严重影响查询效率。
使用<where>
标签,在有查询条件时,可以自动添加上 where 子句;没有查询条件时,不会添加 where 子句。需要注意的是,第一个<if>
标签中的 SQL 片断,可以不包含 and。不过,写上 and 也不错,系统会将多出的 and 去掉。但其它<if>
中 SQL 片断的 and,必须要求写上。否则 SQL 语句将拼接 出错
语法:
例子:
5|34.3 foreach 循环
<foreach>
标签用于实现对于数组与集合的遍历。对其使用,需要注意:
- collection 表示要遍历的集合类型, list ,array 等。
- open、close、separator 为对遍历内容的 SQL 拼接。
语法:
手工写
第一种方式(循环简单类型的List集合):
第二种方式(循环对象类型的List):
5|44.4 sql标签
<sql/>
标签用于定义 SQL 片断,以便其它 SQL 标签复用。而其它标签使 用该 SQL 片断,需要使用<include/>
子标签。该<sql/>
标签可以定义 SQL 语 句中的任何部分,所以<include/>
子标签可以放在动态 SQL 的任何位置。
使用方式:
例如:
6|0第五章 MyBatis配置文件
mybatis配置文件两大类: 1 mybatis主配置文件; 2 mybatis的mapper文件
- mybatis主配置文件,提供mybatis全局设置的。包含的内容 日志, 数据源,mapper文件位置
- mapper文件: 写sql语句的。 一个表一个mapper文件
6|15.1 settings部分
settings是mybatis的全局设置,影响整个mybatis的运行。 这个设置一般使用默认值就可以了。
6|25.2 typeAliase 别名
设置别名
6|35.3 配置环境
6|45.4 使用数据库属性配置文件(*)
需要把数据库的配置信息放到一个单独文件中, 独立管理。 这个文件扩展名是 properties. 在这个文件中,使用自定义的key=value的格式表示数据
使用步骤:
1.在resources目录中,创建xxxx.properties
2.在文件中,使用 key=value的格式定义数据。
例如 jdbc.url=jdbc:mysq://localhost:3306/springdb
3.在mybatis主配置文件, 使用properties标签引用外部的属性配置文件
4.在使用值的位置, 使用${key}获取key对应的value(等号右侧的值)
例子:
jdbc.properties
mybatis主配置文件
6|55.5 mapper 标签(*)
使用mapper指定其他mapper文件的位置,
mapper标签使用的格式有两个常用的方式:
7|0第六章 PageHelper
PageHelper做数据分页。 在你的select语句后面加入 分页的 sql 内容, 如果你使用的mysql数据库, 它就是在select * from student
后面加入 limit 语句。
使用步骤:
1.加入依赖pagehelper依赖
2.在mybatis主配置文件, 加入plugin声明
3.springboot 配置
4.在select语句之前,调用PageHelper.startPage(页码, 每页大小)
__EOF__

本文链接:https://www.cnblogs.com/dongye95/p/15863641.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!