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

曾经终败给现在 2023-07-17 12:55 199阅读 0赞

接口绑定

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

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

和方法名相对应

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

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

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

  1. 接口中:
  2. public List<Commodity> selCommodity(@Param("lowPrice") int a,@Param("highPrice") int b);
  3. Mapper.xml中:
  4. <!-- 测试接口参数 -->
  5. <select id="selCommodity" resultType="commodity">
  6. SELECT * FROM commodity WHERE price>${lowPrice} AND price<${highPrice}
  7. </select>
  8. 测试:
  9. kfcMapper kMapper = sSession.getMapper(kfcMapper.class);
  10. List<Commodity> stuffs = kMapper.selCommodity(5, 10);
  11. for(Commodity stuff : stuffs) {
  12. System.out.println(stuff.getName()+":"+stuff.getPrice());
  13. }

结果:
在这里插入图片描述
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

  1. public class SessionUtil {
  2. private static SqlSessionFactory factory;
  3. private static ThreadLocal<SqlSession> theThread;
  4. /**
  5. * 静态初始化
  6. */
  7. static{
  8. InputStream iStream;
  9. try {
  10. iStream = Resources.getResourceAsStream("mybatis.xml");
  11. //工厂设计模式接收对象
  12. factory = new SqlSessionFactoryBuilder().build(iStream);
  13. theThread = new ThreadLocal<SqlSession>();
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. /**
  19. * 获取连接对象(使得反复获取对象,为同一个SqlSession对象
  20. * @return SqlSession对象
  21. */
  22. public static SqlSession getSession() {
  23. if(theThread.get() == null) {
  24. theThread.set(factory.openSession());
  25. }
  26. return theThread.get();
  27. }
  28. /**
  29. * 关闭连接对象
  30. * @param session SqlSession对象
  31. */
  32. public static void closeSession(SqlSession session) {
  33. if(session != null) {
  34. session.close();
  35. }
  36. theThread.set(null);
  37. }
  38. }

发表评论

表情:
评论列表 (有 0 条评论,199人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态和静态

    为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误,需要理解四个名词: 1、对象的静态类型:对象在声明时采

    相关 js 前

    其主要意思就是看我有没有用过前绑定,即Dom树中的某些元素在还没有创建出来时,就指定该类型的元素一出生就应该拥有的某些事件。在实际开发过程中经常会涉及到前绑定和后绑定。顾名思义