首先在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
-->
<!-- 此处配置了别名,因此参数类型以及返回值类型可以使用简略写法-->
<!--使用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>
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>
<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>
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
<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
//比如说我们想要进行条件查询,但是几个条件不是每次都要使用,那么我们就可以通过判断是否拼接到sql中
<select id="queryById" resultMap="BascResultMap" parameterType="entity">
SELECT * from entity
<where>
<if test="name!=null">
name like concat('%',concat(#{name},'%'))
</if>
</where>
</select>
在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>
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>
<!--批量添加-->
详细语法 请看上文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>
<typeAliases>
<!-- 可以给类取一个别名 -->
<typeAlias type="com.hncj.dao.user" alias="user"/>
</typeAliases>
注: 目前能想到的关于动态sql的标签和相关知识点只有上面那么多,欢迎大家如果有知道新的标签,可以在下方留言,我会进行采纳整理的,大家一起来整理相关知识,我相信每一个人都会学到很多,感谢啦!
欢迎大家点赞收藏,一起学技术