直接调用dao_MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO

本文介绍了在MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO,详细解析了SqlSessionDaoSupport的作用,以及在1.2.0版本后无法自动注入SqlSessionFactory或SqlSessionTemplate的问题。通过创建BaseDao基类,使用BeanPostProcessor解决初始化问题,并给出了具体的代码示例。
摘要由CSDN通过智能技术生成
ae69fe0245f28c4bc9dbd36c86e27b92.png

在MyBatis中,当我们编写好访问数据库的映射器接口后,MapperScannerConfigurer就能自动成批地帮助我们根据这些接口生成DAO对象(请参考本系列前面的博文:MyBatis MapperScannerConfigurer配置),然后我们再使用Spring把这些DAO对象注入到业务逻辑层的对象(Service类的对象)。因此,在这种情况下的DAO层,我们几乎不用编写代码,而且也没有地方编写,因为只有接口。这固然方便,不过如果我们需要在DAO层写一些代码的话,这种方式就无能为力了。此时,MyBatis-Spring提供给我们的SqlSessionDaoSupport类就派上了用场。今天,就以访问学生表为例,通过继承SqlSessionDaoSupport,来写一个StudentDao。

首先来认识一个SqlSessionDaoSupport类。类org.mybatis.spring.support.SqlSessionDaoSupport继承了类org.springframework.dao.support.DaoSupport,它是一个抽象类,本身就是作为DAO的基类来使用的。它需要一个SqlSessionTemplate或一个SqlSessionFactory,若两者都设置了,则SqlSessionFactory会被忽略(实际上它接收了SqlSessionFactory后也会利用SqlSessionFactory创建一个SqlSessionTemplate)。这样,我们在子类中就能通过调用SqlSessionDaoSupport类的getSqlSession()方法来获取这个SqlSessionTemplate对象。而SqlSessionTemplate类实现了SqlSession接口,因此,有了SqlSessionTemplate对象,访问数据库就不在话下了。所以,我们需要Spring给SqlSessionDaoSupport类的子类的对象(多个DAO对象)注入一个SqlSessionFactory或一个SqlSessionTemplate。好消息是,SqlSessionTemplate是线程安全的,因此,给多个DAO对象注入同一个SqlSessionTemplate是没有问题的,本例也将注入SqlSessionFactory。

但坏消息是,自mybatis-spring-1.2.0以来,SqlSessionDaoSupport的setSqlSessionTemplate和setSqlSessionFactory两个方法上的@Autowired注解被删除,这就意味着继承于SqlSessionDaoSupport的DAO类,它们的对象不能被自动注入SqlSessionFactory或SqlSessionTemplate对象。如果在Spring的配置文件中一个一个地配置的话,显然太麻烦。比较好的解决办法是在我们的DAO类中覆盖这两个方法之一,并加上@Autowired注解。那么如果在每个DAO类中都这么做的话,显然很低效。更优雅的做法是,写一个继承于SqlSessionDaoSupport的BaseDao,在BaseDao中完成这个工作,然后其他的DAO类再都从BaseDao继承。BaseDao代码如下:

package com.abc.dao.base;import org.mybatis.spring.SqlSessionTemplate;import org.mybatis.spring.support.SqlSessionDaoSupport;import org.springframework.beans.factory.annotation.Autowired;public 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值