3.4,where标签:处理查询条件:
如果在多重if条件的查询过程中,如果在where条件中,没有设置条件1=1那么可能就会变成下面这样一条错误的语句:
SELECT id,name,url,age,country FROM website AND name LIKE CONCAT('%',#{name},'%')
显然以上语句会出现 SQL 语法异常,但加入“1=1”这样的条件又非常奇怪,所以 MyBatis 提供了 where 标签。主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件,语法如下:
<where> <if test="判断条件"> AND/OR ... </if> </where>
if 语句中判断条件为 true 时,where 关键字才会加入到组装的 SQL 里面,否则就不加入。where 会检索语句,它会将 where 后的第一个 SQL 条件语句的 AND 或者 OR 关键词去掉。
3.5,set标签:动态更新:
在 Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。
<update id="updateRoute" parameterType="com.xinxi2.bean.Route"> update route <set> <if test="id!=null"> id=#{id}, </if> <if test="name!=null"> `name`=#{name}, </if> <if test="mileage!=null"> mileage=#{mileage}, </if> </set> where id=#{id} </update>
3.6,foreach 标签:迭代遍历:
当SQL 语句中含有 in关键字进行列表值匹配时,需要迭代条件集合来生成的情况,可以使用 foreach来实现 SQL 条件的迭代。
Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set接口的集合,并对此提供遍历的功能。语法格式如下:
<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")"> 参数值 </foreach>
foreach 标签主要有以下属性,说明如下。
- item:表示集合中每一个元素进行迭代时的别名。
- index:指定一个名字,表示在迭代过程中每次迭代到的位置。
- open:表示该语句以什么开始,既然是 in 条件语句,所以必然以(开始。
- separator:表示在每次进行迭代之间以什么符号作为分隔符,既然是 in 条件语句,所以必然以,作为分隔符。
- close:表示该语句以什么结束,既然是 in 条件语句,所以必然以)结束。
- 使用 foreach 标签时, collection属性是必选,但在不同情况下该属性的值是不一样的,主要有以下 3种情况
- 如果传入的是单参数且参数类型是一个 List,collection属性值为 list。
- 如果传入的是单参数且参数类型是一个 array 数组,collection的属性值为 array。
- 如果传入的参数是多个,需要把它们封装成一个Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。
四,关联查询:
4.1,概述:
关联关系是一个数据库实体的概念,有 3 种级联关系,分别是一对一级联、一对多级联以及多对多级联。例如,一个角色可以分配给多个用户,也可以只分配给一个用户。大部分场景下,我们都需要获取角色信息和用户信息,所以会经常遇见以下 SQL。
SELECT r.*,u.* FROM t_role r INNER JOIN t_user_role ur ON r.id = ur.id INNER JOIN t_user u ON ur.user_id = u.id WHERE r.id = #{id}
在级联中存在 3 种对应关系。
- 一对多,例如:角色和用户、项目组和软件工程师、用户和收货地址。
- 一对一,例如:商品简介和商品详情、学生基本信息和学籍档案信息。
- 多对多,例如:订单与商品、玩家与组队,例如:订单与商品、玩家与组队
4.2,一对一关联查询:
一对一级联关系在现实生活中是十分常见的,例如:一个学生基本信息对应一个学籍档案。
在 MyBatis 中,通过 元素的子元素 处理一对一级联关系。示例代码如下:
<association property="studentCard" column="cardId" javaType="com.apesource.entity.StudentCard" select="com.apesource.mapper.StudentCardMapper.selectStuCardById" />
在 元素中通常使用以下属性。
- property:指定映射到实体类的对象属性。
- column:指定表中对应的字段(即查询返回的列名)。
- javaType:指定映射到实体对象属性的类型。
- select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询
- 一对一关联查询可采用以下两种方式:
- 分步查询,通过两次或多次查询,为一对一关系的实体 Bean 赋值。
- 单步查询,通过关联查询实现。
4.3,多对多关联查询:
实际应用中,由于多对多的关系比较复杂,会增加理解和关联的复杂度,所以应用较少。MyBatis没有实现多对多级联,推荐通过两个一对多级联替换多对多级联,以降低关系的复杂度,简化程序。
例如,一个订单可以有多种商品,一种商品可以对应多个订单,订单与商品就是多对多的级联关系。可以使用一个中间表(订单记录表)将多对多级联转换成两个一对多的关系。