Spring整合Mybatis的注意事项

初学 Spring 整合 Mybatis,虽然网贴无数,但是每次试行下来,总会发生这样那样的问题。最终经过数天的不断尝试,总算是成功运行了,遇到的多数坑也一一绕过,特此记录已备查:

一、关于依赖包

网上的很多帖子杂七杂八加入了各种依赖包,有时看的人头晕脑胀,经过实测,实际需要的依赖包,只有下面三组:

      <!-- 1.基础Spring依赖 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
      </dependency>      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
      </dependency>

      <!-- 2.基础日志系统依赖 -->
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
      </dependency>

      <!--3.单元测试依赖 -->
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
      </dependency>
      <!--spring单元测试依赖 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
      </dependency>

      <!-- 4.基础数据库依赖 -->
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
      </dependency>
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
      </dependency>
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
      </dependency>
      <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
      </dependency>

以上有两个可选项:

spring-beans 不引入也不会报错,只是出于习惯,将该包作为 spring 的基础依赖包引入;

commons-dbcp 取决你是否使用其作为数据源管理,如果使用 spring-jdbc 管理数据源,则不需要引入这个这个依赖;

其他包为必须项,不引入就会引发常见的【坑1】

二、关于文件结构:

java 代码的结构,按照常规标准创建。mybatis generator 一级一些文章建议将映射配置文件放在src 里,但这会导致【坑2】,因此对于 resources 文件的配置,强烈建议如下结构创建:

mapper 目录:存储数据库映射配置文件,建议为映射接口名加 Mapper;

mybatis 目录:mybatis 的私有配置文件,由于目前初学,并没有加入实际的配置内容;

properties目录:数据库连接信息等配置文件;

spring 目录:spring 相关的配置文件,例如数据源、mybatis 整合等;

根目录下的 applicationContext 作为IoC主入口配置文件;

log4j 为日志的配置文件,不放在根目录需要增加类读取(这步未实践)

三、配置文件内容

1、主入口文件 applicationContext.xml

  <!-- propertyConfigurer 读取properties 目录中属性文件 -->
  <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <list>
        <value>classpath:properties/*.properties</value>
      </list>
    </property>
  </bean>

  <!-- 导入单独的相关配置文件 -->
  <import resource="spring/applicationContext-datasource.xml"/>
  <import resource="spring/applicationContext-mybatis.xml"/>

  <!-- 自动扫描注解的bean,经过实测,base 到src 的根目录空间就可以了,不用详细至 service 层的目录 -->
  <context:component-scan base-package="com.test" />

2、db 的 properties 文件写法比较常规,无需单独指出,只是务必注意任何符号千万不要是全角的(坑3)

3、 数据源配置文件applicationContext-datasource.xml,注意数据源管理类的使用(坑4)

  <!-- 定义数据源,具备最基本的数据连接即可,其余的附加配置在生产环境中注意配置就好 -->
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
  </bean>
  <!-- spring管理事务 -->
  <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </bean>

4、spring 整合 mybatis 配置文件 applicationContext-mybatis.xml,务必注意 MapperScanner 的配置和映射文件的配置,(坑5)

  <!-- 通过扫描的模式,自动注入bean,务必注意这里的 basePackage 指向到映射接口所在的包 -->
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.test.dao" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  </bean>

  <!-- 配置sqlSessionFactory -->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations">
      <list>
        <value>classpath:mapper/*.xml</value>
      </list>
    </property>
  </bean>

5、映射文件的配置 xxxMapper.xml,(坑6)

<mapper namespace="com.test.dao.IUserDAO">
  <resultMap id="BaseResultMap" type="com.test.pojo.User">
    <id property="userId" column="USER_ID"/>
    <result property="userName" column="USER_NAME"/>
    <result property="userPassword" column="USER_PASSWORD"/>
    <result property="userEmail" column="USER_EMAIL"/>
  </resultMap>

  <select id="getAllUsers" resultMap="BaseResultMap">
    SELECT * from t_user
  </select>

</mapper>

四、那些我踩过的坑

坑1:ClassNotFound,对于繁杂的依赖,有时搞不清楚,会遗漏,或者加入一些无用的,文一所陈列的为最小依赖包范围;

坑2:所有配置都对,就是无法加载映射文件,后来发现是因为 src下的非 java 文件未编译至 target 目录下的 classes 环境所导致,虽然可以通过 mave的 plugin 来自动复制,但是没必要,建议还是写在 resource 目录为好;

坑3:这是作为国人比较无奈的,有时不留神会写下一些全角符号而又未发现,编译并不报错,只会在测试或者运行时莫名其妙的提示错误;

坑4:准确来说,这不是个坑,取决于参考代码是使用的什么,如果使用 dbcp 管理,就务必不要忘了导入 commons-dbcp 依赖;

坑5:接近成功的最后一次大坑,检查了所有的,都没有错,死活就是无法生成对象,最后经过请教别人提醒,再次检查才发现,由于修改过映射接口包的名字,而这里忘了同步修改,再次呕血

坑6:这算是个学习坑吧,如果数据库表名包含下划线,最好定义 BaseResultMap 来指定字段和 pojo 对象属性的映射关系,不然无法映射成功

以上,就是最近一周学习 spring+mybatis 的收获,学习 java 直接从中段开始,果然有些费力啊!!!

时间: 2024-10-04 15:57:08

Spring整合Mybatis的注意事项的相关文章

spring整合mybatis遇到的bug java.lang.IllegalArgumentException: Property &#39;sqlSessionFactory&#39; or &#39;sqlSessionTemplate&#39; are required

出bug的原因:mybatis-spring版本问题. 查看SqlSessionDaoSupport源码 1.2以上的版本: 1.1.1版本: 解决方法:1.2版本移除了@Autowired的注解,所以如果是1.2版本以上,要在BaseDaoImpl里面手动 注入SetSessionTemplate或者SetSessionFactory spring整合mybatis遇到的bug java.lang.IllegalArgumentException: Property 'sqlSessionFa

Spring整合Mybatis解决 Property &#39;sqlSessionFactory&#39; or &#39;sqlSessionTemplate&#39; are required

在Spring4和Mybatis3整合的时候,dao层注入'sqlSessionFactory'或'sqlSessionTemplate'会报错解决办法如下: package com.alibaba.webx.MyWebxTest.myWebX.module.dao.impl; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.m

spring 整合Mybatis 《错误集合,总结更新》

错误:nested exception is java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor  运行环境:jdk1.7.0_17 + tomcat 7 + eclipse spring整合mybatis启动时候出现這个错误: SEVERE: Exception sending context initialized event to listener instance of class org

spring源码剖析(八)spring整合mybatis原理

前言 MyBatis相信很多人都会使用,但是当MyBatis整合到了Spring中,我们发现在Spring中使用更加方便了.例如获取Dao的实例,在Spring的我们只需要使用注入的方式就可以了使用Dao了,完全不需要调用SqlSession的getMapper方法去获取Dao的实例,更不需要我们去管理SqlSessionFactory,也不需要去创建SqlSession之类的了,对于插入操作也不需要我们commit. 既然那么方便,Spring到底为我们做了哪些工作呢,它如何将MyBatis整

spring整合mybatis错误:class path resource [config/spring/springmvc.xml] cannot be opened because it does not exist

spring 整合Mybatis 运行环境:jdk1.7.0_17+tomcat 7 + spring:3.2.0 +mybatis:3.2.7+ eclipse 错误:class path resource [config/spring/springmvc.xml] cannot be opened because it does not exist 错误原因:找不到我的springmvc.xml,在下面web.xml中是我引用路径,网上找到问题classpath指向路径不是resource路

Spring整合MyBatis完整示例

为了梳理前面学习的内容<Spring整合MyBatis(Maven+MySQL)一>与<Spring整合MyBatis(Maven+MySQL)二>,做一个完整的示例完成一个简单的图书管理功能,主要使用到的技术包含Spring.MyBatis.Maven.MySQL及简单MVC等.最后的运行效果如下所示: 项目结构如下: 一.新建一个基于Maven的Web项目 1.1.创建一个简单的Maven项目,项目信息如下: 1.2.修改层面信息,在项目上右键选择属性,再选择“Project

Mybatis入门——Spring整合MyBatis

Spring整合MyBatis 对Teacher表进行添加数据和查看数据 1. 创建数据库表 CREATE TABLE `teacher` (  `t_id` varchar(15) NOT NULL,  `t_name` varchar(30) DEFAULT NULL,  PRIMARY KEY (`t_id`)) 2.创建Spring工程 3.导入相关包 mybatis-spring-1.3.0.jar mybatis-3.3.0.jar mysql-connector-java-5.1.

分析下为什么spring 整合mybatis后为啥用不上session缓存

因为一直用spring整合了mybatis,所以很少用到mybatis的session缓存. 习惯是本地缓存自己用map写或者引入第三方的本地缓存框架ehcache,Guava 所以提出来纠结下 实验下(spring整合mybatis略,网上一堆),先看看mybatis级别的session的缓存 放出打印sql语句 configuration.xml 加入 <settings> <!-- 打印查询语句 --> <setting name="logImpl"

spring整合mybatis(hibernate)配置

一.Spring整合配置Mybatis spring整合mybatis可以不需要mybatis-config.xml配置文件,直接通过spring配置文件一步到位.一般需要具备如下几个基本配置. 1.配置数据源(连接数据库最基本的属性配置,如数据库url,账号,密码,和数据库驱动等最基本参数配置) 1 <!-- 导入properties配置文件 --> 2 <context:property-placeholder location="classpath*:/jdbc.prop