百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

mybatis手把手教学,希望大家能拿下它

wptr33 2025-01-10 17:38 14 浏览

目录

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)调用

相关推荐

【推荐】一款开源免费、美观实用的后台管理系统模版

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍...

Android架构组件-App架构指南,你还不收藏嘛

本指南适用于那些已经拥有开发Android应用基础知识的开发人员,现在想了解能够开发出更加健壮、优质的应用程序架构。首先需要说明的是:AndroidArchitectureComponents翻...

高德地图经纬度坐标批量拾取(高德地图批量查询经纬度)

使用方法在桌面上新建一个index.txt文件,把下面的代码复制进去保存,再把文件名改成index.html保存,双击运行打开即可...

flutter系列之:UI layout简介(flutter ui设计)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。...

Android开发基础入门(一):UI与基础控件

Android基础入门前言:...

iOS的布局体系-流式布局MyFlowLayout

iOS布局体系的概览在我的CSDN博客中的几篇文章分别介绍MyLayout布局体系中的视图从一个方向依次排列的线性布局(MyLinearLayout)、视图层叠且停靠于父布局视图某个位置的框架布局(M...

TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序

TDesing发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。...

WinForm实现窗体自适应缩放(winform窗口缩放)

众所周知,...

winform项目——仿QQ即时通讯程序03:搭建登录界面

上两篇文章已经对CIM仿QQ即时通讯项目进行了需求分析和数据库设计。winform项目——仿QQ即时通讯程序01:原理及项目分析...

App自动化测试|原生app元素定位方法

元素定位方法介绍及应用Appium方法定位原生app元素...

61.C# TableLayoutPanel控件(c# tabcontrol)

摘要TableLayoutPanel在网格中排列内容,提供类似于HTML元素的功能。TableLayoutPanel控件允许你将控件放在网格布局中,而无需精确指定每个控件的位置。其单元格...

想要深入学习Android性能优化?看完这篇直接让你一步到位

...

12个python数据处理常用内置函数(python 的内置函数)

在python数据分析中,经常需要对字符串进行各种处理,例如拼接字符串、检索字符串等。下面我将对python中常用的内置字符串操作函数进行介绍。1.计算字符串的长度-len()函数str1='我爱py...

如何用Python程序将几十个PDF文件合并成一个PDF?其实只要这四步

假定你有一个很无聊的任务,需要将几十个PDF文件合并成一个PDF文件。每一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封面。即使有许多免费的程序可以合并PDF,很多也只是简单的将...

Python入门知识点总结,Python三大数据类型、数据结构、控制流

Python基础的重要性不言而喻,是每一个入门Python学习者所必备的知识点,作为Python入门,这部分知识点显得很庞杂,内容分支很多,大部分同学在刚刚学习时一头雾水。...