动态SQL是mybatis的强大特性之一,mybatis中的动态sql是通过if set where choose foreache等动态标签来实现的。
①if:根据参数条件判断是否显示某些sql;
例如:List<Teacher> selectMap(Map<String,Object> map);//参数传递的是Map时,#{key}取value
<select id="selectMap" parameterType="java.util.Map" resultType="Teacher"> select * from h_teacher <where> <if test="id!=null"> id=#{id} </if> <if test="name!=null and name!=''"> or name=#{name} </if> </where> </select>
②where:会自动处理where筛选中的sql条件,如果没有任何条件,则不会添加where,如果条件以and、or开头,会自动去除;
例如:List<Teacher> selectMap(Map<String,Object> map);//参数传递的是Map时,#{key}取value
<!-- 传递map,指定parameterType为map <if test> test中填写boolean类型表达式,判断 --> <select id="selectMap" parameterType="java.util.Map" resultType="Teacher"> select * from h_teacher <where> <if test="id!=null"> id=#{id} </if> <if test="name!=null and name!=''"> or name=#{name} </if> </where> </select>
③foreach:对集合进行遍历;
例如:int deleteByIds(Integer[] ids);//批量删除 传递数组/集合
<delete id="deleteByIds"> delete form h_teacher where id in <foreach collection="array" item="id" open="(" close=")" separator=","> #{id} </foreach> </delete>
④choose when otherwise:类似于java中的switch语句,choose=>switch,when=>case,otherwise=>default;
例如:List<Teacher> selectByIdOrName(@Param("id") Integer id, @Param("name") String name);//根据id或name查找数据 演示多个参数的取值方式,通过@Param取别名
<select id="selectByIdOrName" resultType="Teacher"> <!--select * from h_teacher where id=#{id} or name=#{name}--> select * from h_teacher <where> <!--choose,when,otherwise 三个标签配合使用,只会匹配一个选项--> <choose> <when test="id!=null"> id=#{id} </when> <otherwise> name=#{name} </otherwise> </choose> </where> </select>
⑤set:元素会动态地在行首插入SET关键字,并会删掉额外的逗号;
例如:int updateSelective(Teacher teacher);//选择性更新
<update id="updateSelective" parameterType="Teacher"> update h_teacher <!--set标签,会去除末尾的逗号--> <set> <if test="name!=null"> name=#{name}, </if> <if test="age!=null"> age=#{age} </if> </set> where id=#{id} </update>
⑥trim:指定以特定字符开始和结束,并去除前后的特定字符;
例如:int insertSelective(Teacher teacher);//选择性插入数据
<insert id="insertSelective" parameterType="Teacher"> <selectKey keyProperty="id" resultType="integer" order="BEFORE"> select seq_t_teacher.nextval from dual </selectKey> insert into h_teacher <trim prefix="(" suffix=")" suffixOverrides=","> id, <if test="name!=null">name,</if> <if test="age!=null">age</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> #{id}, <if test="name!=null">#{name},</if> <if test="age!=null">#{age}</if> </trim> </insert>
⑦bind:元素允许你在OGNL表达式以外创建一个变量,并将其绑定到当前的上下文,常用模糊语句查询;
例如:List<Teacher> selectByName(@Param("name") String name);//根据名称进行模糊查询
<!-- bind标签:用来向上下文中存值,name为值的名称,value指定值的内容--> <select id="selectByName" resultType="Teacher"> <bind name="nameLike" value="'%'+name+'%'"/> select * from h_teacher where name like #{nameLike} </select>
⑧sql:定义sql片段,include引入sql片段;
例如:Teacher selectById(Integer id);//根据主键查询
<!-- 通常抽取出通用的sql片段--> <sql id="selectColumn"> id,name,age </sql> <!-- id指定关联的方法名 resultType:关联返回的类型 parameterType:表示该sql语句中需要传入的参数, 类型要与对应的接口方法的类型一致 指定参数类型,可省略 resultType:定义出参,匹配普通Java类型或自定义的pojo【出参类型若不指定,将为语句类型默认类型,如语句返回值为int】 --> <!-- #{参数名}:获取接口方法传递的单个参数 --> <select id="selectById" parameterType="integer" resultType="Teacher"> select <include refid="selectColumn"></include> from H_TEACHER where ID=#{id} </select>