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中配置好多。

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 10:05:36

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

MyBatis+Spring轻量级整合(Maven)

Mybatis: 前身是ibatis,但由于种种原因,去年五月时改名为Mybatis,绝大多数API与机制没有变化,只是少数配置文件变动了.但是官网上有一个自动转换的工具,可以方便的将Ibatis系统转换为Mybatis. Spring: 采用3.x,这是因为Mybatis和Spring3.x有一个较好的结合体验,Maven库上有一个Mybatis-Spring结合包. 所需要采用的JAR包:(POM.xml) <dependency> <groupid>org.springfra

MyBatis简介与配置MyBatis+Spring+MySql

1.1MyBatis简介 MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获.MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型.Map 接口和POJO 到数据库记录.相对Hibernate和Apache OJB等"一站式"ORM解决方案而言,Mybatis 是一种"半自动化"的ORM实现.需要使用的Jar包:mybatis-3.0.2.jar(mybatis核

疑惑的 java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()L

在MAVEN项目里面,在整合spring和mybatis在执行数据库操作的时候报出了: java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()L错误 在网上搜的大多说是jar包版本不兼容的问题.但想想,不应该啊,这是他们原有的系统,难道有做过升级吗,最后尝试着把版本升级了下,还真是版本兼容出了问题. 1 Exception in thread "main

springMVC+MyBatis+Spring 整合(3)

spring mvc 与mybatis 的整合. 加入配置文件: spring-mybaits.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xm

springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题

解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640人阅读 评论(1) 收藏 举报 用的是 SSM3的框架 Spring MVC 3.1 + Spring 3.1 + Mybatis3.1第一种情况:Spring MVC 和 Spring 整合的时候,SpringMVC的springmvc.xml文件中 配置扫描包,不要包含 service的注解,S

mybatis spring maven

maven版本:3.3.9  解压即可使用 spring版本:4.3.9  通过maven进行管理下载 mybatis版本:3.4.4 通过maven进行管理下载 mysql版本:5.7  connector也是通过maven进行下载 首先,使用maven一定要网速好一点,不然在线下载jar包会很慢,其次,关于仓库的问题,最好换成国内的阿里云的仓库,下载会更快. 具体为,修改maven的E:\Runtime\apache-maven-3.3.9\conf下的settings.xml文件: 在 <

MyBatis Spring整合配置映射接口类与映射xml文件

Spring整合MyBatis使用到了mybatis-spring,在配置mybatis映射文件的时候,一般会使用MapperScannerConfigurer,MapperScannerConfigurer会自动扫描basePackage指定的包,找到映射接口类和映射XML文件,并进行注入.配置如下: [html] view plain copy <!-- 数据源 --> <bean id="dataSource" class="com.mchange.v

Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean

问题描述: 一月 15, 2014 3:43:13 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh信息: Refreshing org[email protected]a530461: startup date [Wed Jan 15 15:43:13 CST 2014]; root of context hierarchy一月 15, 2014 3:43:13 下午 org.spr

Maven搭建Mybatis+Spring+ehcache细节

1.创建Maven工程 1.1.Fill-->New Maven Project-->Next-->maven-archetype-webapp-->Next-->输入group id和artiface id点击finish完成,这里group id和artiface id就是标识项目唯一坐标的作用,这里不做介绍,然后把工程目录调整下,这样就是个标准的maven工程了.   1.2.编写pom文件,有了maven真的极大的方便了我们构建项目,这里maven帮我们把编写在pom