spring boot 解决mybatis-spring 1.1到1.2问题
遇到问题如下:
Caused by: java.lang.IllegalArgumentException: Property sqlSessionFactory or sqlSessionTemplate are required at org.springframework.util.Assert.notNull(Assert.java:193) at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:74) at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:73) at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1767) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1704) ... 68 more
原因:
mybatis-spring 1.10 类 SqlSessionDaoSupport 中 SqlSessionFactory、SqlSessionTemplate 注入为非必输,
public abstract class SqlSessionDaoSupport extends DaoSupport { private SqlSession sqlSession; private boolean externalSqlSession; public SqlSessionDaoSupport() { } @Autowired( required = false ) public final void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { if (!this.externalSqlSession) { this.sqlSession = new SqlSessionTemplate(sqlSessionFactory); } } @Autowired( required = false ) public final void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSession = sqlSessionTemplate; this.externalSqlSession = true; } public final SqlSession getSqlSession() { return this.sqlSession; } protected void checkDaoConfig() { Assert.notNull(this.sqlSession, "Property sqlSessionFactory or sqlSessionTemplate are required"); } }
mybatis-spring 1.20及更高版本中
public abstract class SqlSessionDaoSupport extends DaoSupport { private SqlSession sqlSession; private boolean externalSqlSession; public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { if (!this.externalSqlSession) { this.sqlSession = new SqlSessionTemplate(sqlSessionFactory); } } public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSession = sqlSessionTemplate; this.externalSqlSession = true; } public SqlSession getSqlSession() { return this.sqlSession; } /** * {@inheritDoc} */ @Override protected void checkDaoConfig() { notNull(this.sqlSession, "Property sqlSessionFactory or sqlSessionTemplate are required"); } }
解决方案:mybatis 注入sqlSessionFactory
package com.example.springboot.common; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import javax.sql.DataSource; /** * 〈解决 mybatis-spring 1.10到1.20的问题〉<br> * Property sqlSessionFactory or sqlSessionTemplate are required 问题 * */ @Configuration public class MybatisInitConfig{ @Autowired private DataSourceProperties dataSourceProperties; @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { DataSource dataSource=dataSourceProperties.initializeDataSourceBuilder().build(); SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //关于application.properties中与mybatis有关的配置,需要在此处配置才会生效 // sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapping/*.xml")); return sqlSessionFactoryBean.getObject(); } }