zoukankan      html  css  js  c++  java
  • 动态SQL2

    set标签

        存放修改方法,我们之前写的更新方法是全字段的更新,或者是指定字段的更新,现在我想实现一个新功能,传入的Employee包含什么字段,数据库就更新相对应的列值:

    如果我们啥也不做直接上<if>标签看看会发生什么

    1. <update id="updateEmp">  
    2.     update tb_employee set  
    3.     <if test="lastName!=null">  
    4.         last_name = #{lastName},  
    5.     </if>  
    6.     <if test="email!=null">  
    7.         email=#{email},  
    8.     </if>  
    9.     <if test="gender!=null">  
    10.         gender=#{gender}  
    11.     </if>  
    12.     where id=#{id}  
    13. </update> 
    1. @Test  
    2. public void testGetEmpsByConditionIf() throws IOException {  
    3.     SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();  
    4.     SqlSession openSession = sqlSessionFactory.openSession(true);  
    5.     try {  
    6.         EmployeeMapperDynamic mapper = openSession.getMapper(EmployeeMapperDynamic.class);  
    7.         Employee e = new Employee();  
    8.         e.setId(5);  
    9.         e.setLastName("王大锤");  
    10.         mapper.updateEmp(e);  
    11.     }finally {  
    12.             
    13.         openSession.close();  
    14.     }  
    15. }  

    DEBUG [main] - ==> Preparing: update tb_employee set last_name = ?, where id=?

    出错原因很明显,多出了个逗号,接下来将这些<if>标签套在<set>再做尝试

    1. <update id="updateEmp">  
    2.     update tb_employee  
    3.     <set>  
    4.         <if test="lastName!=null">  
    5.             last_name = #{lastName},  
    6.         </if>  
    7.         <if test="email!=null">  
    8.             email=#{email},  
    9.         </if>  
    10.         <if test="gender!=null">  
    11.             gender=#{gender}  
    12.         </if>  
    13.     </set>  
    14.     where id=#{id}  
    15. </update>  

    发现成功,同样的我们也可以用<trim>标签实现

    1. <update id="updateEmp">  
    2.     update tb_employee  
    3.     <trim prefix="set" suffixOverrides=",">  
    4.         <if test="lastName!=null">  
    5.             last_name = #{lastName},  
    6.         </if>  
    7.         <if test="email!=null">  
    8.             email=#{email},  
    9.         </if>  
    10.         <if test="gender!=null">  
    11.             gender=#{gender}  
    12.         </if>  
    13.     </trim>  
    14.     where id=#{id}  
    15. </update>  

    foreach标签

        <foreach>可以应用于SQL语句中where id in(…….)这种类型的查询。

        <foreach>含有两个属性,一个是collection,指定要遍历的集合,另外一个是item,即将当前遍历的元素赋给指定的变量,接下来我们使用#{变量名}就可以取出变量的值,也就是当前遍历出的元素,

    1. <select id="getEmpsByConditionForeach" resultType="com.figsprite.bean.Employee">  
    2.     select * from tb_employee where id in (  
    3.     <foreach collection="ids" item="item_id" separator="," >  
    4.         #{item_id}  
    5.     </foreach>  
    6.     )  
    7. </select>

    属性separate指定元素之间的分隔符,当然上面的写法有些不美观()中套着很多东西,不方便查看,因此,我们再使用两个其他属性,让编码更加美观:

    1. <select id="getEmpsByConditionForeach" resultType="com.figsprite.bean.Employee">  
    2.     select * from tb_employee    
    3.     <foreach collection="ids" item="item_id" separator="," open=" where id in (" close=")">  
    4.         #{item_id}  
    5.     </foreach>  
    6. </select>  

    注意括号不要写成中文的,不然这里的括号很难看出中英文差别。

    还有一个属性index ,当遍历list时,它代表索引,当遍历map是,它就成了key

    List<Employee> getEmpsByConditionForeach(@Param("ids") List<Integer> ids);

    1. @Test  
    2. public void testGetEmpsByCondition() throws IOException {  
    3.     SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();  
    4.     SqlSession openSession = sqlSessionFactory.openSession(true);  
    5.     try {  
    6.         EmployeeMapperDynamic mapper = openSession.getMapper(EmployeeMapperDynamic.class);  
    7.     
    8.         List<Employee> list = mapper.getEmpsByConditionForeach(Arrays.asList(6,7));  
    9.         for (Employee emp : list) {  
    10.             System.out.println(emp);  
    11.         }  
    12.     }finally {  
    13.     
    14.         openSession.close();  
    15.     }  
    16. }  

    DEBUG [main] - ==> Preparing: select * from tb_employee where id in ( ? , ? )

    DEBUG [main] - ==> Parameters: 6(Integer), 7(Integer)

    DEBUG [main] - <== Total: 2

    Employee{id=6, lastName='吴花琴', gender='0', email='qweqwe', department=null}

    Employee{id=7, lastName='吴小明', gender='1', email='wewqewq', department=null}

    <foreach>标签 批量保存

        在MYSQL中,我们如果想批量插入就要用到以下方式的SQL语句:

    1. INSERT INTO tb_employee(last_name,email,gender,d_id) VALUES('tom','sdasdasd@gmail.com','0',1),  
    2. ('jerry','asdasd@qq.com','0',1);  

    同样我们可以通过<foreach>来实现这个功能

    void addEmps(@Param("emps") List<Employee> emps);
    
    1. <insert id="addEmps">  
    2.     INSERT INTO tb_employee(last_name,email,gender,d_id) VALUES  
    3.     <foreach collection="emps" item="emp" separator=",">  
    4.         (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id})  
    5.     </foreach>  
    6. </insert> 
    1. @Test  
    2. public void TestSaveBach() throws IOException {  
    3.     SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();  
    4.     SqlSession openSession = sqlSessionFactory.openSession(true);  
    5.     Department department = new Department(2);  
    6.     Employee e1 = new Employee("Wendy","0","adcxs@qq.com",department);  
    7.     Employee e2 = new Employee("Diyago","1","aaasaadccjdjj@qq.con",department);  
    8.     List<Employee> employeeList = new ArrayList<>();  
    9.     employeeList.add(e1);  
    10.     employeeList.add(e2);  
    11.     try{  
    12.         EmployeeMapperDynamic mapper = openSession.getMapper(EmployeeMapperDynamic.class);  
    13.         mapper.addEmps(employeeList);  
    14.     }finally {  
    15.         openSession.close();  
    16.     }  
    17. }

    DEBUG [main] - ==> Preparing: INSERT INTO tb_employee(last_name,email,gender,d_id) VALUES (?,?,?,?) , (?,?,?,?)

    MySQl支持这种VALUES ( ),( ),( ),还可以这么写:

        每次取出一个员工,就插入

    1. <insert id="addEmps">  
    2.     
    3.     <foreach collection="emps" item="emp" separator=";">  
    4.         INSERT INTO tb_employee(last_name,email,gender,d_id) VALUES  
    5.         (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id})  
    6.     </foreach>  
    7. </insert>  

    发现出错了,主要原因JDBC链接属性不能支持多SQL语句用;分开的形式,我们需要将这个选项开启,其中有一个allowMultiQueries,我们只要把它的值改成true即可,

    jdbc.url=jdbc:mysql://localhost:3306/mybatis_learn?allowMultiQueries=true

    ,再去尝试,发现就可以了,这种方式也可以用于批量修改和删除,十分方便

  • 相关阅读:
    转物理老师的说说,过好自己的生活,别人的梦幻生活背后也有你看不见的无奈
    第一、二、三、BC范式的学习总结
    一位毕业四年的前辈的经历
    普里姆算法,克鲁斯卡尔算法,迪杰斯特拉算法,弗洛里德算法
    从零开始构建JavaScript框架4——DOM遍历2
    从零开始构建JavaScript框架3——DOM遍历1
    从零开始构建JavaScript框架2——总体结构以及元素的获取和创建
    从零开始构建JavaScript框架1——为何JavaScript开发需要框架
    从浏览器输入URL到页面加载完成到底发生了什么?
    第5课 C语言指针深入1
  • 原文地址:https://www.cnblogs.com/figsprite/p/10746833.html
Copyright © 2011-2022 走看看