快捷搜索:  汽车  科技

mybatis 教程:希望大家能拿下它

mybatis 教程:希望大家能拿下它4.入门案例 93) 创建SqlsessionFactory对象 91)导包 52)配置文件 6配置dtd约束 7

目录

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封装中的问题

mybatis 教程:希望大家能拿下它(1)

使用持久层框架,可以解决这些问题

持久层框架其实就是dao层框架,将数据持久化到磁盘上

2.mybatis介绍

持久层框架,mybatis ibatis hibernate…

ssh: struts2 spring hibernate

ssm: springmvc spring mybatis-》目前的主流框架

ibtais是mybatis的前身,阿帕奇的开源项目

mybatis 教程:希望大家能拿下它(2)

3.框架搭建

新建java project工程

1)导包

1.核心包

mybatis 教程:希望大家能拿下它(3)

2.依赖的包

mybatis 教程:希望大家能拿下它(4)

3.数据库的驱动包

mybatis 教程:希望大家能拿下它(5)

4.junit测试包

mybatis 教程:希望大家能拿下它(6)

2)配置文件

所有的配置文件,都放置在src根目录下

1.log4j的配置文件

2.mybatis的主配置文件(配置数据的响应信息)

src下新建一个xml 文件命名为: sqlMapConfig.xml 文件名不是固定的,可以随意命名,但是,一般使用sqlmapConfig.xml

配置文件如何编写,参照帮助文档

mybatis 教程:希望大家能拿下它(7)

mybatis 教程:希望大家能拿下它(8)

配置dtd约束

A) 复制key

mybatis 教程:希望大家能拿下它(9)

B)配置 windowpreferences

mybatis 教程:希望大家能拿下它(10)

C)检查配置

配置完成之后,重新打开xml,联想会有标签提示

sqlMapConfig.xml

mybatis 教程:希望大家能拿下它(11)

3) 创建SqlSessionFactory对象

mybatis 教程:希望大家能拿下它(12)

但是不能通过这种方式验证,框架是否搭建成功,通过入门案例验证

4.入门案例

需求:查询所有的部门

1.部门实体类2.sql语句

select * from dept;

不会所有的sql语句写在同一个配置文件中

一般来说,一个实体类对应一个配置文件(一个功能对应一个配置文件)

所以,需要新建dept.xml

一般sql语句的配置文件,放在dao目录下

mybatis 教程:希望大家能拿下它(13)

dept.xml中如何编写,参照帮助文档

mybatis 教程:希望大家能拿下它(14)

3.配置mappe的dtd约束

mybatis 教程:希望大家能拿下它(15)

4.sql语句的配置文件

mybatis 教程:希望大家能拿下它(16)

5.在sqlMapConfig.xml中,注册dept.xml

mybatis 教程:希望大家能拿下它(17)

6.调用

mybatis 教程:希望大家能拿下它(18)

5.执行流程

mybatis 教程:希望大家能拿下它(19)

1)创建一个工厂构建器的实例

2)工厂构建器,解析sqlMapConfig.xml 通过配置文件中的数据库相关配置,创建出工厂实例

解析sqlMapConfig.xml的时候,解析<mappers>标签,拿到配置的sql语句的xml文件,并且解析这些xml文件

mybatis 教程:希望大家能拿下它(20)

解析dept.xml 创建了一个容器,所有的xml中的sql标签对象,全部都放到容器中

mybatis 教程:希望大家能拿下它(21)

mybatis 教程:希望大家能拿下它(22)

3)通过工厂拿到一个SqlSession对象,此时,并没有真正的创建数据库连接

4)通过SqlSession对象操作数据库

mybatis通过参数(sql标签的key)到容器中拿这个sql标签对象。拿到之后,创建数据库连接,到数据库查询—》会有一个查询结果集

mybatis 教程:希望大家能拿下它(23)

mybatis自动的通过配置转换查询结果集为调用者需要的对象,然后返回。

6.案例1)查询所有部门

--》见 4.入门案例

2)查询指定部门信息

Dept.java

dept.xml

dept.xml在sqlMapConfig.xml中注册

mybatis 教程:希望大家能拿下它(24)

3)新增部门

Dept.java

dept.xml

dept.xml在sqlMapConfig.xml中注册

sql语句

mybatis 教程:希望大家能拿下它(25)

调用

mybatis 教程:希望大家能拿下它(26)

4)修改部门

mybatis 教程:希望大家能拿下它(27)

mybatis 教程:希望大家能拿下它(28)

5)删除部门

Dept.java

dept.xml

dept.xml在sqlMapConfig.xml中注册

sql语句配置

mybatis 教程:希望大家能拿下它(29)

调用

mybatis 教程:希望大家能拿下它(30)

7.常见异常

1.session调用的时候,sql对象的key给错误的。

mybatis 教程:希望大家能拿下它(31)

解决方向: 检查session调用的时候,给的sql对象的key值(namespace 标签ID)

2.sql标签对象中,resultType给错误的

mybatis 教程:希望大家能拿下它(32)

3.sql语句写错误的

mybatis 教程:希望大家能拿下它(33)

4.实体类添加有参构造(不添加无参构造)

mybatis 教程:希望大家能拿下它(34)

5.sql语句中取参的时候,属性名写错

mybatis 教程:希望大家能拿下它(35)

mybatis 教程:希望大家能拿下它(36)

8.mapper配置文件简单使用1)输入参数

parameterMap parameterType

一般使用parameterType属性,而parameterMap已基本废弃,要使用parameterMap,需要在顶一个parameterMap对象

mybatis 教程:希望大家能拿下它(37)

一般使用parameterType 根据传入参数的类型,可以大致分为以下几类

parameterType=类的全地址

1.简单类型

#{key}

key可以随意写

mybatis 教程:希望大家能拿下它(38)

2.自定义对象

#{key} key:组成get方法的名称(一般来说就是实体类中的属性名)

mybatis 教程:希望大家能拿下它(39)

3.自定义对象包装类

自定义对象中含有自定义对象

比如:User对象中含有Role对象

#{key.属性名} key就是User对象中的role属性,属性名指的是Role对象中的属性

需求:根据部门查询员工信息

1)员工的实体类

2)emp.xml

3)sqlMapConfig.xml注册配置文件

mybatis 教程:希望大家能拿下它(40)

4.Map

parameterType=”java.util.Map”

#{key} key:map容器中的key

mybatis 教程:希望大家能拿下它(41)

2)返回值resultType

mybatis 教程:希望大家能拿下它(42)

比较方便,但是每次使用resultType都需要使用别名

resultMap

可以复用

使用resultMap,首先需要定义一个resultMap标签对象,resultMap标签对象中,体现列和实体类属性之间的映射关系

mybatis 教程:希望大家能拿下它(43)

返回值类型

1)自定义对象,Emp Dept

2)简单类型

int String

查count 根据员工编号查员工姓名

mybatis 教程:希望大家能拿下它(44)

mybatis 教程:希望大家能拿下它(45)

String类型

mybatis 教程:希望大家能拿下它(46)

mybatis 教程:希望大家能拿下它(47)

3)Map

查询结果集,列不固定

返回对象使用map

mybatis 教程:希望大家能拿下它(48)

mybatis 教程:希望大家能拿下它(49)

3)模糊查询

需求: 根据姓名模糊查询员工信息

配置sql语句

mybatis 教程:希望大家能拿下它(50)

1. 整个作为一个参数传递 ,推荐使用这种方式

mybatis 教程:希望大家能拿下它(51)

like ‘%’ || #{value} || ‘%’

2.拼接

like ‘%${value}%’

${value}: 拼接的方式,直接替换

mybatis 教程:希望大家能拿下它(52)

4)使用别名简化配置

mybatis 教程:希望大家能拿下它(53)

mybatis有部分内置别名映射

mybatis 教程:希望大家能拿下它(54)

如果实体类,需要配置别名的类过多,可以直接配置包地址

mybatis 教程:希望大家能拿下它(55)

5)特殊字符

查询薪资小于2500

mybatis 教程:希望大家能拿下它(56)

在xml中,< 不能直接使用, 会作为特殊字符

1.转义

mybatis 教程:希望大家能拿下它(57)

2.使用CDATA标签

<![CDATA[………]]>

在xml中,使用CDATA标签包括的内容,作为普通文本处理

mybatis 教程:希望大家能拿下它(58)

9.mybatis -dao经典模式

新建工程teacher_mybatis02

1.包结构完善

mybatis 教程:希望大家能拿下它(59)

2.需求:查询所有部门

实体类:Dept.java

Dao接口:DeptDao.java

Dao接口实现类:DeptDaoImpl.java

SqlSessionFactory对象的创建,在每个dao中写么???

mybatis 教程:希望大家能拿下它(60)

只定义factory,和提供对外的赋值方法

mapper配置文件:dept.xml

在sqlMapConfig.xml中注册

调用:

mybatis 教程:希望大家能拿下它(61)

练习:

使用dao模式,完成部门的增删改查,再加,根据编号查询部门信息

需求: 查询所有员工信息

10.mybatis主配置文件配置信息

sqlMapConfig.xml中的标签信息

10.1 properties

properties配置文件,其实就是key value

properties标签,作用就是引入外部的properties配置文件 在项目中做法非常常见

对于数据源配置,一般使用db.properties

mybatis 教程:希望大家能拿下它(62)

mybatis 教程:希望大家能拿下它(63)

在sqlMapConfig.xml中引用

mybatis 教程:希望大家能拿下它(64)

10.2 Settings

可以更改mybatis的运行方式,mybatis中的运行配置项

懒加载(延迟加载)配置项:

mybatis 教程:希望大家能拿下它(65)

10.3 typeAliases

别名配置

10.4 typeHandlers

类型转换,数据库数据转换成实体类中的数据类型。

mybatis 教程:希望大家能拿下它(66)

jdbcType类型,mybatis包中是有定义

mybatis 教程:希望大家能拿下它(67)

mybatis 教程:希望大家能拿下它(68)

10.5 objectFactory

类似对象工厂,但是这个工厂生产的实例,指的是实体类的实例对象,查询结果集转换成实体对象的时候,需要先创建这个对象实例,objectFactory就是做创建实体类对象实例的工作,以及赋值

10.6 plugins

改变mybatis的运行,可以中途拦截,比如update语句,拦截所有的update操作

10.7 environments

数据源配置,事务配置—》后期集成spring之后,全部交给spring管理

10.8 mappers

mapper配置文件注册

mybatis 教程:希望大家能拿下它(69)

11.动态sql

teacher_mybatis02

需求:

查询所有的员工

根据姓名模糊查询员工信息

根据员工在职状态查询员工信息

。。。。。

。。。。。

将所有的sql语句整合

select * from emp

if name有值

where ename like ‘%...%’

if status有值

and status = ?

11.1 if标签

查询所有,或者根据姓名模糊查询:

mybatis 教程:希望大家能拿下它(70)

传了参数:

mybatis 教程:希望大家能拿下它(71)

没有传参数,没有生成where条件:

mybatis 教程:希望大家能拿下它(72)

需求升级

多个条件查询

mybatis 教程:希望大家能拿下它(73)

解决方案:

mybatis 教程:希望大家能拿下它(74)

将where 关键字写在if标签之外,if标签中,使用and/or 打头

注意事项

1)当参数类型为简单类型(String int)时,test表达式中的变量取值,只能用value

mybatis 教程:希望大家能拿下它(75)

2)当参数为自定对象,参数类型为int类型,为空判断,不能只能null 因为int有默认值

mybatis 教程:希望大家能拿下它(76)

正确判断方式,确保0取值在数据库中没有意义

mybatis 教程:希望大家能拿下它(77)

假设是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

mybatis 教程:希望大家能拿下它(78)

11.2 where

mybatis 教程:希望大家能拿下它(79)

如果有条件满足,自动的加上where关键字

mybatis 教程:希望大家能拿下它(80)

与where标签同等作用的trim标签

mybatis 教程:希望大家能拿下它(81)

11.3 choose when otherwise

类似if elseif..else

mybatis 教程:希望大家能拿下它(82)

调用代码:

mybatis 教程:希望大家能拿下它(83)

生成sql,只有ename条件:

mybatis 教程:希望大家能拿下它(84)

11.4 set标签

需求:修改员工信息,只改动了一两个,那么只修改一两个

update 语句中,如果imgUrl没有值,则不修改

mybatis 教程:希望大家能拿下它(85)

作用和where标签类似,

mybatis 教程:希望大家能拿下它(86)

主动生成set,以及去除最后一个逗号,保证语法的准确性。

一般where标签和set标签都是搭配if标签使用

11.4 sql标签

提取重复的sql语句,用来复用

select * from (

) where rn between ? and ?

mybatis 教程:希望大家能拿下它(87)

mybatis 教程:希望大家能拿下它(88)

11.5 foreach标签

批量删除员工数据

mybatis 教程:希望大家能拿下它(89)

mybatis 教程:希望大家能拿下它(90)

mybatis 教程:希望大家能拿下它(91)

假设批量删除:删除指定员工,并且部门编号为20

mybatis 教程:希望大家能拿下它(92)

当参数只有一个数组(比如第一种批量删除)或者是List的时候,mybatis,会自动的把sql的参数类型转换为map,将数组或List丢到map容器,而key,就是数组为“array” List为“list” 所以我们的collection只能为array/list

需求:纵表变横表需求

mybatis 教程:希望大家能拿下它(93)

查询结果,课程根据课程表数据来:

mybatis 教程:希望大家能拿下它(94)

分析:

mybatis 教程:希望大家能拿下它(95)

1.查询出课程list

2.课程的list丢给mybatis生成完成的sql

1)新建课程实体类

2)新建mapper文件,course.xml

3)sqlMapConfig.xml中注册

4)dao接口,dao实现类

5)完成查询课程List功能

6)完成sql

mybatis 教程:希望大家能拿下它(96)

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映射

mybatis 教程:希望大家能拿下它(97)

接口中有N多方法,配置文件也有N多的sql语句,那么怎么映射??

---》接口中的方法名== sql语句的id

ID不能重复,所以mapper中方法名也不要重复

接口和mapper配置文件中需要匹配的

mybatis 教程:希望大家能拿下它(98)

调用:

通过SqlSession对象,生成接口类的代理实现类实例

mybatis 教程:希望大家能拿下它(99)

练习:

根据部门编号查询,增删改查,----》使用mapper代理模式

12.2执行流程

mybatis 教程:希望大家能拿下它(100)

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 教程:希望大家能拿下它(101)

在mybatis中,使用关联映射,让mybatis去做我们二阶段做的事情

13.1返回对象中包含自定义对象

需求:查询员工信息,并查询出所属部门的信息

1)Emp实体类中添加Dept对象

mybatis 教程:希望大家能拿下它(102)

2) 编写resultMap

mybatis 教程:希望大家能拿下它(103)

3) 编写查询语句,返回值使用resultMap

mybatis 教程:希望大家能拿下它(104)

4)简化编码

mybatis 教程:希望大家能拿下它(105)

13.2返回对象中含有List集合

反过来,部门可以有多个员工:

mybatis 教程:希望大家能拿下它(106)

mybatis提供在查询dept的时候,将它的所有员工可以一并查出,返回的对象仍然是Dept

1)实体类设计:

mybatis 教程:希望大家能拿下它(107)

mybatis 教程:希望大家能拿下它(108)

2)定义resultMap

mybatis 教程:希望大家能拿下它(109)

3)编写sql语句

mybatis 教程:希望大家能拿下它(110)

13.3懒加载

mybatis 教程:希望大家能拿下它(111)

要使用懒加载,那么关键在resultMap配置,和sql语句中,不能在一个sql同时把数据全部查询出来

mybatis 教程:希望大家能拿下它(112)

那么sql,就要分成两部分

mybatis 教程:希望大家能拿下它(113)

resultMap中使用嵌套查询

mybatis 教程:希望大家能拿下它(114)

sqlMapConfig.xml中开启懒加载

mybatis 教程:希望大家能拿下它(115)

调用

mybatis 教程:希望大家能拿下它(116)

mybatis 教程:希望大家能拿下它(117)

建议:

懒加载如果用在列表,并且在迭代器中快速的拿懒加载对象,那么会频繁触发懒加载,不建议使用

但是如果懒加载的对象并不是一对一的,比如Emp和Dept之间的关系,Dept数据很少,mybatis是不会每循环一个Emp就查询一次数据库的,相同的是从内存中获取的。

14.调用存储过程调用无参存储过程

1)新建一个存储过程p_mybatis_test

mybatis 教程:希望大家能拿下它(118)

2)编写sql

mybatis 教程:希望大家能拿下它(119)

{call 之间不要分开

mybatis 教程:希望大家能拿下它(120)

3)定义接口

mybatis 教程:希望大家能拿下它(121)

4)调用

mybatis 教程:希望大家能拿下它(122)

猜您喜欢: