我们公司的项目使用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层级的编写问题相关推荐

  1. springMvc+mybatis+spring 整合 包涵整合activiti 基于maven

    2019独角兽企业重金招聘Python工程师标准>>> 最近自己独立弄一个activiti项目,写一下整合过程: 环境:jdk1.7 tomcat7.0 maven3.5  ecli ...

  2. myeclipes10.7+maven+myBatis+spring+springMvc

    SSM框架详细整合教程(Spring+SpringMVC+MyBatis) 2016年02月26日 01:50:21 程序员囧辉 阅读数:60951 版权声明:本文为博主原创文章,未经博主允许不得转载 ...

  3. hadoop mysql mybatis_MyBatis简介与配置MyBatis+Spring+MySql

    MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获.MyBatis 只使用简单的XML 和注解来配置和映射基本 ...

  4. Mybatis+Spring SqlSessionTemplate注入学习--1

    1.我们创建一个maven工程,创建的时候选择packageing 为war形式,也就是一个web工程 2.工程创建好之后,我们在pom.xml中引入相关的jar,要想使用Spring+mybatis ...

  5. MyBatis+Spring整合

    不多说,直接上案例! 1. 建立数据库+表 CREATE TABLE s_user(user_id INT AUTO_INCREMENT PRIMARY KEY,user_name VARCHAR(3 ...

  6. org.mybatis.spring.MyBatisSystemException异常及处理

    org.mybatis.spring.MyBatisSystemException异常及处理 参考文章: (1)org.mybatis.spring.MyBatisSystemException异常及 ...

  7. 成功解决 org.mybatis.spring.MyBatisSystemException问题!!

    成功解决 org.mybatis.spring.MyBatisSystemException问题!! 参考文章: (1)成功解决 org.mybatis.spring.MyBatisSystemExc ...

  8. MyBatis -- Spring -- SqlSessionFactoryBean

    符: Mybatis-config.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...

  9. Maven+Struts2+MyBatis+Spring搭建教程

    教程目标: 在MyEclipse中搭建Struts2+MyBatis+Spring环境,用Maven管理项目,利用mybatis-gernerator插件生成部分代码 附带目标: struts2的自定 ...

最新文章

  1. Hadoop集群搭建(二:集群主机间免密登录配置)
  2. (转)SpringBoot系列—Redis使用
  3. LINUX - pthread_detach()与pthread_join()
  4. 导体阻抗计算公式_同轴线缆特性阻抗的介绍及测量
  5. linux socket原理,socket 的工作原理
  6. Effective C++:unio
  7. linux cmake 安装mysql5.5.11_以及更高版本_linux cmake 安装mysql5.5.11,以及更高版本
  8. Unable to locate the default servlet for serving static content. Please set the 'defaultServletName'
  9. STM32——EEPROM
  10. visual studio过期登录不了账户_具有最高管理权限账户,Windows 7设置Administrator密码永不过期...
  11. 用子函数实现strlen.strcpy.strcat.strcmp(完整代码)
  12. debian、ubuntu安装metasploit通用方法
  13. 快手短视频批量下载工具详细使用说明
  14. MySQL的索引与事务(面试必考) - 细节狂魔
  15. sketch软件_8款原型设计工具与Sketch的强强组合,轻松构建交互原型
  16. 运维:你们 JAVA 服务怎么又又又又出问题了,内存降不下来
  17. 征战牛市!HASHBOX第二期矿场行活动完美落幕
  18. 第十周 项目二 小刚破译加密密码
  19. SpringBoot普通参数与基本注解(@PathVariable、@RequestHeader、@RequestParam、@RequestBody)
  20. 2023 目标,与君共勉

热门文章

  1. python隐藏部分代码_python隐藏类中属性的3种实现方法
  2. type=file的未选择任何文件修改_PDF文件怎样输入到CAD图纸中?懂得这个功能可以快速实现...
  3. 让学习linux变成一种习惯
  4. JavaScript初学者编程题(24)
  5. mysql导出数据到txt太慢_分享:mysql导出数据到txt文件
  6. 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则
  7. sqlalchemy数据库中的limit使用(限制查询的用户数量)
  8. 组合计数 ---- codeforces1312 D. Count the Arrays
  9. cic曲线是什么_贝塞尔曲线基本用法
  10. AT5198 01 Matrix(构造)