Mybatis-xml和动态sql


在这里插入图片描述

xml映射方式

在这里插入图片描述

除了之前那种

@select(语句)
public void ...();

通过注解定义sql语句,还可以通过xml的方式来定义sql语句
在这里插入图片描述
注意
在resource创建的是目录,要用斜线分隔
在这里插入图片描述
创建出文件后
先写约束

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

在这里插入图片描述

添加mapper标签,里面加上namespace属性,对应接口全类名的字符串
这样就能获取接口全类名
在这里插入图片描述
然后就在mapper里面定义语句
id对应接口里面的方法名
查询语句多一个resultType用来表示单条记录所封装的类型

List<Emp>单条记录封装的类型,就是Emp员工对象,不过要全类名

还是复制一下
在这里插入图片描述
然后就ok了
在这里插入图片描述

底层

mybatis底层
当调用EmpMapper这个接口中list方法时Mybatis框架会自动去查找namespace属性和该接口全类名相同的xml映射文件
且在该xml文件找到id属性值与list(方法名)相同的sql语句
最终运行对应sql语句

使用场景

简单的sql语句可以直接用注解来
复杂的sql语句用xml映射文件比较好

在这里插入图片描述

MybatisX

可以下载该插件来更明显的看接口和xml之间的关系
包含方法对应sql语句
在这里插入图片描述
下完后,你点击方法或sql会跳到对应的的小鸟会跳到它对应方法/sql语句

蓝鸟对应接口和xml里面的sql
红鸟对应xml文件和接口里面的方法

在这里插入图片描述

动态sql语句

在这里插入图片描述

看我们之前写的语句
都是写死了三个条件
如果没输出是不是就是null,三个null是不是就查询不到数据
但一般我们如果上面都不加的默认应该显示所有数据,所以我们需要动态sql
就是需要实现:指定哪个用那个查询,指定name就用name查询,不要带上gender和后面的
mybatis提供了一个动态sql标签
if,用来做条件判断来实现动态sql
改造前
在这里插入图片描述
改造后
在这里插入图片描述

if标签

在这里插入图片描述

在这里插入图片描述

进行代码的修改后
在这里插入图片描述
但其实这个代码是有bug的
当name=null,而gender=1,其他都null
这样的话
对应执行的sql语句是
在这里插入图片描述

select * from emp where and gender=1; 

无缘无故多了个and,肯定会报错
而且当你所有都传null时
执行

select * from emp where;

也不合理
怎么解决呢?
用where标签
把这个where变成

<where>
<if test="name!=null">
name like contact('%',#{name},'%')
</if>
...
</where>

这样

where标签的作用

1.当你里面的条件一个都不成立的时候,就不会生成where关键字(动态生成where)
2.会自动清除条件前面多余的and或者是or
在这里插入图片描述

set标签

set标签会取出掉字段之后多余的逗号
在这里插入图片描述

原先更新案例
在这里插入图片描述
固定死一定要全部更改
在这里插入图片描述
如果我这样写代码
本意是不想更新入职时间那些的
在这里插入图片描述

但实际上会把那些变为null
所以需要更改
在这里插入图片描述
用if标签来做呗
先删除注解
然后我们这个EmpMapper这个会报错
因为xml文件没有对应的标签
直接按alt+enter生成对应标签(点第一个)
在这里插入图片描述
对应的生成
在这里插入图片描述

自己往里面填入我们想要的逻辑
在这里插入图片描述
当然这样也不是完全对的
当你只更新username的时候
在这里插入图片描述
执行的语句就是
显然不对(其实只要没更新updatetime就不对,就它后面没逗号)

update emp set username=? , where id =?

所以提供了一个标签
把set关键字替换成

<set>
<if test="usrename!=null">username=#{username},</if>
...
</set>

set标签作用

set标签会取出掉字段之后多余的逗号

foreach标签

一般用于批量操作当中
在这里插入图片描述

批量删除操作
在这里插入图片描述
对应的我们的方法要传一个集合
在这里插入图片描述
我们肯定是要遍历集合里面的元素而不是集合本身
foreach就能来遍历集合里面的元素
注意open和close
(#{id},#{id}…)差不多能理解吧
注意每个属性的用处
在这里插入图片描述

sql&include

在这里插入图片描述

这样写代码复用性差
后期如果要修改要一个一个改
java里增强代码复用性:提取成方法呗
但这个是xml
我们需要用sql标签和include
在这里插入图片描述
sql和include搭配使用
sql负责定义语句
include负责语句的位置
在这里插入图片描述
这个sql标签要定义对应的id
在xml文件里直接写就行
在这里插入图片描述
然后原来select id… from emp
可以全部改写

<include refid="对应的id"/>

sql片段的抽取和引用就完成了
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值