zoukankan      html  css  js  c++  java
  • 【java框架】MyBatis(2)--Mapper代理接口及批量操作

    1.   Mapper映射代理接口

    MyBatis基于代理机制,可以让我们无需在编写Dao层的接口,我们可以把以前的Dao层的IXxxDao接口直接定义成符合规则的Mapper接口。

    具体实现步骤如下:

    ①    在项目mapper文件目录下创建对应的Mapper接口,接口命令必须是以Mapper结尾,名字是Domain类名+Mapper;

    ②    在项目mapper文件的同级目录下创建Domain类名+Mapper.xml文件,注意必须与Mapper接口建立关系,通过namespace要能找到mapper接口;

    ③    在DomainMapper.xml文件中编写sql语句,注意各个sql语句的id要和DomainMapper接口中的方法名一致,返回值、参数类型也要一致;

     

    ④    编写测试Junit类,可以看到对应的Mapper接口已经变成了一个代理,对应的数据通过代理mapper接口获取;

    2.   MyBatis的批量操作(添加、删除)

    2.1.批量添加

    批量添加首先构造一个对应批量处理添加的sql语句:

    Insert into user(username, password) values (?, ?), (?, ?), (?, ?)

    根据这个结构我们需要对应编写接口与.xml中配置Sql语句,这里需要使用到<foreach>标签。

    UserMapper接口:

    public interface UserMapper {
        void insertBatch(List<User> userList);
    }

    UserMapper.xml配置:

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!-- namespace:这里使用Mapper映射代理接口,namespace对应mapper接口文件 -->
    <mapper namespace="cn.yif.mybatis.mapper.UserMapper">
       <!--测试批量添加user,需要构造批量添加SQL-->
       <insert id="insertBatch" parameterType="java.util.List">
            insert into user(username, password) values
           <foreach collection="list" index="index" item="user" separator=",">
                (#{user.name}, #{user.pwd})
           </foreach>
       </insert>
    </mapper>

    编写测试类:

    public class UserMapperTest {
       @Test
       public void insertBatch(){
           SqlSession sqlSession = MyBatisUtil.getSqlSession();
           UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
           List<User> userList = new ArrayList<>();
           userList.add(new User("李军", "4523"));
           userList.add(new User("吴华", "3257"));
           userList.add(new User("王慧", "5200"));
           userMapper.insertBatch(userList);
           //注意:使用Mapper接口代理对象时必须提交SqlSession,即必须调用commit方法,否则添加数据无法同步到数据库
           sqlSession.commit();
           sqlSession.close();
       }
    }

    2.2.批量删除

    首先构造一个批量删除的Sql语句:

    delete from user where id in (?, ?, ?, ?)

    同样需要在UserMappper.xml中配置批量删除的Sql语句,如下:

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!-- namespace:这里使用Mapper映射代理接口,namespace对应mapper接口文件 -->
    <mapper namespace="cn.yif.mybatis.mapper.UserMapper">
       <!--测试批量删除user-->
       <!--delete from user where id in (25, 26, 27, 29)-->
       <delete id="deleteBatch" parameterType="java.util.List">
           delete from user where id in
           <foreach collection="list" index="index" item="id" open="(" separator="," close=")">
                #{id}
           </foreach>
       </delete>
    </mapper>

    对应UserMapper接口中添加批量删除接口方法:

    public interface UserMapper {
        void deleteBatch(List<Integer> idLst);
    }

    编写对应测试类:

    public class UserMapperTest {
       @Test
       public void deleteBatch(){
           SqlSession sqlSession = MyBatisUtil.getSqlSession();
           UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
           List<Integer> idsLst = new ArrayList();
           idsLst.add(16);
           idsLst.add(17);
           idsLst.add(18);
           userMapper.deleteBatch(idsLst);
           //注意:使用Mapper接口代理对象时必须提交SqlSession,即必须调用commit方法,否则删除数据无法同步到数据库
           sqlSession.commit();
           sqlSession.close();
       }
    }

    2.3.<foreach>标签属性介绍

    在批量删除与批量添加配置Sql中都使用到了<foreach>标签,这里说明一下foreach标签中的属性:collection、item、separator、index、open、close。

    1.collection:指定要遍历的集合。表示传入过来的参数的数据类型。该属性是必须要指定的,要做foreach的对象。在使用foreach的时候最关键最容易出错的就是collection属性。在不同情况下,该属性的值是不一样的,主要有以下3种情况:

       a.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list;

       b.如果传入的是单参数且参数类型是一个array数组的时候,collection属性值为array;

       c.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成Map。Map对象没有默认的键。

    2.item:表示集合中每一个元素进行迭代时的别名。将当前遍历出的元素赋值给指定的变量,然后用#{变量名},就能取出变量的值,也就是当前遍历出的元素。

    3.  separator:表示在每次进行迭代之间以什么符号作为分隔符。Select * from table where id in (1, 2, 3),相当于1,2,3之间的”,”。

    4.  index:索引。Index指定一个名字,用于表示在迭代过程中,每次迭代到的位置。遍历list的时候index就是索引,遍历map的时候index表示的就是map的key,item就是map的值。

    5.  open表示该语句以什么开始,close表示以什么结束。

    以上具体参数属性说明参考:http://www.imooc.com/article/details/id/284701

  • 相关阅读:
    js 线程机制与事件处理机制
    js 对象高级
    js 函数高级
    js 基础总结
    JSON
    js BOM
    js DOM
    正则表达式
    splice()、push()、pop()、unshift()、pop()、reverse()等数组响应式方法
    Centos下执行make时出现mysql.h: No such file or directory
  • 原文地址:https://www.cnblogs.com/yif0118/p/12548587.html
Copyright © 2011-2022 走看看