MyBatis的各种动态sql写法以及各种动态sql所需使用的标签

齐运诚
2023-12-01

MyBatis的各种动态sql写法

1、各种动态sql所需使用的标签

1.foreach 标签

首先在mapper中接收到的方法参数应该是list、map或者array类型的。

使用方法如下

<foreach  item="item" collection="list" index="index"  open="(" separator="," close=")">
	#{item}
</foreach>
<!--
    # item表示集合中每一个元素进行迭代时的别名.

    # index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置.

    # collection 为传进来的collection参数的 *类型*

    # open表示该语句以什么开始

    # separator表示在每次进行迭代之间以什么符号作为分隔符

    # close表示以什么结束
-->

<!--
    如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
    如果传入的是单参数且参数类型是一个Array数组的时候,collection属性值为array
-->

2.where标签

<!-- 此处配置了别名,因此参数类型以及返回值类型可以使用简略写法-->
<!--使用where标签时,第一个if标签中的sql语句,可以省略and关键字-->
<select id="findUserByWhere" resultType="user" parameterType="user">
	select * from user
	<where>
		<if test="username != null">
			username = #{username}
		</if>
		<if test="sex != null">
			and sex = #{sex}
		</if>
	</where>
</select>

3. sql标签

Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的

使用方法如下

   <sql id="userInfoColumnsList">
        <trim suffixOverrides=",">
            <if test="item.userName != null">userName,</if>
            <if test="item.age != null">age,</if>
            <if test="item.sex != null">sex,</if>
            <if test="item.salary != null">salary,</if>
            <if test="item.completed != null">completed,</if>
            <if test="item.remark != null">remark</if>
        </trim>
    </sql>
    <sql id="userInfoValuesList">
        <trim suffixOverrides=",">
            <if test="item.userName != null">#{item.userName},</if>
            <if test="item.age != null">#{item.age},</if>
            <if test="item.sex != null">#{item.sex},</if>
            <if test="item.salary != null">#{item.salary},</if>
            <if test="item.completed != null">#{item.completed},</if>
            <if test="item.remark != null">#{item.remark}</if>
        </trim>
    </sql>

    <!--测试批量插入成功,但是这种方式要求所有字段都具有值-->
    <!--会构造出这样的语句insert into UserInfo(userName,age,sex,salary,completed,remar) VALUES(...),(...),(...)-->
	<insert id="batchInsert" parameterType="com.example.mybatisdemo1.domin.UserInfo" keyColumn="userInfoId" keyProperty="userInfoId" useGeneratedKeys="true">
	        insert into UserInfo(userName,age,sex,salary,completed,remark) VALUES
		<foreach item="item" index="index" collection="list" separator=",">
		      (<include refid="userInfoValuesList"/>)
		</foreach>
	</insert>

    <!--测试动态批量插入成功,注意application.yml数据库设置要加上&allowMultiQueries=true,否者提示SQLSyntaxErrorException-->
	<insert id="batchInsert" parameterType="com.example.mybatisdemo1.domin.UserInfo"        keyColumn="userInfoId" keyProperty="userInfoId" useGeneratedKeys="true">
	        <foreach item="item" index="index" collection="list" separator=";">
	            insert into UserInfo(<include refid="userInfoColumnsList"/>)
	            VALUES(<include refid="userInfoValuesList"/>)
	        </foreach>
	</insert>

4.trim标签

<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim>
<!--
# prefix:在trim标签内sql语句加上前缀。

# suffix:在trim标签内sql语句加上后缀。

# suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。

# prefixOverrides:指定去除多余的前缀内容
-->

<!--使用举例-->
<insert id="insert" parameterType="user">
        insert into user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">
                id,
            </if>
            <if test="userId != null">
                userId,
            </if>
            <if test="username != null">
                username,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">
                #{id},
            </if>
            <if test="userId != null">
                #{userId},
            </if>
            <if test="username != null">
                #{username},
            </if>
        </trim>
    </insert>

5.choose标签

​ choose标签是根据类别来进行查询的,当满足when标签里面的test属性时,才会去执行when标签里面的sql语句,如果都不满足,则会执行otherwise标签里的sql语句。

<select id="searchCourses" parameterType="map" resultMap="coursesResult">
	select *
	from courses
	<choose>
		<when test="searchBy == 'Tutor'">
			where tutor_id = #{tutorId}
		</when>
		<when test="sreachBy == 'courseName'">
			where name like #{courseName}
		</when>
		<otherwise>
			where start_date <![CDATA[>=]]> sysdate
		</otherwise>
	</choose>
</select

6.set标签

<set>
set标签只是针对update更新语句使用的。
<set>
    <if test="name != null">name=#{name}</if>
    <if test="email != null">email=#{email}</if>
    <if test="phone != null">phone=#{phone}</if>
</set

7.concat标签(模糊查询)

//比如说我们想要进行条件查询,但是几个条件不是每次都要使用,那么我们就可以通过判断是否拼接到sql中 
<select id="queryById" resultMap="BascResultMap" parameterType="entity">   
    SELECT *  from entity  
    <where>      
        <if test="name!=null">           
            name like concat('%',concat(#{name},'%'))   
        </if>   
    </where>
</select>

8、selectKey 标签

在insert语句中,在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。下面例子,使用mysql数据库自定义函数nextval(‘student’),用来生成一个key,并把他设置到传入的实体类中的studentId属性上。所以在执行完此方法后,边可以通过这个实体类获取生成的key。

<!-- 插入学生 自动主键-->  
<insert id="createStudentAutoKey" parameterType="liming.student.manager.data.model.StudentEntity" keyProperty="studentId">  
    <selectKey keyProperty="studentId" resultType="String" order="BEFORE">  
        select nextval('student')  
    </selectKey>  
    INSERT INTO STUDENT_TBL(STUDENT_ID, STUDENT_NAME, STUDENT_SEX,  STUDENT_BIRTHDAY,  STUDENT_PHOTO, CLASS_ID,  PLACE_ID)  
    VALUES (#{studentId},  #{studentName},  #{studentSex},  #{studentBirthday},  #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},  #{classId},  
#{placeId})  
</insert>  

9.bind标签

​ bind 标签的两个属性都是必选项, name 为绑定到上下文的变量名, va l ue 为 OGNL 表达式。创建一个 bind 标签的变量后 , 就可以在下面直接使用,使用 bind 拼接字符串不仅可以避免因更换数据库而修改 SQL,也能预防 SQL 注入。

<if test=” userNarne != null and userNarne !=””>
<bind narne= " userNarneLike ” value = ”’ 草 ’+ userNarne + ’ 每 ’” / 〉
and user name like #{userNarneLike}
</if>

2、批量添加、更新、删除

<!--批量添加-->
	详细语法 请看上文sql标签的使用!


<!--批量更新-->
<update id="batchUpdateOneField" parameterType="com.example.mybatisdemo1.domin.UserInfo">
        update UserInfo
        set age=
        <foreach collection="list" item="item" index="index"
                 separator=" " open="case" close="end">
            when userInfoId=#{item.userInfoId} then #{item.age}
        </foreach>
        where userInfoId in
        <foreach collection="list" index="index" item="item"
                 separator="," open="(" close=")">
            #{item.userInfoId}
        </foreach>
  </update>


<!--批量删除-->
 <delete id="batchDelete" parameterType="com.example.mybatisdemo1.domin.UserInfo">
        delete from UserInfo where userInfoId
        in
        <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
          #{item}
        </foreach>
 </delete>

<!--多个字段批量更新-->
<update id="batchUpdateMultiField" parameterType="com.example.mybatisdemo1.domin.UserInfo">
    update UserInfo
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="userName = case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.userName != null"> when userInfoId=#{item.userInfoId} then #{item.userName}</if>
            </foreach>
        </trim>

        <trim prefix="age =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.age != null">when userInfoId=#{item.userInfoId} then #{item.age}</if>
            </foreach>
        </trim>

        <trim prefix="sex =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.sex != null">when userInfoId=#{item.userInfoId} then #{item.sex}</if>
            </foreach>
        </trim>

        <trim prefix="salary =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.salary != null">when userInfoId=#{item.userInfoId} then #{item.salary}</if>
            </foreach>
        </trim>

        <trim prefix="completed =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.completed != null">when userInfoId=#{item.userInfoId} then #{item.completed}</if>
            </foreach>
        </trim>

        <trim prefix="remark =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.remark != null">when userInfoId=#{item.userInfoId} then #{item.remark}</if>
            </foreach>
        </trim>
    </trim>
    where userInfoId in
    <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
        #{item.userInfoId}
    </foreach>
</update>

3、给一个类起别名


<typeAliases>
		<!-- 可以给类取一个别名 -->
		<typeAlias type="com.hncj.dao.user" alias="user"/>
</typeAliases>

注: 目前能想到的关于动态sql的标签和相关知识点只有上面那么多,欢迎大家如果有知道新的标签,可以在下方留言,我会进行采纳整理的,大家一起来整理相关知识,我相信每一个人都会学到很多,感谢啦!

   欢迎大家点赞收藏,一起学技术
 类似资料: