zoukankan      html  css  js  c++  java
  • 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 直接从中段开始,果然有些费力啊!!!

  • 相关阅读:
    实现新layer的时候易犯的错误
    caffe实现focal loss层的一些理解和对实现一个layer层易犯错的地方的总结
    面经准备
    发送广播
    labelme也可以标注polygan
    中期答辩准备的东西
    授人以鱼,不如授人以渔
    python中strip()函数的理解
    栈的应用
    checkStyle使用具体解释
  • 原文地址:https://www.cnblogs.com/bashenandi/p/spring-with-mybatis-concept.html
Copyright © 2011-2022 走看看