首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

MyBatis3_轻巧入门_4

2013-11-09 
MyBatis3_轻松入门_4select id,username,password from t_user where username#{username} and password

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

?

?

?

?

?

热点排行