动态sql

简介: 动态sql:             以前的sql如果你有3列数据,你要修改数据、那你就要写修改的第一列的,一二列的,一二三列的,这样操作很麻烦。              但是如果你用sql预处理的话他就会根据你输入你对象,来判断你要修改的参数,让sql变得很灵活。
动态sql:

             以前的sql如果你有3列数据,你要修改数据、那你就要写修改的第一列的,一二列的,一二三列的,这样操作很麻烦。

             但是如果你用sql预处理的话他就会根据你输入你对象,来判断你要修改的参数,让sql变得很灵活。


注意事项!!

                  封装属性的时候 有一定不能用基本数据类型 要用封装数据类型

                  基本数据类型没有赋值的时候是零

                  封装数据类型 没有赋值的时候是null


if:
    test  条件,可以取属性值或者参数 可以用and加入多个判断


set:

      update生成的,可以生成 set 关键字 还有就是去除最后逗号


    <update id="updKc" parameterType="com.dao.kecheng">
--       动态sql好处让sql变得灵活,修改他可以进行判断,根据你传入的对象的参数来判断你要修改的值
        update kecheng
        <set>
--            这里用《set》可以帮助你自动去除 逗号多参数是就有好处
            <if test="kname!=null">
                kname=#{kname},
            </if>
        </set>
        where kid=#{kid}
--   这里要注意的是动态sql的值都是键值对,对象参数对应数据库的的的参数
    </update>


trim:

         去除或添加

         suffixOverrides  末尾去除符号(如果你声明的话,他就会你最后的值后面加个,例如(name,)无法识别sql语句)

         suffix  末尾添加符号

         prefix  前面添加符号

         prefixOverrides 前面去除符号



   <insert id="inster" parameterType="com.dao.Student">
        insert into student(
        <trim suffixOverrides=",">
--             这里要注意取出末尾逗号,不取出的话如果你在插入时,如果你插入一个值不去除逗号他就会默认你后面还要插入会报sql语法错误
            <if test="address!=null">
                address,
            </if>
            <if test="sname!=null">
                sname,
            </if>
            <if test="cid">
                cid,
            </if>
        </trim>
        )values(
--         还要注意这些都是在括号中执行的
        <trim suffixOverrides=",">
            <if test="address!=null">
                #{address},
            </if>
            <if test="sname!=null">
              #{sname},
            </if>
            <if test="cid">
                #{cid},
            </if>
        </trim>
        )
    </insert>

查询动态sql查询可以根据你选择的条件进行查询


   List<Student> seleStu(String sname,String address,Integer cid,Integer sid); //这里可以根据你输入的值来判断你要查询的值,
不选择输入null就可以这里要注意要用封装数据类型,
因为基本数据类型不为空,为0


    <select id="seleStu" resultType="com.dao.Student">
        select * from student
        <where>
            <trim suffixOverrides="and">
                <if test="param1!=null">
--                     根据你所输入的参数来决定你要查询的条件
                    sname=#{param1}and
                </if>
                <if test="param2!=null">
                    address=#{param2}and
                </if>
                <if test="param3!=null">
                    cid=#{param3}and
                </if>
                <if test="param4!=null">
                    sid=#{param4}
                </if>
            </trim>
        </where>
--         这里是查询玩排序按降序
        ORDER BY sid DESC
    </select>


如果上面动态查询中发生: Parameter 'uid' not found. Available parameters are [arg3, arg2, param5, arg5, arg1, arg0, param3, ] 错误

可以试试下面写法

and写前面<where>标记会自动去除and

 <select id="sleuse" resultType="com.sun.sm.Dao.Urers">
        SELECT*FROM urers
        <where>
            <if test="uid !=null">
                uid=#{arg0}
            </if>
            <if test="arg1 !=null">
                and username=#{arg1}
            </if>
            <if test="arg2 !=null">
                and password=#{arg2}
            </if>
            <if test="arg3 !=null">
                and jine=#{arg3}
            </if>
            <if test="arg4 !=null">
                and logerror=#{arg4}
            </if>
            <if test="arg5 !=null">
                and utype=#{arg5}
            </if>
        </where>
    </select>

查询语句 根据你的输出选择要输出的条件



    <select id="selectStudentRowSumByLike" parameterType="java.lang.String" resultType="java.lang.Integer">
        select count(*) from student where
        <choose>
            <when test="param1 == 'sname'">
                sname
            </when>
            <when test="param1 == 'address'">
                address
            </when>
            <when test="param1 == 'email'">
                email
            </when>
            <when test="param1 == 'phone'">
                phone
            </when>
        </choose>
        like #{param2}
    </select>

动态查询


    <select id="selectOrderAllByUseridLimit" resultMap="BaseResultMap">       
	   SELECT * FROM os_order
        WHERE userid=#{param1} 
      <choose>
        <when test="param5==null">  判断这个条件成立就进这里 
          AND createtime >= #{param2}
          AND createtime <= #{param3}
          <if test="param4!='ALL'"> 判断这个条件成立就进这里
            AND orderstate = #{param4}
          </if>
        </when>
        <otherwise>  条件不成立就进这里 用这个条件
          AND orderid=#{param5}
        </otherwise>
      </choose>
        ORDER BY createtime DESC LIMIT #{param6},#{param7}
    </select>



目录
相关文章
|
7月前
|
SQL Java 编译器
SQL 语言:嵌入式 SQL 和动态 SQL
SQL 语言:嵌入式 SQL 和动态 SQL
125 4
|
8月前
|
SQL Java 关系型数据库
Mybatis多表关联查询与动态SQL(下)
Mybatis多表关联查询与动态SQL
150 0
|
8月前
|
SQL Java 数据库连接
Mybatis多表关联查询与动态SQL(上)
Mybatis多表关联查询与动态SQL
244 0
|
6月前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
124 7
|
7月前
|
SQL XML 数据库
后端数据库开发高级之通过在xml文件中映射实现动态SQL
后端数据库开发高级之通过在xml文件中映射实现动态SQL
71 3
|
7月前
|
SQL XML Java
MyBatis第四课动态SQL
MyBatis第四课动态SQL
|
7月前
|
SQL XML Java
Mybatis进阶——动态SQL(1)
Mybatis进阶——动态SQL(1)
53 3
|
7月前
|
SQL 存储 关系型数据库
17. Mysql 动态SQL
17. Mysql 动态SQL
120 1
|
7月前
|
SQL 缓存 Java
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
|
7月前
|
SQL Java 数据库连接
MyBatis动态SQL
MyBatis动态SQL
74 0