什么是动态SQL?
MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接成完整的SQL之后再执行,以达到SQL复用、简化编程的效果。
If标签
接口代码
public interface UserMapper {
List<User> findAll(User user);
}
配置文件
<select id="findAll" parameterType="user" resultType="user">
SELECT * FROM user WHERE 1=1
<if test="id != null">
AND id=#{id}
</if>
<if test="username!=null and username!=''">
AND username=#{username}
</if>
<if test="birthday != null">
AND birthday=#{birthday}
</if>
<if test="sex!=null and sex!=''">
AND sex=#{sex}
</if>
</select>
注意:这里的sql语句where后面加上’1=1’是为了防止没有输入任何查询条件而报错
where标签
where标签大致和if标签差不多,但是where标签解决了sql语句里面的1=1条件
<select id="findAll" parameterType="user" resultType="user">
SELECT * FROM user
<!--where标签将if标签代码块包起来,并去掉开头 “AND” 或 “OR”-->
<where>
<if test="id != null">
AND id=#{id}
</if>
<if test="username!=null and username!=''">
AND username=#{username}
</if>
<if test="birthday != null">
AND birthday=#{birthday}
</if>
<if test="sex!=null and sex!=''">
AND sex=#{sex}
</if>
</where>
</select>
set标签
set标签用于动态包含需要更新的列,并会删掉额外的逗号
接口
public interface UserMapper {
void updateUserById(User user);
}
配置文件
<update id="updateUserById" parameterType="user">
UPDATE user
<!--set标签将if标签代码块包起来,并去掉最后一个“,”-->
<set>
<if test="username!=null and username != '' ">
username=#{username},
</if>
<if test="birthday!=null">
birthday=#{birthday},
</if>
<if test="sex!=null and sex != '' ">
sex=#{sex},
</if>
<if test="address!=null and address != '' ">
address=#{address},
</if>
</set>
WHERE id=#{id}
</update>
测试代码
@Test
public void testUpdateUserById(){
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User userParam = new User();
userParam.setId(50);
userParam.setUsername("张三丰");
//userParam.setSex("男");
//userParam.setBirthday(new Date());
userMapper.updateUserById(userParam);
sqlSession.commit();//这一行代码如果不加上就不会修改数据库中的数据
}
该之前
改之后