动态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>