mybatis手把手教学,希望大家能拿下它
yuyutoo 2025-01-23 22:10 2 浏览 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)调用
相关推荐
- Mysql和Oracle实现序列自增(oracle创建序列的sql)
-
Mysql和Oracle实现序列自增/*ORACLE设置自增序列oracle本身不支持如mysql的AUTO_INCREMENT自增方式,我们可以用序列加触发器的形式实现,假如有一个表T_WORKM...
- 关于Oracle数据库12c 新特性总结(oracle数据库19c与12c)
-
概述今天主要简单介绍一下Oracle12c的一些新特性,仅供参考。参考:http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NEWFT...
- MySQL CREATE TABLE 简单设计模板交流
-
推荐用MySQL8.0(2018/4/19发布,开发者说同比5.7快2倍)或同类型以上版本....
- mysql学习9:创建数据库(mysql5.5创建数据库)
-
前言:我也是在学习过程中,不对的地方请谅解showdatabases;#查看数据库表createdatabasename...
- MySQL面试题-CREATE TABLE AS 与CREATE TABLE LIKE的区别
-
执行"CREATETABLE新表ASSELECT*FROM原表;"后,新表与原表的字段一致,但主键、索引不会复制到新表,会把原表的表记录复制到新表。...
- Nike Dunk High Volt 和 Bright Spruce 预计将于 12 月推出
-
在街上看到的PandaDunk的超载可能让一些球鞋迷们望而却步,但Dunk的浪潮仍然强劲,看不到尽头。我们看到的很多版本都是为女性和儿童制作的,这种新配色为后者引入了一种令人耳目一新的新选择,而...
- 美国多功能舰载雷达及美国海军舰载多功能雷达系统技术介绍
-
多功能雷达AN/SPY-1的特性和技术能力,该雷达已经在美国海军服役了30多年,其修改-AN/SPY-1A、AN/SPY-1B(V)、AN/SPY-1D、AN/SPY-1D(V),以及雷神...
- 汽车音响怎么玩,安装技术知识(汽车音响怎么玩,安装技术知识视频)
-
全面分析汽车音响使用或安装技术常识一:主机是大多数人最熟习的音响器材,有关主机的各种性能及规格,也是耳熟能详的事,以下是一些在使用或安装时,比较需要注意的事项:LOUDNESS:几年前的主机,此按...
- 【推荐】ProAc Response系列扬声器逐个看
-
有考牌(公认好声音)扬声器之称ProAcTablette小音箱,相信不少音响发烧友都曾经,或者现在依然持有,正当大家逐渐掌握Tablette的摆位设定与器材配搭之后,下一步就会考虑升级至表现更全...
- #本站首晒# 漂洋过海来看你 — BLACK&DECKER 百得 BDH2000L无绳吸尘器 开箱
-
作者:初吻给了烟sco混迹张大妈时日不短了,手没少剁。家里有了汪星人,吸尘器使用频率相当高,偶尔零星打扫用卧式的实在麻烦(汪星人:你这分明是找借口,我掉毛是满屋子都有,铲屎君都是用卧式满屋子吸的,你...
- 专题|一个品牌一件产品(英国篇)之Quested(罗杰之声)
-
Quested(罗杰之声)代表产品:Q212FS品牌介绍Quested(罗杰之声)是录音监听领域的传奇品牌,由英国录音师RogerQuested于1985年创立。在成立Quested之前,Roger...
- 常用半导体中英对照表(建议收藏)(半导体英文术语)
-
作为一个源自国外的技术,半导体产业涉及许多英文术语。加之从业者很多都有海外经历或习惯于用英文表达相关技术和工艺节点,这就导致许多英文术语翻译成中文后,仍有不少人照应不上或不知如何翻译。为此,我们整理了...
- Fyne Audio F502SP 2.5音路低音反射式落地音箱评测
-
FyneAudio的F500系列,有新成员了!不过,新成员不是新的款式,却是根据原有款式提出特别版。特别版产品在原有型号后标注了SP字样,意思是SpecialProduction。Fyne一共推出...
- 有哪些免费的内存数据库(In-Memory Database)
-
以下是一些常见的免费的内存数据库:1.Redis:Redis是一个开源的内存数据库,它支持多种数据结构,如字符串、哈希表、列表、集合和有序集合。Redis提供了快速的读写操作,并且支持持久化数据到磁...
- RazorSQL Mac版(SQL数据库查询工具)
-
RazorSQLMac特别版是一款看似简单实则功能非常出色的SQL数据库查询、编辑、浏览和管理工具。RazorSQLformac特别版可以帮你管理多个数据库,支持主流的30多种数据库,包括Ca...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
-
- Mysql和Oracle实现序列自增(oracle创建序列的sql)
- 关于Oracle数据库12c 新特性总结(oracle数据库19c与12c)
- MySQL CREATE TABLE 简单设计模板交流
- mysql学习9:创建数据库(mysql5.5创建数据库)
- MySQL面试题-CREATE TABLE AS 与CREATE TABLE LIKE的区别
- Nike Dunk High Volt 和 Bright Spruce 预计将于 12 月推出
- 美国多功能舰载雷达及美国海军舰载多功能雷达系统技术介绍
- 汽车音响怎么玩,安装技术知识(汽车音响怎么玩,安装技术知识视频)
- 【推荐】ProAc Response系列扬声器逐个看
- #本站首晒# 漂洋过海来看你 — BLACK&DECKER 百得 BDH2000L无绳吸尘器 开箱
- 标签列表
-
- 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)