spring boot使用注解的方式引入mybatis的SqlSessionDaoSupport

时间:2022-07-25
本文章向大家介绍spring boot使用注解的方式引入mybatis的SqlSessionDaoSupport,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

出现这个问题, 说明一点, 我对spring的注解方式的配置只是知道一个皮毛. 没有深入理解. 有时间要把这部分充充电

package com.zhike.qizhi.common.dao;

import com.zhike.qizhi.common.page.Pagination;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

/*
 * 顶层接口
 */
@Mapper
@Repository
public class ObjectDao<T> extends SqlSessionDaoSupport {
@Autowired
    private  SqlSessionFactory sqlSessionFactory;

    /**
     * 获取对象<br />
     * 对象ID可能为字符串类型也可能为整型等其它类型,故设置为Object类型
     * 
     * @param statement 操作名称
     * @param objectId 对象ID
     * @return 对象
     */

        ............
}

以前都是通过配置文件配置的mybatis. 现在要迁移到spring boot上都是用注解的方式. 就出现了一个问题, 提示说sqlSesstionFactory不存在. 看源码我知道是因为这个类没有被spring扫描到(因为没有加注解), 所以需要通过@Bean引入引来, 但引入了多次都没有成功. 最后参考多篇文章, 成功了.

主要参考:

https://blog.csdn.net/weixin_36795183/article/details/79043307

http://www.cnblogs.com/liaoguanwang/p/9769976.html

======================================================================

具体操作如下, 一共两步骤:

1. 定义一个mybatis的配置文件类

@Configuration
public class MybatisConfiguration implements TransactionManagementConfigurer{

    @Autowired
    private DataSource dataSource;

    // 提供SqlSeesion
    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        return sessionFactory.getObject();
    }

    @Bean
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }

}

2. 在ObjectDao引入的时候, 使用如下方法

*
 * 顶层接口
 */
@Mapper
@Repository
public class ObjectDao<T> extends SqlSessionDaoSupport {

    @Resource
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
        super.setSqlSessionFactory(sqlSessionFactory);
    }

    /*@Autowired
    private  SqlSessionFactory sqlSessionFactory;*/

      .......
}

具体原因: 参考上面的第一篇文章