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、一对一关系(用的不多)
- 首先创建表的关系
班级class表 和teacher表
根据班级id查询班级信息(带老师的信息)
主要是在建实体类时有外键的表中加入另外一张表的实体类对象
也就是创建class表时创建一个teacher实体类对象,这样只用得到class对象就能得到teacher信息了
具体如下
- 定义sql映射文件classMapper.xml
这里的标签意思是:
**property:**对象属性的名称
**javaType:**对象属性的类型
**column:**所对应的外键字段名称
**select:**使用另一个查询封装的结果
4.2、一对多(和多对一)关系(重点)
-
关系图如下:
-
**核心点:**在一(少的)的一方实体类中创建多的一方的实体集合,
在多的一方实体类中加入一(少)的一方的实体对象
-
定义sql映射文件classMapper.xml
4.3、多对多关系(重点)
-
关系图如下:
-
**核心点:**在要查询的对象的实体表中加入所关联表信息的实体类具体如下
-
sql语句
-
定义sql映射文件classMapper.xml