二 mybatis 动态sql

动态sql应用

 一 、什么是动态sql

1、where条件  动态查询

根据姓名或年龄或地址查询

UserMapper.xml
1
<select id="findUser" parameterType="cn.itcast.pojo.User" resultType="cn.itcast.pojo.User"> 2 select * from user <where> 3 <if test="name != null"> 4 name like '%${name}%' 5 </if> 6 <if test="age != null"> 7 and age=#{age} 8 </if> 9 <if test="address != null"> 10 and address like '%${address}%' 11 </if> 12 </where> 13 </select>

上面配置可以 把where条件抽取出来,如下面配置:

UserMapper.xml
1
<sql id="query_where"> 2 <where> <if test="name != null">name like '%${name}%'</if> 3 <if test="age != null">and age=#{age}</if> 4 <if test="address != null">and address like '%${address}%'</if> 5 </where> 6 </sql> 7 <select id="countUser" parameterType="cn.itcast.pojo.User" resultType="int"> 8 select count(*) from user 9 <include refid="query_where"/> 10 </select>

 

测试

 1  @Test
 2     public void findUser(){
 3         
 4         User u = new User();
 5         //u.setName("zhao");
 6         u.setAge(25);
 7         List<User> list = sqlSession. selectList("cn.itcast.dao.UserMapper.findUser“,u);
 8     
 9         for(User ur : list){
10             System.out.println(ur);
11         }
12     }

2、update Table set 动态更新

 

UserMapper.xml
1
<update id="updateUser2" parameterType="cn.itcast.pojo.User"> 2 update user 3 <set> 4 <if test="name != null">name=#{name},</if> 5 <if test="age != null">age=#{age},</if> 6 <if test="address != null">address=#{address}</if> 7 </set> where id=#{id} 8 </update>

 二 动态sql片段

sql判断

1 UserMapper.xml
2 <sql id="query_where">
3     <where> <if test="name != null">name like '%${name}%'</if>
4         <if test="age != null">and age=#{age}</if>
5         <if test="address != null">and address like '%${address}%'</if>
6         </where>
7     </sql>

 

引用 <include refid="query_where"/>

<select id="countUser" parameterType="cn.itcast.pojo.User" resultType="int">
select count(*) from user 
<include refid="query_where"/>
</select>

 

 

 三 foreach

  向sql传递数组或List,mybatis使用foreach解析

 

1.1.1     需求

在用户查询列表和查询总数的statement中增加多个id输入查询。

 

sql语句如下:

两种方法:

 

SELECT * FROM USER WHERE id=1 OR id=10 OR id=16

SELECT * FROM USER WHERE id IN(1,10,16)

 

1.1.2     在输入参数类型中添加List<Integer> ids传入多个id

1 pubilc class UserQueryVo{
2         //传入多个id
3         private List<Integer> ids;

1.1.3     修改mapper.xml

WHERE id=1 OR id=10 OR id=16

 

在查询条件中,查询条件定义成一个sql片段,需要修改sql片段。

 

<!-- 定义sql片段
    id:sql片段的唯 一标识
    
    经验:是基于单表来定义sql片段,这样话这个sql片段可重用性才高
    在sql片段中不要包括 where
     -->
    <sql id="query_user_where">
        <if test="userCustom!=null">
            <if test="userCustom.sex!=null and userCustom.sex!=''">
                and user.sex = #{userCustom.sex}
            </if>
            <if test="userCustom.username!=null and userCustom.username!=''">
                and user.username LIKE '%${userCustom.username}%'
            </if>
            <if test="ids!=null">
            <!-- 使用 foreach遍历传入ids
            collection:指定输入 对象中集合属性
            item:每个遍历生成对象中
            open:开始遍历时拼接的串
            close:结束遍历时拼接的串
            separator:遍历的两个对象中需要拼接的串
             -->
             <!-- 使用实现下边的sql拼接:
              AND (id=1 OR id=10 OR id=16) 
              -->
            <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
                <!-- 每个遍历需要拼接的串 -->
                id=#{user_id}
            </foreach>
            
            <!-- 实现  “ and id IN(1,10,16)”拼接 -->
            <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=",">
                每个遍历需要拼接的串
                #{user_id}
            </foreach> -->
            
            </if>
        </if>
    </sql>

 

1.1.4     测试代码

 

 1 //用户信息的综合 查询
 2     @Test
 3     public void testFindUserList() throws Exception {
 4         
 5         SqlSession sqlSession = sqlSessionFactory.openSession();
 6         
 7         //创建UserMapper对象,mybatis自动生成mapper代理对象
 8         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
 9         
10         //创建包装对象,设置查询条件
11         UserQueryVo userQueryVo = new UserQueryVo();
12         UserCustom userCustom = new UserCustom();
13         //由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中
14 //        userCustom.setSex("1");
15         userCustom.setUsername("小明");
16         //传入多个id
17         List<Integer> ids = new ArrayList<Integer>();
18         ids.add(1);
19         ids.add(10);
20         ids.add(16);
21         //将ids通过userQueryVo传入statement中
22         userQueryVo.setIds(ids);
23         userQueryVo.setUserCustom(userCustom);
24         //调用userMapper的方法
25         
26         List<UserCustom> list = userMapper.findUserList(userQueryVo);
27         
28         System.out.println(list);
29         
30     }

 

1.1.5     另外一个sql的实现:

 

 

转载于:https://www.cnblogs.com/kingxiaozi/p/5990981.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值