热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MyBatis多表查询与动态SQL使用

本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。


MyBatis【多表查询与动态SQL使用】


  • 🍎一.MyBatis多表查询
    • 🍒1.1 一对一查询
    • 🍒1.2 一对多查询

  • 🍎二.动态SQL使用
    • 🍒2.1 if 标签使用
    • 🍒2.2 trim 标签使用
    • 🍒2.3 where 标签使用
    • 🍒2.4 set 标签使用(增添)
    • 🍒2.5 foreach 标签使用(集合进行遍历)




🍎一.MyBatis多表查询

我们在进行多表查询的时候,我们需要在数据库创建两个表(作者表,文章表)

<作者表 userinfo>:
在这里插入图片描述
<文章表 articleinfo>:
在这里插入图片描述
在项目中创建的对象:
在这里插入图片描述

在这里插入图片描述

在userinfo配置文件mybatis.xml配置信息

















property&#61;"artlist"
resultMap&#61;"com.example.demo.mapper.ArticleMapper.BaseMap"
columnPrefix&#61;"a_">



在aricleinfo配置文件mybatis.xml配置信息
















resultMap&#61;"com.example.demo.mapper.UserMapper.BaseMap"
columnPrefix&#61;"u_">




&#x1f352;1.1 一对一查询

创建一个ArticleMapper接口方法:
在这里插入图片描述

创建一个ArticleMapper接口对应 aricleinfo 和 userinfo 在maybatis.xml配置文件

ArticleMapper.xml 配置信息:
在这里插入图片描述

UserMapper.xml 配置信息:
在这里插入图片描述
配置文件多表查询语句
这是我们在MySQL进行多表一对一查询执行语句

我们发现这两个表都有一个相同的id名称属性,这会使在查询时前面id的值会将后面id的值进行覆盖,
所有我们需要将对被联合查询表进行重命名
在这里插入图片描述



在进行单元测试代码:
在这里插入图片描述
测试结果:
在这里插入图片描述

在这里插入图片描述


&#x1f352;1.2 一对多查询

UserMapper接口代码:

//查询用户及用户发表的所有文章,根据用户uid
public UserInfo getUserAndArticleByUid(&#64;Param("uid") Integer uid);

UserMapper.xml代码:



单元测试代码:

&#64;Test
void getUserAndArticleByUid() {
UserInfo userInfo &#61; userMapper.getUserAndArticleByUid(1);
log.info("用户文章详细"&#43;userInfo);
}

单元测试结果:
在这里插入图片描述


&#x1f34e;二.动态SQL使用

动态 sql 是Mybatis的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接
可以参考官⽅⽂档&#xff1a;官⽅⽂档


&#x1f352;2.1 if 标签使用

在注册⽤户的时候&#xff0c;可能会有这样⼀个问题&#xff0c;就是有必选和非必选是,当我们使用传统的SQL语句就会很繁琐,需要大量代码来实现,这时我们就可以使用动态SQL来进行筛选用户所填的非必选信息



insert into userinfo(username,password

,photo

) values(#{username},#{password}

,#{photo}

)

在这里插入图片描述
我们在单元测试中假设我们没有填写photo属性信息:
在这里插入图片描述
结果:
我们看到并没有实现photo属性信息填写,解决了非必要填写信息的选择语句繁琐的难题
在这里插入图片描述

当我们填写photo信息时:
在这里插入图片描述

在这里插入图片描述


&#x1f352;2.2 trim 标签使用

标签结合标签&#xff0c;对多个字段都采取动态⽣成的⽅式
标签中有如下属性&#xff1a;
● prefix&#xff1a;表示整个语句块&#xff0c;以prefix的值作为前缀

● suffix&#xff1a;表示整个语句块&#xff0c;以suffix的值作为后缀

● prefixOverrides&#xff1a;表示整个语句块要去除掉的前缀

● suffixOverrides&#xff1a;表示整个语句块要去除掉的后缀



insert into userinfo


username,


password,


photo


values


#{username},


#{password},


#{photo}




&#x1f352;2.3 where 标签使用

where属性没有输入就默认时全局查找了

传⼊的⽤户对象&#xff0c;根据属性做 where 条件查询&#xff0c;⽤户对象中属性不为 null 的&#xff0c;都为查询条件
如user.username 为 “a”&#xff0c;则查询条件为 where username&#61;“a”&#xff1a;



以上标签也可以使⽤ 替换


&#x1f352;2.4 set 标签使用(增添)

根据传⼊的⽤户对象属性来更新⽤户数据&#xff0c;可以使⽤标签来指定动态内容



update userinfo


username&#61;#{username},


password&#61;#{password},


photo&#61;#{photo},


where id&#61;#{id}

以上标签也可以使⽤ 替换


&#x1f352;2.5 foreach 标签使用(集合进行遍历)

// 删除方法{根据id删除这一条数据
public int del2(&#64;Param("ids") List ids);



delete from userinfo where id in

#{id}


测试单元代码:
在这里插入图片描述
测试单元结果:
在这里插入图片描述
在这里插入图片描述







推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
author-avatar
moses_945_5e245a
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有