1.   Mapper映射代理接口

1.1.MyBatis代理开发规范说明

MyBatis框架提供了一种基于代理机制方式实现Dao层的开发,这种开发方式只需要遵循一定的规范,由程序员编写Mapper接口(相当于Dao接口),

MyBatis框架会根据接口创建动态代理对象Proxy,由动态代理对象去调用Mapper.xml中的方法。

Mapper接口开发需要遵循以下规范:

1、Mapper.xml文件中的namespace与mapper接口的全限定名相同

2、Mapper接口方法名和Mapper.xml中定义的每个statement操作的id相同

3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同

4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

 

规范配置对应关系如下图所示:

 

1.2.MyBatis代理开发步骤

MyBatis基于代理机制,可以让我们无需在编写Dao层的接口的实现Impl,我们可以把以前的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

posted on 2020-03-22 21:43  人无名,则可专心练剑  阅读(758)  评论(0编辑  收藏  举报