Mybatis中xml方式实现mapper总结

SpringMVC-01:整合Spring+SpringMVC+MyBatis ,采用Mapper.xml映射方式,实现增删查改翻页功能 项目概要: SpringMVC-01项目:整合Spring+SpringMVC+MyBatis ,实现增删查改翻页功能,采用Mapper.xml映射方式操作数据库的sql; 源码下载:SpringMVC-01 开发环境 Windows:windows 10 JDK: 1.8 IDE:Eclipse Oxygen.2 Tomcat :tomcat 8.50 Database:mysql ... 阅读详情

Mybatis中实现mapper对sql的操作有两种方式,一种是注解形式,另一种是.xml文件形式。对于sql的一些简单操作而言,使用注解方式非常的简便,但是遇到一些复杂的sql操作时,就需要用到.xml文件形式了。


mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:

  • if 语句 (简单的条件判断)
  • choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
  • trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
  • where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
  • set (主要用于更新时)
  • foreach (在实现 mybatis in 语句查询时特别有用)

下面分别介绍这几种处理方式


if

<select id="dynamicIfTest" parameterType="Blog" resultType="Blog">
select * from t_blog where 1 = 1
<if test="title != null">
and title = #{title}
</if>
<if test="content != null">
and content = #{content}
</if>
<if test="owner != null">
and owner = #{owner}
</if>
</select>

如果你提供了title参数,那么就要满足title=#{title},同样如果你提供了Content和Owner的时候,它们也需要满足相应的条件,之后就是返回满足这些条件的所有Blog,这是非常有用的一个功能。
以往我们使用其他类型框架或者直接使用JDBC的时候, 如果我们要达到同样的选择效果的时候,我们就需要拼SQL语句,这是极其麻烦的,比起来,上述的动态SQL就要简单多了。

choose (when,otherwize)

相当于java 语言中的 switch

<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">
 select * from t_blog where 1 = 1 
 <choose>
 <when test="title != null">
 and title = #{title}
 </when>
 <when test="content != null">
 and content = #{content}
 </when>
 <otherwise>
 and owner = "owner1"
 </otherwise>
 </choose>
</select>

when元素表示当when中的条件满足的时候就输出其中的内容,跟JAVA中的switch效果差不多的是按照条件的顺序,当when中有条件满足的时候,就会跳出choose,即所有的when和otherwise条件中,只有一个会输出,当所有的我很条件都不满足的时候就输出otherwise中的内容。所以上述语句的意思非常简单,当title!=null的时候就输出and titlte = #{title},不再往下判断条件,当title为空且content!=null的时候就输出and content = #{content},当所有条件都不满足的时候就输出otherwise中的内容。

trim

对包含的内容加上前缀和后缀。

<select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">
select * from t_blog 
<trim prefix="where" prefixOverrides="and |or">
<if test="title != null">
title = #{title}
</if>
<if test="content != null">
and content = #{content}
</if>
<if test="owner != null">
or owner = #{owner}
</if>
</trim>
</select>

trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides;正因为trim有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能。

trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码:

select * from user 
<trim prefix="WHERE" prefixoverride="AND |OR">
<if test="name != null and name.length()>0"> 
AND name=#{name}
</if>
<if test="gender != null and gender.length()>0"> 
AND gender=#{gender}
</if>
</trim>

where

主要是用来简化sql语句中where条件判断的,能智能的处理 and or 条件。

<select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">
select * from t_blog 
<where>
<if test="title != null">
title = #{title}
</if>
<if test="content != null">
and content = #{content}
</if>
<if test="owner != null">
and owner = #{owner}
</if>
</where>
</select>

where元素的作用是会在写入where元素的地方输出一个where,另外一个好处是你不需要考虑where元素里面的条件输出是什么样子的,MyBatis会智能的帮你处理,如果所有的条件都不满足那么MyBatis就会查出所有的记录,如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上。像上述例子中,如果title=null, 而content != null,那么输出的整个语句会是select * from t_blog where content = #{content},而不是select * from t_blog where and content = #{content},因为MyBatis会智能的把首个and 或 or 给忽略。

set

主要用于更新时。

<update id="dynamicSetTest" parameterType="Blog">
update t_blog
<set>
<if test="title != null">
title = #{title},
</if>
<if test="content != null">
content = #{content},
</if>
<if test="owner != null">
owner = #{owner}
</if>
</set>
where id = #{id}
</update>

set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。有了set元素我们就可以动态的更新那些修改了的字段。

foreach

在实现 in 语句查询时经常用到。

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。

  • item表示集合中每一个元素进行迭代时的别名。
  • index指定一个名字,用于表示在迭代过程中,每次迭代到的位置。
  • open表示该语句以什么开始。
  • separator表示在每次进行迭代之间以什么符号作为分隔符。
  • close表示以什么结束。

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

  • 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  • 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  • 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,此时传入collection的值应为将会使用到的map里的key。

单参数List的类型:

<select id="dynamicForeachTest" resultType="com.mybatis.entity.User">
select * from t_user where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>

上述collection的值为list,对应的Mapper是这样的:

/**mybatis Foreach测试 */
public List<User> dynamicForeachTest(List<Integer> ids);

测试代码:

@Test
public void dynamicForeachTest() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);
ids.add(6);
List<User> userList = mapper.dynamicForeachTest(ids);
for (User user : userList){
System.out.println(user);
}
sqlSession.close();
}

数组类型的参数:

<select id="dynamicForeach2Test" resultType="com.mybatis.entity.User">
select * from t_user where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>

对应mapper:

public List<User> dynamicForeach2Test(int[] ids);

测试代码:

@Test
public void dynamicForeach2Test() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int[] ids = {1,2,6};
List<User> userList = mapper.dynamicForeach2Test(ids);
for (User user : userList){
System.out.println(user);
}
sqlSession.close();
}

Map类型的参数:

<select id="dynamicForeach3Test" resultType="com.mybatis.entity.User">
select * from t_user where username like '%${username}%' and id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>

mapper :

/**mybatis Foreach测试 */
public List<User> dynamicForeach3Test(Map<String, Object> params);

测试方法:

@Test
public void dynamicForeach3Test() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);
ids.add(6);
Map map =new HashMap();
map.put("username", "小");
map.put("ids", ids);
List<User> userList = mapper.dynamicForeach3Test(map);
System.out.println("------------------------");
for (User user : userList){
System.out.println(user);
}
sqlSession.close();
}
MyBatis实现Mapper配置并查询数据 1:什么是Mapper* 在MyBatis工程搭建 中我们主要讲解的是 MyBatis 如何连接数据库,具体执行 SQL 语句使用的是 JDBC 方式 但在实际应用中是不会选择 JDBC 来执行 SQL 的,MyBatis 提供了 Mapper 作为 Java 方法和 SQL 语句之间的桥梁,来帮助我们更好地去使用 SQL Java 接口方法与 SQL 语句以及 mapper 之间的关系如下图所示: 我们新建Maven项目名为“mybatis-mapper“,设置好Maven版本、配置文件以及Maven仓 阅读详情

相关推荐

SpringBoot整合Mybatis-方式2:mapper使用XML配置方式

上一篇博文已经详细介绍了SpringBoot环境搭建过程,这一节介绍一下SpringBoot整合Mybatis,在mapper中数据库的查询操作使用的是注解的方式,本文将介绍使用XML的方式进行整合。 SpringBoot整合Mybatis 方式2:mapper使用XML 项目结构 1:准备数据库数据和配置数据源以及配置Mybatis的XML配置文件 #加载Mybatis...

爱睡觉的小懒虫 2万+

mybatis 批量条件查询多条数据 sql循环

mybatis有foreach循环遍历,避免数据库频繁查询数据库 例如以下代码 <select id="selectSkuList" resultType="xxxxxx.xxxxx.xxx"> SELECT *from goods WHERE product_code in <foreach collection="skuCodes" item="skuCode" index="index" open="(" close=")" s

a203206868的博客 3389

翁恺-C语言程序设计 PTA习题集

代码练习题

qq_46085472的博客 7639

mybatis的mapper.xml编写

自用

qq_44527508的博客 2665

浅谈一下小波变换和EEG信号处理

浅谈小波变换,总结不是很到位,请大家指正。

qq_45045249的博客 2862

【测试】echo发送和接收TCP/UDP数据包|shell 发送TCP/UDP数据包

目录 通过/dev/tcp、/dev/udp shell给tcp或udp服务发送16进制报文指令 通过/dev/tcp、/dev/udp (https://blog.youkuaiyun.com/u010039418/article/details/86251470) 通过/dev/tcp、/dev/udp可以直接在shell脚本中发起tcp、udp连接,方便又高效,平时用于测试啥的还是挺方便的。 直接发送 格式 /dev/udp/ip/port 比如要向本地10001端口发送数据,可以使用 ec.

我的笔记本 1万+

Mybatis中mapper是怎么和XMl关联起来的

Mybatis中mapper是怎么和XMl关联起来的 从源码来分析,通过Mybatis的都知道,必须指定nameSpace为Mapper的全限定类名。这样就能关联起来。Mapper的实现肯定是动态dialing,在InvocationHandler中做增强。这里就来分析分析具体是怎么做的? 在下面分析的时候,源码看起来比较枯燥,并且涉及到的东西很多。分析的时候设计的东西多,容易走偏。我尽量回归主题。 1. XML文件解析 这里的xml解析比较繁琐,如果逐行来分析的话,很多很多,这里就挑主线来分析了。之后会分

daliucheng的博客 5839

从0到1:提示工程架构师搭建Agentic AI系统的全流程实战手册

Agentic AI(自主智能体)是具备自主决策能力的大模型应用感知(Perceive):获取外部环境信息(比如代码仓库、用户输入、数据库数据);记忆(Memory):存储和检索历史信息(比如过去的审计记录、用户偏好);规划(Plan):将复杂任务拆解为可执行的步骤(比如“代码审计”拆成3步);行动(Act):调用工具或API完成具体操作(比如调用Git克隆仓库、调用Safety查漏洞);反馈(Feedback):根据结果调整策略(比如用户说“报告不够详细”,下次增加逻辑漏洞的分析深度)。

AI Agent Harness Engineering 1040

SpringBoot项目实战(001)mybatis通过xml实现mapper

springboot集成mybatis,简单实现一个数据增删改查的demo。 其中mybatis中的mapper层的sql语句,写在xml中。

IT老吴的博客 1290

MoveIt 运动学、运动规划、混合规划、move_group

混合规划是运动规划方法的一个术语,它将异构运动规划器结合起来,以产生更稳健或反应更快的解决方案。这种通用方法在导航领域已经非常成熟,并在导航2等流行项目中成功实施。MoveIt 的混合规划架构结合了一对全局规划器和局部规划器,它们以不同的规划速度和问题范围并行、并发运行。全局规划器的任务是解决全局运动规划问题,这与 “感知-规划-行动 ”应用中使用的规划器非常相似。所使用的规划器算法应该是完整的,因此假定其计算时间相对较慢。此外,全局规划器不要求实时安全,这意味着无法保证规划器在特定期限内找到解决方案。

机器人控制与仿真应用 2131

企业级 Multi-Agent 实施指南:从需求拆解到上线验收的全流程方法论

本文基于12个不同行业(金融、制造、零售、互联网)的百万级Multi-Agent投产项目经验,提炼出一套可复用的全流程实施SOP,覆盖需求对齐与拆解、架构设计、开发实现、测试优化、上线部署、验收迭代6个核心阶段,包含标准化工具、量化指标、踩坑指南、可直接运行的代码示例,帮你避开90%的落地坑。需求阶段是项目成败的核心,必须对齐业务方的量化指标,明确系统边界架构设计要兼顾性能、安全、可扩展性,不要为了炫技选择复杂的框架工程化是投产的关键,测试、灰度、监控、降级机制缺一不可。

AI云原生与云计算技术学院 223

Mybatis 一对多 Mapper模式 debug 记

先显示一张正常结果图 : 可能出现问题报错提示: 问题一 : MyBatis报错:org.apache.ibatis.binding.BindingException: Type interface com.smbms.dao.provider.Provider 解决方案(在mybatis-config.xml中加入映射文件): 未加入所需配置文件时的mybatis-config.xml中的ma...

羽扬 -- YYDCYY 970

卫朋:IPD流程落地之产品开发验证阶段解读

IPD验证阶段

产品线负责人 1486

MyBatis 实现模糊查询 *Mapper.xml 的几种配置方式

MyBatis 实现模糊查询 *Mapper.xml 的几种配置方式 在学习 MyBatis 过程中想实现模糊查询,可惜失败了。后来上百度上查了一下,才解决了。记录一下 MyBatis 实现模糊查询 *Mapper.xml 的几种配置方式。 首先数据库表是这样的: 数据库表名为 user_info,初始化了几条记录,如图: 错误的方式: 然后它就挂了: 正确的配置方式 (1)使用 ${} 替...

肖朋伟 3604

083、多帧降噪(MFR)与VST算法:低照度场景下的信噪比提升与鬼影抑制

本文深入探讨了多帧降噪(MFR)和VST算法在低照度场景中的应用与优化。作者从实际项目案例出发,指出单帧降噪的局限性,详细分析了MFR的核心原理与工程实现中的关键环节,包括帧对齐、帧选择、融合策略和鬼影抑制等技术要点。文章特别强调VST变换对噪声均匀化的重要性,并分享了实际开发中的调试经验与参数优化技巧,如"三明治"调试法和性能平衡策略。最后指出,优秀的MFR方案需要在信噪比提升、鬼影抑制和纹理保留之间找到场景化的平衡点,建议开发者通过真实场景测试验证算法效果。全文既有理论分析,又包含丰富的实战经验和技术细

zzfmlxs的博客 122

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程

Mybatis的Mapper接口和xml 绑定的原理主要依赖于JDK动态代理技术,下面是详细解释和实现过程

流氓兔的博客 6450

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SpringBoot整合mybatis实现mapper.xml方式访问数据库

SpringBoot整合mybatis实现mapper.xml方式访问数据库 一、项目架构 二、代码 ## pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation...

CoderYin的博客 1436

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

springboot整合mybatis完整示例, mapper注解方式和xml配置文件方式实现(我们要优雅地编程)...

一、注解方式 pom <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0...

weixin_30587025的博客 1171

26、MyBatis Mapper 编写有哪几种方式?

第一种:接口实现类继承 SqlSessionDaoSupport:使用此种方法需要编写 mapper 接口,mapper 接口实现类、mapper.xml 文件 1、在 sqlMapConfig.xml 中配置 mapper.xml 的位置 <mappers> <mapper resource="mapper.xml 文件的地址" /> <mapper resource="mapper.xml 文件的地址" /> </mappers> 2、.

IT匠人的博客 1026

MyBatis Mapper(映射器)和(mybatis-config.xml),MyBatis执行SQL的两种方式

database.properties 用于描述数据库连接的相关配置,例如数据库驱动、连接数据库的 url、数据库用户名、数据库密码等。 映射器是 MyBatis 中最重要的文件,**文件中包含一组 SQL 语句**(例如查询、添加、删除、修改),这些语句称为**映射语句或映射 SQL 语句**。 MyBatis 有两种执行 SQL 语句的方式,如下: 通过 SqlSession 发送 SQL 通过 SqlSession 获取 Mapper 接口,通过 Mapper 接口发送 SQL

muweichang的博客 808

Mybatis如何根据mapper接口生成其实现类

目录 一、序 二、问题 2.1 mapper的实现类如何生成 2.2 mybatis-spring帮忙做了什么 三、mapper代理类是如何生成的 四、mybatis-spring帮忙做了什么 4.4 关于MapperFactoryBean 4.5 SqlSessionTemplate 4.6 SqlSessionInterceptor 一、序 mybatis...

老刀 2378

mybatis的接口绑定方式(注解绑定和配置xml文件)

1、创建pojo类 2、创建mapper.java接口 3、在mybatis-config.xml中更改mapper配置 4、创建测试类 这里以teacher表为例进行编码: 1、创建pojo类(Teacher 对象) 给定是三个属性 id,name,sex 并 右击 generate 出他们的getter and setter 和 toString()方法 public class Teacher { private Integer id; private Str.

车车的博客 1万+

Mybatis中mapper接口实现和方法的执行

1.mapper接口会保存在configuration中的mapperRegistry对象中,MapperRegistry有一个MapperProxyFactory的缓存表,mapper接口以MapperProxyFactory代理类的形势进行存储。

qq_40858363的博客 1763

MyBatis Mapper接口实现原理

MyBatis Mapper接口动态代理类实现原理

给自己一个前行的动力 1万+

Mybatis 加载 Mapper配置的四种方式

前言 Mybatis 的Mapper 是指Mybatis 执行数据库操作的接口类以及方法,在非注解模式下,还包含与类对应的 xml 配置文件。 第一种依据 Mapper 类 具体路径 配置 Mapper 这种情况下,如果是非注解模式的话xml配置文件必须和这个类在同一级目录,且与Mapper类同名 在存在 xml 配置文件的情况下,文件结构如下,

༺ bestcxx的专栏 ༻ 5万+
上一篇: PO、VO、BO、DTO、POJO、DAO、DO的含义
下一篇: Git基本使用总结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值