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.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
















