Mybatis 中的接口绑定问题

首先,利用接口绑定好在哪里,举个栗子。

看代码:

传统方法:

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

以上就是关于接口绑定的相关内容了,个人理解,若有偏差,希望继续改善交流。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值