mybatis手把手教学,希望大家能拿下它
yuyutoo 2025-01-23 22:10 1 浏览 0 评论
目录
1.jdbc封装中的问题 1
2.mybatis介绍 4
3.框架搭建 4
1)导包 5
2)配置文件 6
配置dtd约束 7
3) 创建SqlSessionFactory对象 9
4.入门案例 9
1.部门实体类 9
2.sql语句 9
3.配置mappe的dtd约束 10
4.sql语句的配置文件 11
5.在sqlMapConfig.xml中,注册dept.xml 11
6.调用 12
5.执行流程 12
6.案例 14
1)查询所有部门 14
2)查询指定部门信息 14
3)新增部门 15
4)修改部门 16
5)删除部门 16
7.常见异常 17
8.mapper配置文件简单使用 19
1)输入参数 19
1.简单类型 19
2.自定义对象 20
3.自定义对象包装类 20
4.Map 21
2)返回值 22
resultType 22
resultMap 22
返回值类型 23
3)模糊查询 25
4)使用别名简化配置 26
5)特殊字符 27
9.mybatis -dao经典模式 28
10.mybatis主配置文件配置信息 30
10.1 properties 30
10.2 Settings 31
10.3 typeAliases 32
10.4 typeHandlers 32
10.5 objectFactory 34
10.6 plugins 34
10.7 environments 35
10.8 mappers 35
11.动态sql 35
11.1 if标签 36
注意事项 37
11.2 where 39
11.3 choose,when,otherwise 40
11.4 sql标签 41
11.5 foreach标签 42
1.jdbc封装中的问题
使用持久层框架,可以解决这些问题
持久层框架其实就是dao层框架,将数据持久化到磁盘上
2.mybatis介绍
持久层框架,mybatis,ibatis,hibernate…
ssh: struts2, spring ,hibernate
ssm: springmvc, spring ,mybatis-》目前的主流框架
ibtais是mybatis的前身,阿帕奇的开源项目
3.框架搭建
新建java project工程
1)导包
1.核心包
2.依赖的包
3.数据库的驱动包
4.junit测试包
2)配置文件
所有的配置文件,都放置在src根目录下
1.log4j的配置文件
2.mybatis的主配置文件(配置数据的响应信息)
src下新建一个xml,文件命名为: sqlMapConfig.xml, 文件名不是固定的,可以随意命名,但是,一般使用sqlMapConfig.xml
配置文件如何编写,参照帮助文档
配置dtd约束
A) 复制key
B)配置 windowpreferences
C)检查配置
配置完成之后,重新打开xml,联想会有标签提示
sqlMapConfig.xml
3) 创建SqlSessionFactory对象
但是不能通过这种方式验证,框架是否搭建成功,通过入门案例验证
4.入门案例
需求:查询所有的部门
1.部门实体类
2.sql语句
select * from dept;
不会所有的sql语句写在同一个配置文件中
一般来说,一个实体类对应一个配置文件(一个功能对应一个配置文件)
所以,需要新建dept.xml
一般sql语句的配置文件,放在dao目录下
dept.xml中如何编写,参照帮助文档
3.配置mappe的dtd约束
4.sql语句的配置文件
5.在sqlMapConfig.xml中,注册dept.xml
6.调用
5.执行流程
1)创建一个工厂构建器的实例
2)工厂构建器,解析sqlMapConfig.xml,通过配置文件中的数据库相关配置,创建出工厂实例
解析sqlMapConfig.xml的时候,解析<mappers>标签,拿到配置的sql语句的xml文件,并且解析这些xml文件
解析dept.xml,创建了一个容器,所有的xml中的sql标签对象,全部都放到容器中
3)通过工厂拿到一个SqlSession对象,此时,并没有真正的创建数据库连接
4)通过SqlSession对象操作数据库
mybatis通过参数(sql标签的key)到容器中拿这个sql标签对象。拿到之后,创建数据库连接,到数据库查询—》会有一个查询结果集
mybatis自动的通过配置转换查询结果集为调用者需要的对象,然后返回。
6.案例
1)查询所有部门
--》见 4.入门案例
2)查询指定部门信息
Dept.java
dept.xml
dept.xml在sqlMapConfig.xml中注册
3)新增部门
Dept.java
dept.xml
dept.xml在sqlMapConfig.xml中注册
sql语句
调用
4)修改部门
5)删除部门
Dept.java
dept.xml
dept.xml在sqlMapConfig.xml中注册
sql语句配置
调用
7.常见异常
1.session调用的时候,sql对象的key给错误的。
解决方向: 检查session调用的时候,给的sql对象的key值(namespace+标签ID)
2.sql标签对象中,resultType给错误的
3.sql语句写错误的
4.实体类添加有参构造(不添加无参构造)
5.sql语句中取参的时候,属性名写错
8.mapper配置文件简单使用
1)输入参数
parameterMap, parameterType
一般使用parameterType属性,而parameterMap已基本废弃,要使用parameterMap,需要在顶一个parameterMap对象
一般使用parameterType,根据传入参数的类型,可以大致分为以下几类
parameterType=类的全地址
1.简单类型
#{key}
key可以随意写
2.自定义对象
#{key}, key:组成get方法的名称(一般来说就是实体类中的属性名)
3.自定义对象包装类
自定义对象中含有自定义对象
比如:User对象中含有Role对象
#{key.属性名} key就是User对象中的role属性,属性名指的是Role对象中的属性
需求:根据部门查询员工信息
1)员工的实体类
2)emp.xml
3)sqlMapConfig.xml注册配置文件
4.Map
parameterType=”java.util.Map”
#{key} key:map容器中的key
2)返回值
resultType
比较方便,但是每次使用resultType都需要使用别名
resultMap
可以复用
使用resultMap,首先需要定义一个resultMap标签对象,resultMap标签对象中,体现列和实体类属性之间的映射关系
返回值类型
1)自定义对象,Emp,Dept
2)简单类型
int, String
查count, 根据员工编号查员工姓名
String类型
3)Map
查询结果集,列不固定
返回对象使用map
3)模糊查询
需求: 根据姓名模糊查询员工信息
配置sql语句
1. 整个作为一个参数传递 ,推荐使用这种方式
like ‘%’ || #{value} || ‘%’
2.拼接
like ‘%${value}%’
${value}: 拼接的方式,直接替换
4)使用别名简化配置
mybatis有部分内置别名映射
如果实体类,需要配置别名的类过多,可以直接配置包地址
5)特殊字符
查询薪资小于2500
在xml中,< 不能直接使用, 会作为特殊字符
1.转义
2.使用CDATA标签
<![CDATA[………]]>
在xml中,使用CDATA标签包括的内容,作为普通文本处理
9.mybatis -dao经典模式
新建工程teacher_mybatis02
1.包结构完善
2.需求:查询所有部门
实体类:Dept.java
Dao接口:DeptDao.java
Dao接口实现类:DeptDaoImpl.java
SqlSessionFactory对象的创建,在每个dao中写么???
只定义factory,和提供对外的赋值方法
mapper配置文件:dept.xml
在sqlMapConfig.xml中注册
调用:
练习:
使用dao模式,完成部门的增删改查,再加,根据编号查询部门信息
需求: 查询所有员工信息
10.mybatis主配置文件配置信息
sqlMapConfig.xml中的标签信息
10.1 properties
properties配置文件,其实就是key,value
properties标签,作用就是引入外部的properties配置文件,在项目中做法非常常见
对于数据源配置,一般使用db.properties
在sqlMapConfig.xml中引用
10.2 Settings
可以更改mybatis的运行方式,mybatis中的运行配置项
懒加载(延迟加载)配置项:
10.3 typeAliases
别名配置
10.4 typeHandlers
类型转换,数据库数据转换成实体类中的数据类型。
jdbcType类型,mybatis包中是有定义
10.5 objectFactory
类似对象工厂,但是这个工厂生产的实例,指的是实体类的实例对象,查询结果集转换成实体对象的时候,需要先创建这个对象实例,objectFactory就是做创建实体类对象实例的工作,以及赋值
10.6 plugins
改变mybatis的运行,可以中途拦截,比如update语句,拦截所有的update操作
10.7 environments
数据源配置,事务配置—》后期集成spring之后,全部交给spring管理
10.8 mappers
mapper配置文件注册
11.动态sql
teacher_mybatis02
需求:
查询所有的员工
根据姓名模糊查询员工信息
根据员工在职状态查询员工信息
。。。。。
。。。。。
将所有的sql语句整合
select * from emp
if name有值
where ename like ‘%...%’
if status有值
and status = ?
11.1 if标签
查询所有,或者根据姓名模糊查询:
传了参数:
没有传参数,没有生成where条件:
需求升级
多个条件查询
解决方案:
将where 关键字写在if标签之外,if标签中,使用and/or 打头
注意事项
1)当参数类型为简单类型(String,int)时,test表达式中的变量取值,只能用value
2)当参数为自定对象,参数类型为int类型,为空判断,不能只能null,因为int有默认值
正确判断方式,确保0取值在数据库中没有意义
假设是sex, 0表示美女,1表示小鲜肉
一般处理方式,页面选择所有给value为-1
<if test=”sex != null and sex != -1”>
and sex = #{sex}
</if>
3)test中,表达式有多个,使用and/or作为连接符,&&不识别
4)参数为Map
查询条件,使用Map传参比较多。比如sex问题,再 比如查询条件,入职时间在区间范围内,比如薪资在区间范围内。。。。
Map中如果没有这个key,那么返回的是null
ibatis中是各种判断标签,isEmpty isNull equl…….
where 1=1, 不使用这种方式,让mybatis自主判别,如果有条件,则加上where,如果没有不要加where
11.2 where
如果有条件满足,自动的加上where关键字
与where标签同等作用的trim标签
11.3 choose,when,otherwise
类似if, elseif..else
调用代码:
生成sql,只有ename条件:
11.4 set标签
需求:修改员工信息,只改动了一两个,那么只修改一两个
update 语句中,如果imgUrl没有值,则不修改
作用和where标签类似,
主动生成set,以及去除最后一个逗号,保证语法的准确性。
一般where标签和set标签都是搭配if标签使用
11.4 sql标签
提取重复的sql语句,用来复用
select * from (
) where rn between ? and ?
11.5 foreach标签
批量删除员工数据
假设批量删除:删除指定员工,并且部门编号为20
当参数只有一个数组(比如第一种批量删除)或者是List的时候,mybatis,会自动的把sql的参数类型转换为map,将数组或List丢到map容器,而key,就是数组为“array”,List为“list”,所以我们的collection只能为array/list
需求:纵表变横表需求
查询结果,课程根据课程表数据来:
分析:
1.查询出课程list
2.课程的list丢给mybatis生成完成的sql
1)新建课程实体类
2)新建mapper文件,course.xml
3)sqlMapConfig.xml中注册
4)dao接口,dao实现类
5)完成查询课程List功能
6)完成sql
12.mybatismapper代理模式
dao实现类,不写了,其中的代码高度相似,并且没有业务逻辑,直接调用sql语句
让mybatis来实现我们的接口
程序员只要提供接口,mapper配置文件(sql语句),然后mybatis在调用的时候,动态生成接口的实现类,调用指定的sql操作数据库数据
代理模式:
生活中的代理:
火车票代售点
核心功能售票,还是火车站管理,但是代售点可以出了售票还有其他的功能,增强了被代理者的功能。
再比如
王宝强—》被代理者
律师—》代理者
12.1查询所有部门案例
teacher_mybatis04
需求:查询所有的部门—》使用mapper代理模式
1)提供DeptMapper接口
2)提供dept.xml配置文件
3)sqlMapConfig.xml中,注册dept.xml文件
问题来了:这么多接口,这么多配置文件,怎么对应??--》通过namespce映射
接口中有N多方法,配置文件也有N多的sql语句,那么怎么映射??
---》接口中的方法名== sql语句的id
ID不能重复,所以mapper中方法名也不要重复
接口和mapper配置文件中需要匹配的
调用:
通过SqlSession对象,生成接口类的代理实现类实例
练习:
根据部门编号查询,增删改查,----》使用mapper代理模式
12.2执行流程
13.关联映射
需求:查询员工信息,并查询出所属部门的信息
对应的实体类设计
员工信息—》Emp对象,
部门信息—》Dept对象。
关联映射中,实体类关联部分如何设计
sql
select empno,ename…., deptno,dname,loc from emp,dept where …
之前,在Emp对象中,有一个deptNo属性,一种方式,在Emp对象中继续添加属性deptName,deptLoc 目前完全可以满足我们的需求。
假如,违章信息 和车辆
每一个违章都会有对应的一个车辆对象---》车辆对象中属性非常的多,这个时候,就不适合在违章对象中添加车辆的所有属性。。直接在违章中添加一个车辆对象
当被引用的自定义对象(Dept),属性不会更改,并且,使用的属性非常的少(Emp中只需要部门名称),这个时候可以使用直接添加属性的方式。但是这种方式扩展性不好,比如Dept添加了属性,Emp中也需要,需要修改Emp,Dept两个对象
一般在Emp中直接定义Dept对象,而不是Dept的单个属性
那怎么让查询的结果集转换成 我们的Emp对象,同时Emp对象中的dept属性已赋值
二阶段手动赋值:
在mybatis中,使用关联映射,让mybatis去做我们二阶段做的事情
13.1返回对象中包含自定义对象
需求:查询员工信息,并查询出所属部门的信息
1)Emp实体类中添加Dept对象
2) 编写resultMap
3) 编写查询语句,返回值使用resultMap
4)简化编码
13.2返回对象中含有List集合
反过来,部门可以有多个员工:
mybatis提供在查询dept的时候,将它的所有员工可以一并查出,返回的对象仍然是Dept
1)实体类设计:
2)定义resultMap
3)编写sql语句
13.3懒加载
要使用懒加载,那么关键在resultMap配置,和sql语句中,不能在一个sql同时把数据全部查询出来
那么sql,就要分成两部分
resultMap中使用嵌套查询
sqlMapConfig.xml中开启懒加载
调用
建议:
懒加载如果用在列表,并且在迭代器中快速的拿懒加载对象,那么会频繁触发懒加载,不建议使用
但是如果懒加载的对象并不是一对一的,比如Emp和Dept之间的关系,Dept数据很少,mybatis是不会每循环一个Emp就查询一次数据库的,相同的是从内存中获取的。
14.调用存储过程
调用无参存储过程
1)新建一个存储过程p_mybatis_test
2)编写sql
{call 之间不要分开
3)定义接口
4)调用
相关推荐
- 史上最全的浏览器兼容性问题和解决方案
-
微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...
-
- 平面设计基础知识_平面设计基础知识实验收获与总结
-
CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...
-
2025-02-21 16:01 yuyutoo
- 写作排版简单三步就行-工具篇_作文排版模板
-
和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...
- 写一个2048的游戏_2048小游戏功能实现
-
1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...
- 今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……
-
最近的天气暖和得让很多小伙伴们喊“热”!!! 昨天的气温到底升得有多高呢?你家有没有榜上有名?...
- CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式
-
之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...
- 你的自我界限够强大吗?_你的自我界限够强大吗英文
-
我的结果:A、该设立新的界限...
- 行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?
-
行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...
-
- 让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
-
去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...
-
2025-02-21 16:00 yuyutoo
- 今年国家综合性消防救援队伍计划招录消防员15000名
-
记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...
- 一起盘点最新 Chrome v133 的5大主流特性 ?
-
1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...
- 竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使
-
style="text-align:center;"data-mce-style="text-align:...
- 学物理能做什么?_学物理能做什么 卢昌海
-
作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...
-
- 你不知道的关于这只眯眼兔的6个小秘密
-
在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...
-
2025-02-21 16:00 yuyutoo
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)