但行好事
莫论前程❤

Spring-mybatis整合中SqlSessionTemplate与SqlSessionDaoSupport的区别

SqlSessionTemplate

​ SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。

​ SqlSessionTemplate实现了SqlSession,这就是说要对MyBatis的SqlSession进行简易替换。

​ 当调用 SQL 方法时(包括由 getMapper() 方法返回的映射器中的方法),SqlSessionTemplate 将会保证使用的 SqlSession 与当前 Spring 的事务相关。此外,它管理 session 的生命周期,包含必要的关闭、提交或回滚操作。另外,它也负责将 MyBatis 的异常翻译成 Spring 中的 DataAccessExceptions

由于模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是SqlSessionTemplate 来替换 MyBatis 默认的 DefaultSqlSession 实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。

可以使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象。

在spring的配置文件applicationContex.xml中添加:

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

这个bean现在可以直接注入到DAO bean中。你需要在bean中添加一个SqlSession属性(sqlSession接口,sqlSessionTemplate是sqlSession接口是实现类),就像下面的代码:

public class UserDaoImpl implements UserDao{  

    private SqlSession sqlSession;  

    public void setSqlSession(SqlSession sqlSession){  
        this.sqlSession = sqlSession;  
    }  
    public User getuser(String userId){  
        return (User)sqlSession.selectOne  
        ("org.mybatis.spring.sample.mapper.UserMapper.getUser",userId);  
    }  
}  

在spring的配置文件applicationContex.xml中添加如下配置, 注入SqlSessionTemplate:

<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">  
    <property name="sqlSession" ref="sqlSession"/>  
</bean>  

等价于:

@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    @Qualifier("sqlSessionTemplate")
    private SqlSessionTemplate sqlSessionTemplate;
    ....
}

使用注解的dao层实现类:

@Repository
public class DeptDaoImpl implements DeptDao {

    private static final String NAMESPACE = DeptDao.class.getPackage().getName() + "." + DeptDao.class.getSimpleName() + ".";

    @Autowired
    @Qualifier("sqlSessionTemplate")
    private SqlSessionTemplate sqlSessionTemplate;

    @Override
    public List<PtDept> selectAllDepts() {
        return sqlSessionTemplate.selectList(NAMESPACE + "selectAllDepts");
    }

    @Override
    public int addDept(PtDept ptDept) {
        return sqlSessionTemplate.insert(NAMESPACE + "addDept",ptDept);
    }

    @Override
    public int updateDept(PtDept ptDept) {
        return sqlSessionTemplate.update(NAMESPACE + "updateDept",ptDept);
    }

    @Override
    public int deleteDepts(List<PtDept> depts) {
        return sqlSessionTemplate.delete(NAMESPACE + "deleteDepts",depts);
    }
}

SqlSessionDaoSupport

SqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法.
getSqlSession()方法是抽象类SqlSessionDaoSupport中的public修饰的方法
就像下面这样:

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
  public User getUser(String userId) {
    return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
  }
}

通常MapperFactoryBean是这个类的首选,因为它不需要额外的代码。但是,如果你需要在DAO中做其它非MyBatis的工作或需要具体的类,那么这个类就是很有用了。SqlSessionDaoSupport需要一个sqlSessionFactory或sqlSessionTemplate属性来设置。这些被明确地设置或由Spring来自动装配。如果两者都被设置了,那么sqlSessionFactory是被忽略的。

假设类UserMapperImpl是SqlSessionDaoSupport的子类,它可以在Spring中进行如下的配置:

<bean id="userMapper" class="org.mybatis.spring.sample.mapper.UserMapperImpl">  
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>  
</bean>  
赞(1) 打赏
未经允许不得转载:刘鹏博客 » Spring-mybatis整合中SqlSessionTemplate与SqlSessionDaoSupport的区别
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏