Mybatis(5)——动态SQL
• if:判断
• choose (when, otherwise):分支选择;带了break的swtich-case
如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个
• trim 字符串截取(where(封装查询条件), set(封装修改条件))
• foreach 遍历集合
if进行判断,其中的test::判断表达式(OGNL)
从参数中取值进行判断 。遇见特殊符号应该去写转义字符:
<select id="getComplete1"> SELECT * FROM student WHERE <where> <if test="id!=null">id=#{id} </if> <if test="addr!=null">AND id=#{addr} </if> <if test="stuGender!=null">AND gender=#{stuGender} </if> <if test="name!=null">AND name=#{name}</if> </where> </select>
trim
<trim prefix="WHERE" suffixOverrides="AND"> <if test="id!=null">id=#{id} AND </if> <if test="addr!=null">id=#{addr} AND </if> <if test="stuGender!=0">gender=#{stuGender} AND </if> <if test="name!=null">name='${name}' AND </if>
</trim>
prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。 prefix给拼串后的整个字符串加一个前缀
prefixOverrides="":
前缀覆盖: 去掉整个字符串前面多余的字符
suffix="":后缀
suffix给拼串后的整个字符串加一个后缀
suffixOverrides=""
后缀覆盖:去掉整个字符串后面多余的字符
批量插入
<insert id="insertmanyitem" > INSERT INTO student (name,id, gender,addr,c_id) VALUES <foreach collection="students" item="stu" separator=","> (#{stu.name},#{stu.id},#{stu.stuGender},#{stu.addr},#{stu.college.id}) </foreach> </insert> <!--这个就是使用多条查询--> <insert id="insertmanyitem02"> <foreach collection="students" separator=";" item="stu"> INSERT INTO student <include refid="tableItem"/> VALUES (#{stu.name},#{stu.id},#{stu.stuGender},#{stu.addr},#{stu.college.id}) </foreach> </insert>
内置参数
两个内置参数: 不只是方法传递过来的参数可以被用来判断,取值。。。 mybatis默认还有两个内置参数: _parameter:代表整个参数 单个参数:_parameter就是这个参数 多个参数:参数会被封装为一个map;_parameter就是代表这个map _databaseId:如果配置了databaseIdProvider标签。 _databaseId就是代表当前数据库的别名oracle
<select id="testInnerPara" resultType="entity.stu"> <if test="_databaseId=='mysql'"> SELECT * FROM student <if test="_parameter!=null"> WHERE id=#{_parameter.id} </if> </if> <if test="_databaseId=='oracle'"> SELECT * FROM student123 WHERE id=#{_parameter.id} </if> </select>
抽取可重用的sql片段。方便后面引用
1、sql抽取:经常将要查询的列名,或者插入用的列名抽取出来方便引用
2、include来引用已经抽取的sql:
3、include还可以自定义一些property,sql标签内部就能使用自定义的属性
include-property:取值的正确方式${prop},
#{不能使用这种方式}
<sql id="tableItem"> (name,id, gender,addr,c_id) </sql>