mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题
来源:互联网 发布:游族网络 游戏策划工资 编辑:程序博客网 时间:2024/05/08 10:58
我们公司的项目使用spring+mybatis组合。所以就必须得使用mybatis-spring了。所以此处就昨日mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题,做了一个总结。
我们可以先来看看mybatis-spring框架的1.1.1版本中关于SqlSessionDaoSupport的代码吧:
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的配置文件中的配置也比较少:
<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的源代码:
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版本下面有几种方式来使用:
第一种,基于注解:
@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文件配置:
public
class
UserDao
extends
SqlSessionDaoSupport {
public
List<User> userList() {
return
getSqlSession().selectList(
"User.selectUsers"
);
}
}
但是需要在spring的配置文件中增加这个UserDao的配置:
<bean id=
"userDao"
class
=
"com.xxx.paginator.dao.UserDao"
>
<property name=
"sqlSessionFactory"
ref=
"sqlSessionFactory"
/>
</bean>
第一种基于注解的配置,好处是不需要编写xml,但是这种比较容易侵入业务逻辑。
第二种基于xml配置,好处是不侵入业务逻辑,但是当dao的数量很多的时候,需要在xml中配置好多。
所以最后具体选择哪种,大家可以结合自己的情况
- mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题
- mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题
- 解决mybatis-spring从1.1升级到1.2所带来问题
- TensorFlow升级到1.2.0后带来的问题
- arcgis的快速升级及其所带来的问题
- 骨骼层级编辑带来的问题
- 升级libtool带来的问题
- svn 升级带来的问题
- WHMCS 升级带来的问题
- spring+mybatis的公用DAO
- Spring带来的问题
- 关于使用AJAX所带来的问题
- 由求值顺序所带来的问题
- IE cache缓存 所带来的问题
- IE cache缓存 所带来的问题
- eVC 移植所带来的已知问题
- 数据库应用程序迁移所带来的问题
- 代码不兼容所带来的问题
- C语言:fseek与ftell函数
- c++ 中的this指针的理解和用法
- crontab的安装和使用
- 【ThinkPHP】自定义标签
- jquery操作select(取值,设置选中)
- mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题
- 自动化测试框架Cucumber和RobotFramework的实战对比
- Hadoop Streaming原理及实践
- oracle 11g oem的建立方法
- JAVA程序员必看的15本书-JAVA自学书籍推荐
- 聚类分析
- 7个步骤让PC网站自动适配手机网页
- C++技术点积累(8)——STL之算法汇总
- [贪心]UVa11093 - Just Finish it up