前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >8. Mybatis 接口代理机制及使用

8. Mybatis 接口代理机制及使用

作者头像
捞月亮的小北
发布于 2024-06-24 02:45:57
发布于 2024-06-24 02:45:57
11000
代码可运行
举报
文章被收录于专栏:捞月亮的小北捞月亮的小北
运行总次数:0
代码可运行

疑问:在MyBatis中,SqlSession​对象为什么不写在方法外部呢? 在MyBatis中,SqlSession​对象通常不推荐写在方法外部(如类成员变量或静态变量)并且在整个类中共享的原因主要包括以下几个方面:

  1. 线程安全: ​SqlSession​不是线程安全的对象,因此每个线程都应该拥有自己的SqlSession​实例。如果在类级别上声明一个全局的SqlSession​,多线程环境下可能会导致数据竞争和不可预测的结果。
  2. 资源管理: ​SqlSession​内部持有数据库连接资源,打开连接会消耗系统资源,而长时间不关闭连接可能导致资源泄露。最佳实践是在每次数据库操作完成后立即关闭SqlSession​以释放资源。将SqlSession​放在方法内,可以在方法结束时确保及时关闭。
  3. 事务控制: 每个SqlSession​对应一个数据库事务,当在一个业务逻辑中需要多个数据库操作构成一个原子事务时,应该在一个方法内创建并开启事务,完成所有操作后再提交或回滚事务,这样能保证事务的一致性。若SqlSession​是全局的,事务边界将会变得模糊,不利于精确控制。
  4. 依赖注入与单元测试: 在使用Spring等容器管理MyBatis时,SqlSession​可以通过依赖注入的方式在每次请求或者每个方法调用时获得新的实例,这符合面向切面编程(AOP)的原则,使得代码更加模块化和易于测试。

基于以上原因,在编写测试类或实际应用中的DAO层代码时,推荐的做法是每次执行CRUD操作时,在方法内部创建SqlSession​对象,执行完必要的操作后,立即将其关闭。例如: public void testInsert(User user) { try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.insert(user); session.commit(); } catch (Exception e) { // 处理异常,可能需要回滚事务 } } 上述代码展示了在方法内部获取并使用SqlSession​的最佳实践,这样可以确保每次操作都独立于其他操作,避免了资源管理和并发问题。

使用mybatis获取dao接口代理类对象

代码展示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AccountDao accountDao = (AccountDao)sqlSession.getMapper(AccountDao.class);

使用前提:AccountMapper.xml文件中的namespace必须和dao接口的全限定名称一致,id必须和dao接口中方法名一致。

将service中获取dao对象的代码再次修改,如下:

代码测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Test
    public void testInsert() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        Car car = new Car(null , "3333" , "CT5" , 30.0 , "2023-10-10" , "燃油车");
        int rows = mapper.insert(car);
        System.out.println("插入数据:" + rows);
        sqlSession.commit();
    }

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java线程池-ThreadPoolExecutor源码解析(基于Java8)
所以需要通过线程池协调多个线程,并实现类似主次线程隔离、定时执行、周期执行等任务.
JavaEdge
2018/05/16
6.8K1
Java线程池-ThreadPoolExecutor源码解析(基于Java8)
如何优雅的使用线程池!!!
在前面使用的例子用,我们已经使用过线程池,基本上就是初始化线程池实例之后,把任务丢进去,等待调度执行就可以了,使用起来非常简单、方便。虽然使用很简单,但线程池涉及到的知识点非常多。需要分析其实现。
用户2242639
2021/06/29
1.6K0
透彻Java线程池的实现原理
其实java线程池的实现原理很简单,说白了就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。
挨踢小子部落阁
2023/03/15
2850
透彻Java线程池的实现原理
深度解读Java线程池思想及实现
相信很多Java从业者都听说过或者使用过Java的线程池,但真正了解线程池的并不多,这篇文章详细解读Java线程池设计思想及源码实现。线程池是一个非常重要的工具,也是一把双刃剑,解决了很多生产系统运行的问题,但很多线上问题都是因为没有用好线程池导致的,要成为一个好的工程师,还是得比较好地掌握这个知识。
迟恩
2020/07/01
8340
把线程池的底ku扒个底朝天-源码解析
上一篇我们介绍了线程池的使用,这一篇我们接着分析下线程池的实现原理。首先从创建线程池的核心类ThreadPoolExecutor类说起。
码农飞哥
2021/08/18
2860
Java线程池深入理解
之前面试baba系时遇到一个相对简单的多线程编程题,即"3个线程循环输出ADC",自己答的并不是很好,深感内疚,决定更加仔细的学习《并发编程的艺术》一书,到达掌握的强度。(之前两月休息时间都花在了lo
用户1216676
2018/01/24
1.8K0
面试题-关于Java线程池一篇文章就够了
线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。
程序新视界
2019/12/20
1.9K0
面试题-关于Java线程池一篇文章就够了
Java线程池深度揭秘
Executor 是一个接口(主要用于定义规范),定义了 execute 方法,用于接收 Runnable 对象。
一猿小讲
2020/08/10
3230
Java线程池深度揭秘
从源码看JDK提供的线程池(ThreadPoolExecutor) 一丶什么是线程池二丶ThreadPoolExecutor的使用三丶从源码来看ThreadPoolExecutor
一丶什么是线程池 (1)博主在听到线程池三个字的时候第一个想法就是数据库连接池,回忆一下,我们在学JavaWeb的时候怎么理解数据库连接池的,数据库创建连接和关闭连接是一个比较耗费资源的事情,对于那些数量多且时间短暂的任务,会导致频繁获取和释放连接,这样使得处理事务的效率大大降低,多以我们创建一个连接池,里面放了指定数目的连接,当应用需要数据库连接的时候去里面获取,使用完毕后再放到连接池里,这样就避免了重复的获取连接和释放连接,至于要获取什么样的连接池我们可以根据应用的特征,设置参数来决定。 (2)线程池
MindMrWang
2018/04/19
9840
从源码看JDK提供的线程池(ThreadPoolExecutor)
		一丶什么是线程池二丶ThreadPoolExecutor的使用三丶从源码来看ThreadPoolExecutor
【每周三面】源码角度说说Java线程池
本文来源:http://yeming.me/2016/05/07/threadPool1/
趣学程序-shaofeer
2020/05/18
4360
【每周三面】源码角度说说Java线程池
Java的Executor框架和线程池实现原理
Executor接口是Executor框架中最基础的部分,定义了一个用于执行Runnable的execute方法,它没有实现类只有另一个重要的子接口ExecutorService
全栈程序员站长
2022/11/17
4530
Java的Executor框架和线程池实现原理
Java线程池
线程池的核心实现类,基于ThreadPoolExecutor可以实现满足不同场景的线程池
spilledyear
2020/02/10
9500
相关推荐
Java线程池-ThreadPoolExecutor源码解析(基于Java8)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验