mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题

简介:

我们公司的项目使用spring+mybatis组合。所以就必须得使用mybatis-spring了。所以此处就昨日mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题,做了一个总结。

我们可以先来看看mybatis-spring框架的1.1.1版本中关于SqlSessionDaoSupport的代码吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package  org.mybatis.spring.support;
 
import  static  org.springframework.util.Assert.*;
 
import  org.apache.ibatis.session.SqlSession;
import  org.apache.ibatis.session.SqlSessionFactory;
import  org.mybatis.spring.SqlSessionTemplate;
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.dao.support.DaoSupport;
 
/**
  * Convenient super class for MyBatis SqlSession data access objects.
  * It gives you access to the template which can then be used to execute SQL methods.
  * <p>
  * This class needs a SqlSessionTemplate or a SqlSessionFactory.
  * If both are set the SqlSessionFactory will be ignored.
  *
  * @see #setSqlSessionFactory
  * @see #setSqlSessionTemplate
  * @see SqlSessionTemplate
  * @version $Id: SqlSessionDaoSupport.java 4885 2012-03-12 09:58:54Z simone.tripodi $
  */
public  abstract  class  SqlSessionDaoSupport  extends  DaoSupport {
 
   private  SqlSession sqlSession;
 
   private  boolean  externalSqlSession;
 
   @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 ;
   }
 
   /**
    * Users should use this method to get a SqlSession to call its statement methods
    * This is SqlSession is managed by spring. Users should not commit/rollback/close it
    * because it will be automatically done.
    *
    * @return Spring managed thread safe SqlSession
    */
   public  final  SqlSession getSqlSession() {
     return  this .sqlSession;
   }
 
   /**
    * {@inheritDoc}
    */
   protected  void  checkDaoConfig() {
     notNull( this .sqlSession,  "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required" );
   }
 
}

  从上面的源码可以看出:在方法setSqlSessionFactory和setSqlSessionTemplate方法上面都标注有:“@Autowired(required = false)”这样的注解。

所以我们在编写dao层级代码的时候只需要dao直接继承SqlSessionDaoSupport,并标注注解@Repository,然后就可以使用类似的getSqlSession().selectList("User.selectUsers");这样的方法来使用它了,而且在spring的配置文件中的配置也比较少:

1
2
3
4
5
6
7
8
9
10
11
<tx:annotation-driven transaction-manager= "txManager"
                          proxy-target- class = "true" />
 
    <bean id= "txManager"  class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
        <property name= "dataSource"  ref= "dataSource" />
    </bean>
 
    <bean id= "sqlSessionFactory"  class = "org.mybatis.spring.SqlSessionFactoryBean" >
        <property name= "dataSource"  ref= "dataSource" />
        <property name= "configLocation"  value= "classpath:mybatis-config.xml" />
    </bean>

  

  但是升级到1.2之后,我们看看SqlSessionDaoSupport的源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 ;
   }
 
   /**
    * Users should use this method to get a SqlSession to call its statement methods
    * This is SqlSession is managed by spring. Users should not commit/rollback/close it
    * because it will be automatically done.
    *
    * @return Spring managed thread safe SqlSession
    */
   public  SqlSession getSqlSession() {
     return  this .sqlSession;
   }
 
   /**
    * {@inheritDoc}
    */
   protected  void  checkDaoConfig() {
     notNull( this .sqlSession,  "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required" );
   }
 
}

  

  从上面的源码可以看出:在方法setSqlSessionFactory和setSqlSessionTemplate方法上面现在都没有标注有:“@Autowired(required = false)”这样的注解。

如果一些系统直接从mybatis-spring1.1.1升级到1.2版本的时候,就会出现问题。

在1.2版本下面有几种方式来使用:

第一种,基于注解:

1
2
3
4
5
6
7
8
9
10
11
12
@Repository
public  class  UserDao  extends  SqlSessionDaoSupport{
     public  List<User> userList() {
         return  getSqlSession().selectList( "User.selectUsers" );
     }
 
     @Override
     @Autowired
     public  void  setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
         super .setSqlSessionFactory(sqlSessionFactory);
     }
}

  

  我们自己重写set方法就可以了。在这种情况下spring的配置文件不需要修改。这个实例是随意写的,如果你的工程中dao类很多(绝大多数情况都是),这样你就可以编写一个BaseDao,然后在这个BaseDao中重写这个方法,其他的dao只需要继承这个BaseDao就可以了。

第二章基于xml文件配置:

1
2
3
4
5
public  class  UserDao  extends  SqlSessionDaoSupport {
     public  List<User> userList() {
         return  getSqlSession().selectList( "User.selectUsers" );
     }
}

  

  但是需要在spring的配置文件中增加这个UserDao的配置:

1
2
3
<bean id= "userDao"  class = "com.xxx.paginator.dao.UserDao" >
     <property name= "sqlSessionFactory"  ref= "sqlSessionFactory" />
</bean>

  

  第一种基于注解的配置,好处是不需要编写xml,但是这种比较容易侵入业务逻辑。

     第二种基于xml配置,好处是不侵入业务逻辑,但是当dao的数量很多的时候,需要在xml中配置好多。

     所以最后具体选择哪种,大家可以结合自己的情况。

目录
相关文章
|
7月前
|
XML Oracle Java
mybatis反向生成实体类、dao层以及映射文件
mybatis反向生成实体类、dao层以及映射文件
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
38 10
|
4月前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
181 0
|
5月前
|
Java 数据库连接 mybatis
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
|
6月前
|
Java Spring 容器
spring如何进行依赖注入,通过set方法把Dao注入到serves
spring如何进行依赖注入,通过set方法把Dao注入到serves
|
5月前
|
Java UED Spring
Spring Boot中的零停机升级策略
Spring Boot中的零停机升级策略
|
6月前
|
监控 Java 开发者
Spring Boot 3 升级全解析:新特性与改进点一网打尽
Spring Boot 3 升级全解析:新特性与改进点一网打尽
|
7月前
|
移动开发 前端开发 NoSQL
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
319 0
|
7月前
|
Java 数据库连接 mybatis
MyBatis中Mapper接口和dao区别是什么?
MyBatis中Mapper接口和dao区别是什么?
193 0
|
7月前
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl