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