MyBatis框架 接口绑定、线程绑定
接口绑定
1)、作用
实现创建一个接口后,使得mapper.xml由mybatis生成接口的实现类,
通过调用接口对象就可以获取mapper.xml中编写的sql
Ps:mybatis和spring整合时,使用的是这个方案
2)、实现步骤
①创建一个接口:
接口包名和接口名(接口全限定路径)与mapper.xml中的
②在mybatis.xml
<mappers>
<!--接口所在的包-->
<package name="com.mfqh.mapper"></package>
</mappers>
③Mapper.xml中不需要写parameterType,通过#{0…}使用
即此时可对此方法进行多参数传递
Tips:此处若使用#{name},可在接口中的参数前使用注解@Param(name)
其实质是将参数列表转为Map
例:
接口中:
public List<Commodity> selCommodity(@Param("lowPrice") int a,@Param("highPrice") int b);
Mapper.xml中:
<!-- 测试接口参数 -->
<select id="selCommodity" resultType="commodity">
SELECT * FROM commodity WHERE price>${lowPrice} AND price<${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);
}
}
还没有评论,来说两句吧...