mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题
我们公司的项目使用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@Autowiredpublic 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层级的编写问题相关推荐
- springMvc+mybatis+spring 整合 包涵整合activiti 基于maven
2019独角兽企业重金招聘Python工程师标准>>> 最近自己独立弄一个activiti项目,写一下整合过程: 环境:jdk1.7 tomcat7.0 maven3.5 ecli ...
- myeclipes10.7+maven+myBatis+spring+springMvc
SSM框架详细整合教程(Spring+SpringMVC+MyBatis) 2016年02月26日 01:50:21 程序员囧辉 阅读数:60951 版权声明:本文为博主原创文章,未经博主允许不得转载 ...
- hadoop mysql mybatis_MyBatis简介与配置MyBatis+Spring+MySql
MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获.MyBatis 只使用简单的XML 和注解来配置和映射基本 ...
- Mybatis+Spring SqlSessionTemplate注入学习--1
1.我们创建一个maven工程,创建的时候选择packageing 为war形式,也就是一个web工程 2.工程创建好之后,我们在pom.xml中引入相关的jar,要想使用Spring+mybatis ...
- MyBatis+Spring整合
不多说,直接上案例! 1. 建立数据库+表 CREATE TABLE s_user(user_id INT AUTO_INCREMENT PRIMARY KEY,user_name VARCHAR(3 ...
- org.mybatis.spring.MyBatisSystemException异常及处理
org.mybatis.spring.MyBatisSystemException异常及处理 参考文章: (1)org.mybatis.spring.MyBatisSystemException异常及 ...
- 成功解决 org.mybatis.spring.MyBatisSystemException问题!!
成功解决 org.mybatis.spring.MyBatisSystemException问题!! 参考文章: (1)成功解决 org.mybatis.spring.MyBatisSystemExc ...
- MyBatis -- Spring -- SqlSessionFactoryBean
符: Mybatis-config.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...
- Maven+Struts2+MyBatis+Spring搭建教程
教程目标: 在MyEclipse中搭建Struts2+MyBatis+Spring环境,用Maven管理项目,利用mybatis-gernerator插件生成部分代码 附带目标: struts2的自定 ...
最新文章
- Hadoop集群搭建(二:集群主机间免密登录配置)
- (转)SpringBoot系列—Redis使用
- LINUX - pthread_detach()与pthread_join()
- 导体阻抗计算公式_同轴线缆特性阻抗的介绍及测量
- linux socket原理,socket 的工作原理
- Effective C++:unio
- linux cmake 安装mysql5.5.11_以及更高版本_linux cmake 安装mysql5.5.11,以及更高版本
- Unable to locate the default servlet for serving static content. Please set the 'defaultServletName'
- STM32——EEPROM
- visual studio过期登录不了账户_具有最高管理权限账户,Windows 7设置Administrator密码永不过期...
- 用子函数实现strlen.strcpy.strcat.strcmp(完整代码)
- debian、ubuntu安装metasploit通用方法
- 快手短视频批量下载工具详细使用说明
- MySQL的索引与事务(面试必考) - 细节狂魔
- sketch软件_8款原型设计工具与Sketch的强强组合,轻松构建交互原型
- 运维:你们 JAVA 服务怎么又又又又出问题了,内存降不下来
- 征战牛市!HASHBOX第二期矿场行活动完美落幕
- 第十周 项目二 小刚破译加密密码
- SpringBoot普通参数与基本注解(@PathVariable、@RequestHeader、@RequestParam、@RequestBody)
- 2023 目标,与君共勉
热门文章
- python隐藏部分代码_python隐藏类中属性的3种实现方法
- type=file的未选择任何文件修改_PDF文件怎样输入到CAD图纸中?懂得这个功能可以快速实现...
- 让学习linux变成一种习惯
- JavaScript初学者编程题(24)
- mysql导出数据到txt太慢_分享:mysql导出数据到txt文件
- 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则
- sqlalchemy数据库中的limit使用(限制查询的用户数量)
- 组合计数 ---- codeforces1312 D. Count the Arrays
- cic曲线是什么_贝塞尔曲线基本用法
- AT5198 01 Matrix(构造)