MyBatis3_轻松入门_4
select id,username,password from t_user where username=#{username} and password=#{password}
? 传参的代码如下:
User user=new User();user.setUsername("tom");user.setPassword("000000");userMapper.findByUsernameAndPassword(user);
?
?这样就可以实现多条件查询了,但是如果我们传给方法的user没有设置password,即:
User user=new User();user.setUsername("tom");userMapper.findByUsernameAndPassword(user);
?
这样会报错的!!!
这时我们可以MyBatis提供的动态查询:
上面的问题可以使用if条件查询进行解决!
在UserMapper.xml将方法的配置修改如下:
<select id="findByUsernamePassword" parameterType="User" resultType="User">select id,username,password from t_user where username=#{username} <!--如果password!=null,查询条件加一条,否则只有username=*--><if test="password!=null">and password=#{password}</if></select>
?
?这样就可以实现if动态查询了!!
你可以使用多个If进行条件的过滤,但是看起来挺怪的,我们介绍下面的:choose(where,otherwise)
<select id="findByUsernamePassword" parameterType="User" resultType="User">select id,<!--当password!=null时,选择id,username,password,否则选择id,username--><choose><when test="password!=null"> username,password </when><otherwise>username </otherwise></choose>from t_user where username=#{username} <if test="password!=null">and password=#{password}</if></select>
?
?对于下面这种情况,当两个 If 条件都不符合时,剩下一个where怎么办呢?肯定是错的!
<select id="findByUsernamePassword" parameterType="User" resultType="User">select id,<choose><when test="password!=null"> username,password </when><otherwise>username </otherwise></choose>from t_user where <!-- 若下面的都不成立,上面的where就是多余的,SQL就是错误的 --><if test="username!=null">username=#{username} </if><if test="password!=null">and password=#{password}</if></select>
?
?我们使用where标签进行条件的封装,如果一个都不成立,则就没有where否则自动添加where。
<select id="findByUsernamePassword" parameterType="User" resultType="User">select id,<choose><when test="password!=null"> username,password </when><otherwise>username </otherwise></choose>from t_user <where> <!-- 若下面的都不成立,就不会出现where--><if test="username!=null"> username=#{username} </if><if test="password!=null">and password=#{password}</if></where></select>
?
?使用trim可以实现跟where相同的效果:
<select id="findByUsernamePassword" parameterType="User" resultType="User">select id,<choose><when test="password!=null"> username,password </when><otherwise>username </otherwise></choose>from t_user <trim prefix="WHERE" prefixOverrides="AND |OR "><!-- 若下面的都不成立,就不会出现where--><if test="username!=null"> username=#{username} </if><if test="password!=null">and password=#{password}</if></trim></select>
?
?注意:
条件修改后的返回数据是多个还是单个,要注意修改其resultType
对于我们要修改某一记录时,我们使用set来实现对数据的修改:
<update id="edit" parameterType="User">update t_user <set><if test="username!=null">username=#{username},</if><if test="password!=null">password=#{password} </if></set>where id=#{id}</update>
?
?同样可以使用trim来替换set:
<update id="edit" parameterType="User">update t_user <trim prefix="SET" suffixOverrides=","><if test="username!=null">username=#{username},</if><if test="password!=null">password=#{password} </if></trim>where id=#{id}</update>
?
?对于:where?**?in ()查询,我们使用foreach:
<select id="findUserIn" resultType="User" parameterType="List">select id,username,password from t_user where id in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select>
?
?list指示这里的参数需要的是一个List
item表示每一项
open,separator,close表示Item们包裹在 () 中,并以 , 分隔!!!
?测试:
UserMapper userMapper=session.getMapper(UserMapper.class);List<Integer> l=new ArrayList<Integer>();l.add(1);l.add(2);List<User> userList=userMapper.findUserIn(l);System.out.println(userList.size());//2
?
?
?
?
?