MyBatis框架 接口绑定、线程绑定

接口绑定

1)、作用
实现创建一个接口后,使得mapper.xml由mybatis生成接口的实现类,
通过调用接口对象就可以获取mapper.xml中编写的sql
Ps:mybatis和spring整合时,使用的是这个方案

2)、实现步骤
①创建一个接口:
接口包名和接口名(接口全限定路径)与mapper.xml中的<namespace>相同
<id>和方法名相对应

②在mybatis.xml<mappers>标签中使用<package>进行扫描接口和mapper

<mappers>	
	<!--接口所在的包-->
  	<package name="com.mfqh.mapper"></package>
</mappers>

③Mapper.xml中不需要写parameterType,通过#{0…}使用
即此时可对此方法进行多参数传递
Tips:此处若使用#{name},可在接口中的参数前使用注解@Param(name)
其实质是将参数列表转为Map<name,参数值>
例:

接口中:
public List<Commodity> selCommodity(@Param("lowPrice") int a,@Param("highPrice") int b);

Mapper.xml中:
<!-- 测试接口参数 -->
<select id="selCommodity" resultType="commodity">  
     	SELECT * FROM commodity WHERE  price&gt;${lowPrice}  AND price&lt;${highPrice}
</select>

测试:
kfcMapper kMapper = sSession.getMapper(kfcMapper.class);
List<Commodity> stuffs = kMapper.selCommodity(5, 10);
  	for(Commodity stuff : stuffs) {
   	System.out.println(stuff.getName()+":"+stuff.getPrice());
}

结果:
在这里插入图片描述
3)、使用
接口类类型:接口 对象名=session.getMapper(接口.class)
Ps:此处使用代理模式,使用JDK的动态代理,面向接口的代理设计模式

线程绑定

1)、缘故
在进行数据库处理事务的时候,如果有很多的sql需要执行,而每个sql都需要依靠SqlSessionFactory建立的SqlSession对象来进行处理,就有可能会通过工厂建立大量的对象,导致使用不方便。
而在数据库事务处理的过程中,都是单线程的状态,只有一个主线程在活动,基于线程绑定的特性(线程不变,对象不变)此时我们可将一个SqlSession对象绑定在主线程上,依靠主线程来提取对象,避免建立过多冗余的对象。

2)、实现
依靠ThreadLocal<?>来实现,ThreadLoacl是通过ThreadLocalMap来维护线程变量的,ThreadLocalMap的key(线程)是ThreadLoacl的弱引用。

3)、使用
ThreadLocal tL = new ThreadLocal();
绑定对象:tl.set(T对象);
获取对象:T t = tl.get();
在一个线程中,可以在任何地方提取对象
Ps:mybatis中,将SqlSession对象和主线程绑定

例:将SqlSession对象的获取依靠线程绑定封装为一个Util

public class SessionUtil {
 	private static SqlSessionFactory factory;
 	private static ThreadLocal<SqlSession> theThread;
 	
 	/**
  	* 静态初始化
  	*/
 	static{
  		InputStream iStream;
  		try {
   			iStream = Resources.getResourceAsStream("mybatis.xml");
   			//工厂设计模式接收对象
   			factory = new SqlSessionFactoryBuilder().build(iStream);
   			theThread = new ThreadLocal<SqlSession>();
  		} catch (IOException e) {
   			e.printStackTrace();
  		}
 	}
 	
 	/**
  	* 获取连接对象(使得反复获取对象,为同一个SqlSession对象
  	* @return SqlSession对象
  	*/
 	public static SqlSession getSession() {
  		if(theThread.get() == null) {
   			theThread.set(factory.openSession());
  		}
  		return theThread.get();
 	}
 	
 	/**
  	* 关闭连接对象
  	* @param session SqlSession对象
 	*/
 	public static void closeSession(SqlSession session) {
  		if(session != null) {
   			session.close();
  		}
  		theThread.set(null);
 	}
}
发布了82 篇原创文章 · 获赞 1 · 访问量 1459

猜你喜欢

转载自blog.csdn.net/qq_41891805/article/details/105015764
今日推荐