1.什么是动态sql?
1.是指sql的内容是变化的,可以根据不同的条件获取到不同的sql语句
2.主要是where之后的部分发生变化
3.动态sql的实现一半使用的是mybatis提供的标签
2.动态sql的优点是什么?
1.动态SQL提供了强大的扩展功能,能够应付复杂的需求,即使在需求增加时也能应对,并且不会因为需求的增加而导致代码的线性增长
2.使用sp_executesql执行计划可以缓存查询字符串,意味着大部分查询条件可以重用执行计划缓存而不会导致不必要的重编译
3.动态sql的缺点是什么?
1.动态SQL是用于应对较高级的问题,对于简单问题,会变得大材小用
2.测试困难
3.动态SQL的计划缓存并不总是你想象的那样,有时候因为输入的参数值而导致不同的计划生成
4.动态sql的常用标签
(1)select 标签:
id:唯一的标识符
parameterType:传给此语句的参数的全路径名或别名 例:com.xinhua.domain.User 或 User
resultType :语句返回值类型或别名.注意.如果是集合,那么这里填写的是集合的泛型,而不是集合本身(resultType 与 resultMap 不能并用)
<select id="findAll" parameterType="int" resultType="com.xinhua.domain.Teacher">
select * from teacher
</select>
(2)insert 标签
id :唯一的标识符
parameterType:传给此语句的参数的全路径名或别名 例:com.xinhua.domain.User
<insert id="InsertUser" parameterType="com.xinhua.domain.Teacher">
<selectKey resultType="int" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
insert into teacher(id,name,gender,age) values (#{id},#{name},#{gender},#{age})
</insert>
(3)delete 标签
id :唯一的标识符
parameterType:传给此语句的参数的全路径名或别名 例:com.xinhua.domain.User
<delete id="deleteUserById" parameterType="int">
delete from teacher where id=#{id}
</delete>
(4)update 标签
id :唯一的标识符
parameterType:传给此语句的参数的全路径名或别名 例:com.xinhua.domain.User
<update id="updateUser" parameterType="com.xinhua.domain.Teacher">
update teacher set name=#{name},gender=#{gender},age=#{age} where id=#{id}
</update>
5.动态sql拼接
(1)if 标签
if 标签通常用于 where语句、update语句、insert语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值.
<if test="name != null and name != ''">
and NAME = #{name}
</if>
(2)foreach 标签
foreach 标签主要用于构建 in 条件,可在 sql 中对集合进行迭代.也常用到批量删除、添加等操作中.
<select id="selectIn" resultMap="BaseResultMap">
select name,hobby from student where id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>