初学 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 直接从中段开始,果然有些费力啊!!!