动态sql,关联查询

1、动态sql

1.2.1 sql标签

可以通过sql标签提高sql代码的复用性
定义代码片段

<sql id="sql_count">select count(*)</sql>

使用代码片段

<select id="selectUserCount" resultType="String"><include refid="sql_count"/> from t_user
</select>

1.2.2 if标签

进行条件判断,判断成功会把if内部SQL拼接到外部SQL中,否则不拼接

<if test="条件">SQL语句
</if>

问题:直接使用if会出现多余的where和and、or等关键词

1.2.3 where标签

用于配置条件,会去掉多余的where、and、or关键词

select * from xx
<where><if test="条件">SQL语句</if>
</where>

1.2.4 set标签

用于配置update语句,用于去掉多余的,

update xx 
<set><if test="条件">列 = 值,</if><if test="条件">列 = 值,</if>...
</set>
where 条件

1.2.5 trim标签

可以删除或添加前缀和后缀,用来拼接SQL

<trim prefix="添加前缀" suffix="添加后缀" prefixOverride="删除后缀" suffixOverride="删除后缀"><if>...</if>
</trim>

用trim代替set

<trim prefix="set" suffixOverride=",">..
</trim>

1.2.6 foreach标签

用于循环拼接SQL

<foreach collection="集合参数名称" item="变量名" open="开始符号" close="结束符号" seprator="分割符" index="下标">#{变量名}
</foreach> 
List<Employee> selectByIds(List<Long> ids);
--->
select * from employee where id in (1,2,3,4)<select id="selectByIds" resultType="Employee"><include refid="mySelect"></include>where emp_id in<foreach collection="ids" item="id" separator="," open="(" close=")" index="i">#{id}</foreach>
</select>

2、关联查询

2.1 关联关系的分类

表之间有几种关联关系:

  1. 一对一 如:一个人有一个身份证
  2. 一对多 如:一个部门有多个员工
  3. 多对一 如:多个员工属于一个部门
  4. 多对多 如:一个学生可以选择多门课程,一门课程也有多个学生

2.2 MyBatis实现关联

在进行数据库查询时,会遇到多张表相互关联的情况,下面以书籍和类型为例,配置最常见的一对多关系。

2.3 关联配置

MyBatis映射文件中,在ResultMap里可以配置关联关系

主要有两种标签来映射关联属性:

  • collection 配置集合类型的属性

  • association 配置单独对象的属性

collection和association的相关参数:

  • property 属性的名称
  • select 查询方法
  • javaType 属性的类型
  • ofType 如果属性是集合,集合中对象的类型
  • column 外键字段名

2.3.1 查询集合

配置一的一方,查询书籍类型时,能同时查询到该类型的所有书籍

1) 给类型添加书籍集合,这里需要使用collection

public class BookType {private long id;private String type;//书籍的集合private List<Book> books;..}

2) 书籍类型Mapper接口

public interface IBookTypeDAO {/*** 按id查书籍类型* @param typeId* @return*/BookType selectBookTypeById(int typeId);
}

3) 在Book映射接口中定义方法

    /*** 根据类型id查询所有书籍* @param typeId* @return*/List<Book> selectBooksByTypeId(int typeId);

4) BookType的映射文件

<resultMap id="bookTypeMap" type="BookType" ><id property="id" column="id"></id><result property="type" column="type"></result><!--配置集合 property是集合属性 select是查询方法 javaType是集合类型ofType是集合的数据类型 column外建列作为参数传入查询方法--><collection property="books" select="com.blb.bookms.dao.IBookDAO.selectBooksByTypeId"javaType="java.util.List"   ofType="Book" column="id"></collection>
</resultMap><select id="selectBookTypeById" resultMap="bookTypeMap" parameterType="java.lang.Integer">select * from tb_book_type where id = #{typeId}
</select>

这里使用的是子查询的机制,在查询书籍类型后,将每个类型id作为参数,调用书籍接口的selectBooksByTypeId方法查询书籍集合。

连接查询方式

<resultMap id="deptMap" type="Department"><id property="deptId" column="dept_id"></id><result property="deptName" column="dept_name"></result><!--员工集合的配置 property属性名 column子查询使用的字段javaType集合类型 ofType集合的对象类型select是子查询的方法--><collection property="employees"javaType="java.util.List" ofType="Employee"><id property="empId" column="emp_id"></id><result property="empNo" column="emp_no"></result><result property="empName" column="emp_name"></result><result property="empAge" column="emp_age"></result><result property="empGender" column="emp_gender"></result><result property="empInfo" column="emp_info"></result><result property="empAddress" column="emp_address"></result><result property="empDeptId" column="emp_dept_id"></result></collection>
</resultMap><sql id="deptSelect">select d.*,e.* from department d join employee e on d.dept_id = e.emp_dept_id
</sql><select id="selectAll" resultMap="deptMap"><include refid="deptSelect"></include>
</select>

2.3.2 查询单个对象

配置多的一方,通过书籍查询到它所属的类型

  1. 给Book添加BookType属性
/*** 书籍*/
public class Book {.../书籍类型private BookType bookType;

2)书籍映射文件中,使用association配置bookType属性

<resultMap id="bookMap" type="Book"><id property="id" column="id"></id><result property="bookName" column="book_name"></result><result property="price" column="price"></result><result property="typeId" column="type_id"></result><result property="author" column="author"></result><result property="publishOrg" column="publish_org"></result><result property="publishTime" column="publish_time"></result><result property="state" column="state"></result><result property="bookImage" column="book_image"></result><!--映射一对一 类型--><association property="bookType" javaType="BookType"select="com.blb.bookms.dao.IBookTypeDAO.selectBookTypeById" column="type_id"></association>
</resultMap><select id="selectBookById" parameterType="java.lang.Integer" resultMap="bookMap">select * from tb_book where id = #{id}
</select>

连接查询

    <resultMap id="empMap" type="Employee" autoMapping="true">
<!--        <id property="empId" column="emp_id"></id>-->
<!--        <result property="empNo" column="emp_no"></result>-->
<!--        <result property="empName" column="emp_name"></result>-->
<!--        <result property="empAge" column="emp_age"></result>-->
<!--        <result property="empGender" column="emp_gender"></result>-->
<!--        <result property="empInfo" column="emp_info"></result>-->
<!--        <result property="empAddress" column="emp_address"></result>-->
<!--        <result property="empDeptId" column="emp_dept_id"></result>--><!--单独对象映射--><association property="department" javaType="Department" autoMapping="true">
<!--            <id property="deptId" column="dept_id"></id>-->
<!--            <result property="deptName" column="dept_name"></result>--></association></resultMap><!--sql语句重用--><sql id="mySelect">-- select * from employeeselect d.*,e.* from department d join employee e on d.dept_id = e.emp_dept_id</sql>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZABBIX根据IP列表,主机描述,或IP子网批量创建主机的维护任务

有时候被ZABBIX监控的主机可能需要关机重启等维护操作,为了在此期间不触发告警,需要创建主机的维护任务,以免出现误告警 ZABBIX本身有这个API可供调用(不同版本细节略有不同,本次用的ZABBIX6.*),实现批量化建立主机的维护任务 无论哪种方式(IP列表,主机描述,或IP子网)创建维护…

用 Golang 启动个简单的http服务器

本章通过编写功能逐渐复杂的 web 服务器来让开发者对如何运用 go 语言有一个初步的了解。web 服务的地址 http://localhost:8000。 1. 启动一个最简单的 web 服务器 package mainimport ("fmt""log""net/http" )func main() {http.HandleFunc(…

【C语言】linux内核ipoib模块 - ipoib_start_xmit

一、ipoib_start_xmit函数定义 static netdev_tx_t ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct rdma_netdev *rn netdev_priv(dev);struct ipoib_neigh *neigh;struct ipoib_pseudo_header *phdr…

[AI]文心一言爆火的同时,ChatGPT-4.5的正确打开方式

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

STM32标准库开发——串口发送/单字节接收

USART基本结构 串口发送信息 启动串口一的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);初始化对应串口一的时钟&#xff0c;引脚&#xff0c;将TX引脚设置为复用推挽输出。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_In…

css绘制下拉框头部三角(分实心/空心)

1:需求图: 手绘下拉框 带三角 2:网上查了一些例子,但都是实心的, 可参考,如图: (原链接: https://blog.csdn.net/qq_33463449/article/details/113375804) 3:简洁版的: a: 实心: <view class"angle"/>.angle{width:0;height:0;border-left: 10px solid t…

121 二叉搜索树的最近公共祖先

问题描述&#xff1a;给定一个二叉搜索树&#xff0c;找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;对于有根树T的两个节点p、q&#xff0c;最近公共祖先表示为一个节点x&#xff0c;满足x是p和q的祖先&#xff0c;且x的深度尽可能大。 …

java获取jvm内存信息 java获取jvm运行信息 java获取jvm运行信息

java获取jvm内存信息 java获取jvm运行信息 java获取jvm运行信息 1、创建需要使用的工具类2、创建一个 jvm信息对象类3、使用 1、创建需要使用的工具类 文件名 ByteConverter.java 用于将字节数值转为 MB数值 import java.math.BigDecimal; import java.math.RoundingMode;/***…

元宇宙:智慧城市建设的未来引擎与价值之源

在21世纪的技术大潮中&#xff0c;元宇宙的出现无疑是一场革命&#xff0c;其独特的概念与价值已经引发了全球范围内的关注。 作为新兴科技的前沿&#xff0c;元宇宙为智慧城市建设带来了无限的可能性和价值&#xff0c;有望成为未来城市发展的核心动力。 元宇宙&#xff0c;这…

「HDLBits题解」Counters

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;Count15 - HDLBits module top_module (input clk,input reset, // Synchronous active-high resetoutput [3:0] q ); always…

【linux】Linux编辑器-vim

rz指令&#xff0c;sz指令 关于 rzsz 这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过拖拽的方式将文件上传过去 1.查看软件包 通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep…

GitHub 一周热点汇总第6期(2024/01/14-01/20)

GitHub一周热点汇总第6期 (2024/01/14-01/20) &#xff0c;梳理每周热门的GitHub项目&#xff0c;这一周的热门项目中AI的比重难得的变低了&#xff0c;终于不像一个AI热门项目汇总了&#xff0c;一起来看看都有哪些项目吧。 #1Maybe 项目名称&#xff1a;Maybe - 个人理财应…

webpack.config.js配置文件报错:The ‘mode‘ option has not been set

报错 WARNING in configuration The mode option has not been set, webpack will fallback to production for this value. Set mode option to development or production to enable defaults for each environment. You can also set it to none to disable any default be…

pixel_avg2_w20_neon x264像素宽度为20的均值计算

一 C语言实现 static inline void pixel_avg2_w20_altivec(uint8_t *dst, intptr_t i_dst, uint8_t *src1, intptr_t i_src1, uint8_t *src2, int i_height) { pixel_avg2_w16_altivec(dst, idst, src1, i_src1, src2, i_height); //前面16列 pixel_avg2_w4_altivec(dst 16, i…

2种数控棋

目录 数控棋1 数控棋2 数控棋1 棋盘&#xff1a; 初始局面&#xff1a; 规则&#xff1a; 规则&#xff1a;双方轮流走棋&#xff0c;可走横格、竖格、可横竖转弯&#xff0c;不可走斜格。每一步均须按棋所在格的数字走步数&#xff0c;不可多不可少。 先无法走棋的一方为…

Java多线程并发篇----第二十五篇

系列文章目录 文章目录 系列文章目录前言一、如何在 Windows 和 Linux 上查找哪个线程使用的CPU 时间最长?二、什么是原子操作?在 Java Concurrency API 中有哪些原子类(atomic classes)?三、Java Concurrency API 中的 Lock 接口(Lockinterface)是什么?对比同步它有什么优…

【机组】算术逻辑单元带进位运算实验的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1f33a;一、 实验目…

C语言第三弹---数据类型和变量

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 数据类型和变量 1、数据类型介绍1.1、整型1.2、浮点型1.3、字符型1.4、布尔类型1.5、各种数据类型的长度1.5.1、sizeof操作符1.5.2、数据类型的长度1.5.3、sizeo…

win系统环境搭建(十二)——Windows系统下使用docker安装redis

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;十二&#xff09;——Windows系统下使用docker安装redis 文章目录 win系统环境搭建&#xff08;十二&#xff09;——Windows系统下使用docker安装redis1.创建文件夹2.docker-compose.yaml配置文件3.red…

vulnhub通关-1 DC-1(含靶场资源)

一、环境搭建 1.环境描述 描述 描述&#xff1a; DC-1 is a purposely built vulnerable lab for the purpose of gaining experience in the world of penetration testing. Dc-1是一个专门构建的易受攻击的实验室&#xff0c;目的是获得渗透测试领域的经验。 It was design…