文章目录
<if test="">
test
中填写的是判断条件UserMapper.java
中添加抽象方法实体类对象
作为方法参数即可/**
* 更新数据,比如密码或者年龄
* @param user User对象,其中封装了用户密码或者用户的年龄
* @return 受影响的行数,成功返回1,否则返回0
*/
Integer update(User user);
UserMapper.xml
中配置<update>
节点sql
语句将会少了一个逗号,
<update id="update" parameterType="cn.tedu.spring.entity.User">
update user
set
<if test="password!=null">
password=#{password}
</if>
<if test="age!=null">
age=#{age}
</if>
where id=#{id}
</update>
age
,因此只需要在新建的User
对象中添加age
的值即可,那么此时password
的值不能设置id
的值@Test
public void testUpdate() {
//加载Spring的配置文件
AbstractApplicationContext ac
= new ClassPathXmlApplicationContext(
"spring-mvc.xml",
"spring-dao.xml");
//获取UserMapper的bean,这个是spring通过扫描mapper.xml文件自动为mybatis自动创建的,首字母小写
UserMapper userMapper
= ac.getBean(
"userMapper", UserMapper.class);
//新建一个User对象
User user=new User();
user.setId(3); //设置id
user.setAge(33); //设置年龄
int affectRows=userMapper.update(user);
System.out.println(affectRows);
ac.close();
}
UserMpper.java
中添加接口方法/**
* 查找用户信息,根据用户名或者用户id查询
* @param user User对象,其中封装了用户名或者用户id
* @return 用户对象
*/
User findUser(User user);
UserMapper.xml
中配置<!--
User findUser(User user);
不能同时查询,缺少连接符号 and or
-->
<select id="findUser" parameterType="cn.tedu.spring.entity.User" resultType="cn.tedu.spring.entity.User">
select * from user
where
<if test="id!=null">
id=#{id}
</if>
<if test="username!=null">
username=#{username}
</if>
</select>
@Test
public void testFind() {
//加载Spring的配置文件
AbstractApplicationContext ac
= new ClassPathXmlApplicationContext(
"spring-mvc.xml",
"spring-dao.xml");
//获取UserMapper的bean,这个是spring通过扫描mapper.xml文件自动为mybatis自动创建的,首字母小写
UserMapper userMapper
= ac.getBean(
"userMapper", UserMapper.class);
//新建一个User对象
User user=new User();
user.setId(3); //设置id
//根据id查找
System.out.println(userMapper.findUser(user));
ac.close();
}
switch
,通常与when
搭配使用<select>
select * from user where
<choose>
<when test="password!=null">
password=#{password}
</when>
<otherwise>
id=#{id}
</otherwise>
</choose>
</select>
<select id="findUser" parameterType="cn.tedu.spring.entity.User" resultType="cn.tedu.spring.entity.User" >
select * from user
where
<if test="password!=null">
password=#{password}
</if>
<if test="username!=null">
and username=#{username}
</if>
</select>
User
对象中只是设置了username
的值,那么此时的sql语句将会变成select * from user where and username=#{username}
,很明显多了一个and
<where>
标签主要是用于简化where
子句的编写,<where>
可以替代sql语句中的where
,而且还可以将后面多余的and
或者or
去掉select 字段 from 表名
<where>
.....
</where>
<where>
标签解决上面的问题<select id="findUser" parameterType="cn.tedu.spring.entity.User" resultType="cn.tedu.spring.entity.User" >
select * from user
<where>
<if test="password!=null">
and password=#{password}
</if>
<if test="username!=null">
and username=#{username}
</if>
</where>
</select>
User
对象中只是设置了一个username
的值,那么会去掉前面的and
关键字,并且此时的sql语句会变成:select * from user where username=#{username}
<update id="update" parameterType="cn.tedu.spring.entity.User">
update user
set
<if test="password!=null">
password=#{password},
</if>
<if test="age!=null">
age=#{age},
</if>
<if test="username!=null">
username=#{username}
</if>
where id=#{id}
</update>
<update>
中可以看出,如果我们在User
对象中没有设置password,age,username
的值,那么构建出来的sql语句变成了update user set where id=#{id}
,很明显是一个错误的语句。User
对象中值设置了password
的值,那么这里的sql语句变成了update user set password=#{password}, where id=#{id}
,很明显,这个sql多了一个逗号<set>
,可以在<set>
元素所在位置输出一个set
关键字,而且可以去除内容结尾中无关的逗号
,有了<set>
元素,那么我们可以动态的修改字段update table_name
<set>
......
</set>
<update id="update" parameterType="cn.tedu.spring.entity.User">
update user
<set>
<if test="password!=null">
password=#{password},
</if>
<if test="age!=null">
age=#{age},
</if>
<if test="username!=null">
username=#{username}
</if>
</set>
where id=#{id}
</update>
/**
* 根据id删除购物车中的商品
* @param ids
*/
void deleteCartById(@Param("ids")Integer[] ids);
<!--
void deleteCartById(@Param("ids")Integer[] ids);
批量删除
-->
<delete id="deleteCartById" parameterType="java.lang.Integer">
delete from t_cart
where
id in
<!--
遍历数组ids
collection:需要遍历的数组
item: 数组中的每一个值
open : 开始的内容
close: 结束的内容
separator :每个元素的分割符
最后拼接的就是 (id,id,id,id,id)
-->
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
SQL
语句的编程,但是,使用动态SQL的原则应该是希望代码复用,而不是编程,更不要用动态sql解决业务方法的问题