Bootstrap

Mybatis动态sql和多表联查

Mysql动态sql (灵活的优势)

一、if+where 语句(主要where后有多个条件)

根据姓名或者性别查

List queryByNameORSex(Users users);

这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果是以AND 或OR 开头的,则它会剔除掉。

	<select id="queryByNameORSex" resultType="Users">
        select  * from  users where
        <if test="username!=null">
            username=#{username}
        </if>
        <if test="sex!=null">
            sex=#{sex}
        </if>
    </select>

二、if+set 语句(主要是更新数据)

根据id修改数据

set 标签中如果出现多余逗号 会自动去掉!!

	<update id="updateUserById" parameterType="User">
		update user u
		<set>
			<if test="username != null and username != ''">
				u.username = #{username},
			</if>
			<if test="sex != null and sex != ''">
				u.sex = #{sex},
			</if>
		</set>
		where id=#{id}
	</update>

三、动态SQL:: foreach 语句 (好用)

第一种: 基于集合

需求:我们需要查询 user 表中 id 分别为1,2,3的用户

select * from user where id in (1,2,3)

List queryByIn(List ids);

	<select id="queryByIn" resultType="Users">
        select * from users where id in
        <foreach collection="list" index="index" item="item" open="(" separator=","  close=")">
            #{item}
        </foreach>
    </select>

第二种 基于数组

只是将list”替换成“array”
在这里插入图片描述

如果是useid=? or userid=? … 的话只需要将separator中的,改为or 和#{id}改为userid=#{id}就OK了;

	<select id="queryByOR" resultType="Users">
        select  * from users where
        <foreach collection="list" index="index" item="item" separator="or" >
            id=#{item}
        </foreach>
    </select>

四、动态SQL:choose(when,otherwise)

类似java中的switch语句(工作中不会常用)

这个动态sql可以用if+where代替的

	<select id="selectUserByChoose" resultType="User" parameterType="User">
		select * from user
		<where>
			<choose>
				<when test="id !='' and id != null">
					id=#{id}
				</when>
				<when test="username !='' and username != null">
					and username=#{username}
				</when>
				<otherwise>
					and sex=#{sex}
				</otherwise>
			</choose>
		</where>
	</select>

五、动态SQL:trim 语句 (这个用的很少很少)

①、用 trim 改写上面的 if+where 语句

	<select id="selectUserByUsernameAndSex" resultType="user" parameterType="User">
		select * from user
		<trim prefix="where" prefixOverrides="and | or">
			<if test="username != null">
				and username=#{username}
			</if>
			<if test="sex != null">
				and sex=#{sex}
			</if>
		</trim>
	</select>
prefix:前缀      
prefixoverride:去掉第一个and或者是or

②、用 trim 改写上面的 if+set 语句

	<!-- 根据 id 更新 user 表的数据 -->
	<update id="updateUserById" parameterType="User">
		update user u
		<trim prefix="set" suffixOverrides=",">
			<if test="username != null and username != ''">
				u.username = #{username},
			</if>
			<if test="sex != null and sex != ''">
				u.sex = #{sex},
			</if>
		</trim>
		where id=#{id}
	</update>

2.6 动态SQL: SQL 片段 (提高代码的重复利用,好用)

有时候可能某个 sql 语句我们用的特别多,为了增加代码的重用性,简化代码,我们需要将这些代码抽取出来,然后使用时直接调用。
比如:假如我们需要经常根据用户名和性别来进行联合查询,那么我们就把这个代码抽取出来,如下:

在这里插入图片描述
上图就是定义的sql片段,也就是重复的代码 (java中的封装思想)

在这里插入图片描述
上图是引用sql片段 用的include refid 来指向定义的sql的片段

四、Mysql的关联查询(多表联查)

4.1、一对一关系(用的不多)

  1. 首先创建表的关系
    班级class表teacher表

根据班级id查询班级信息(带老师的信息)
在这里插入图片描述

主要是在建实体类时有外键的表加入另外一张表的实体类对象
也就是创建class表时创建一个teacher实体类对象,这样只用得到class对象就能得到teacher信息了

具体如下
在这里插入图片描述

  1. 定义sql映射文件classMapper.xml

在这里插入图片描述
这里的标签意思是:
**property:**对象属性的名称
**javaType:**对象属性的类型
**column:**所对应的外键字段名称
**select:**使用另一个查询封装的结果

4.2、一对多(和多对一)关系(重点)

  1. 关系图如下:
    在这里插入图片描述

  2. **核心点:**在一(少的)的一方实体类中创建多的一方的实体集合,
    在多的一方实体类中加入一(少)的一方的实体对象
    在这里插入图片描述
    在这里插入图片描述

  3. 定义sql映射文件classMapper.xml
    在这里插入图片描述
    在这里插入图片描述

4.3、多对多关系(重点)

  1. 关系图如下:
    在这里插入图片描述

  2. **核心点:**在要查询的对象的实体表中加入所关联表信息的实体类具体如下

在这里插入图片描述

  1. sql语句
    在这里插入图片描述

  2. 定义sql映射文件classMapper.xml
    在这里插入图片描述

最后推荐使用Mybatis plus插件和MyBatis一起开发,因为Mybatis plus提供了17种简单常用的cdur SQL语法。

;