首先,利用接口绑定好在哪里,举个栗子。
看代码:
传统方法:
//LogMapper.xml文件
//这里的命名空间任意定义
<mapper namespace="a.b.c">
<select id="showAll" resultType="log">
select * from log
</select>
</mapper>
//mybatis中映射配置
//resource为LogMapper.xml文件的路径
<mappers>
<mapper resource="com/ithema/mapper/LogMapper.xml"/>
</mappers>
**
*获取SqlSession
*/
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
/**
* 查询方法 selectList注意参数
* 使用mapper.xml文件中的命名空间+id方法名
*/
List<Log> log = session.selectList("a.b.c.showAll");
for (Log log2 : log) {
System.out.println(log2);
}
运行结果:
下面是接口绑定的实现方式:
//LogMapper.xml文件
//这里的命名空间必须和接口的全限定名一致
<mapper namespace="com.ithema.dao.LogMapper">
<select id="showAll" resultType="log">
select * from log
</select>
</mapper>
//mybatis中映射配置
<mappers>
<mapper resource="com/ithema/mapper/LogMapper.xml"/>
</mappers>
**
*获取SqlSession
*/
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
**
*查询方法实现
*通过反射、接口回调获取logMapper的一个实例
*/
LogMapper logMapper = session.getMapper(LogMapper.class);
List<Log> list = logMapper.showAll();
if(list==null) System.out.println("无查询结果");
else System.out.println("查询结果为:");
for (Log log : list) {
System.out.println(log);
}
结果相同。
通过上面的代码,可以了解到,
一、如果使用接口绑定技术,那么就要保证mapper.xml中的namespace、id与接口的全限定名和方法名保持一致,不可以像之前传统方法那样可以任意定义namespace与id的值。
二、接口绑定,可以利用反射机制获取一个接口的实例对象(接口回调),通过该实例对象可以直接调用方法,简单方便,省去了要在调用方法 List<Log> log = session.selectList("a.b.c.showAll");的过程中参数的书写。
注:关于很多接口绑定的代码中,都是将接口与mapp.xml文件放在一个文件夹下,然后在mybatis的<mappers>映射中使用<package name="所在包路径">进行关联;实际上,就算不在同一个文件夹下也是可以的,只要保证接口的全限定名与mapper.xml的namespace和id一致即可。
以上概括了接口绑定如何使用,其实接口绑定最大的优势就是多参数传递。例如,我们要实现要通过转账用户与收款账户两个参数,来查询整条转账记录,传统方法就是建立一个map通过键值对来获取两个参数,总的来说还是传了一个map类型的参数,不方便,那么可不可以直接传递多个参数呢?看接口绑定是如何实现的
代码:
/**
* 接口文件
* 使用@Param("accIn"),不必使用索引查询
*/
public interface LogMapper {
public List<Log> selByAccinAccout
(@Param("accin")String accin,@Param("accout")String accout);
}
/**
* 测试方法
*/
LogMapper logMapper = session.getMapper(LogMapper.class);
Scanner in = new Scanner(System.in);
System.out.println("请输入转账账户:");
String accin = in.nextLine();
System.out.println("请输入收款账户:");
String accout = in.nextLine();
List<Log> list = logMapper.selByAccinAccout(accin, accout);
if(list==null) System.out.println("无查询结果");
else System.out.println("查询结果为:");
for (Log log : list) {
System.out.println(log);
session.commit();
session.close();
System.out.println("运行结束");
运行结果:
通过上面可以看出,多参数传递是接口绑定最大的一个优势,不必再通过复杂的map整合传递,简单快捷,提高了开发效率。
关于上述中的@Param("accIn"),是这样的,因为我们传的参数是String类型,并且我们获取参数的过程中还是通过#{}来获取的,因为#{}对于基本数据类型与String类型都是通过索引来获取的,因此在select语句中就要用#{0}、#{1}来获取,不直观。
所以,如果还是要用#{accin}、#{accout}来获取的话,就要用到@Param("accIn")。
那么这句话是什么意思呢?
public List<Log> selByAccinAccout (@Param("accin")String accin,@Param("accout")String accout);
@Param("accin")String accin 就是通过map来实现的,@Param("accin")就是相当于map中的key,String accin就相当于map中的value,所以我们可以这样写SQL语句,
<select id="selByAccinAccout" resultType="log">
select * from log where 1=1
<if test="accin!=null and accin!=''">
and accin=#{accin}
</if>
<if test="accout!=null and accout!=''">
and accout=#{accout}
</if>
</select>
以上就是关于接口绑定的相关内容了,个人理解,若有偏差,希望继续改善交流。