Spring整合Mybatis的注意事项

Posted 所需即所学的老菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 直接从中段开始,果然有些费力啊!!!

 

以上是关于Spring整合Mybatis的注意事项的主要内容,如果未能解决你的问题,请参考以下文章

Spring整合Mybatis的注意事项

spring-springmvc-mybatis整合

Mybatis与Spring的整合

spring框架学习:Spring整合Web项目整合Mybatis

Mybatis学习--spring和Mybatis整合

请教mybatis+spring+atomikos的整合问题