闪入...
在了解本项目前,如果想简单的了解下Mybatis的工程搭建,最好先参考下本人的另一篇文章:
MyBatis工程Demo示例,通过Mapper接口方式接连数据库
下面开始Spring与Mybatis框架的整合
1、构建Maven工程(后续可能会梳理详细的Maven构建步骤) SpringMybatisHelloWorld
2、引入依赖的Jar包,主要是Spring4.0相关Jar包、Mybatis3.2相关的Jar包、数据库驱动Jar包、日志Jar包等;详见pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ltcui.com</groupId>
<artifactId>SpringMybatisHelloWorld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.0.4.RELEASE</spring.version>
<mybatis.version>3.2.8</mybatis.version>
<mybatis-spring.version>1.2.3</mybatis-spring.version>
<oracle.driver.version>11.2.0.3.0</oracle.driver.version>
<druid.version>1.0.18</druid.version>
<logback.version>1.1.3</logback.version>
<logback-ext-spring.version>0.1.2</logback-ext-spring.version>
<junit.version>3.8.1</junit.version>
</properties>
<dependencies>
<!--Spring Core start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Spring Core end -->
<!-- mybatis start -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- mybatis end -->
<!-- db oracle -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>${oracle.driver.version}</version>
</dependency>
<!-- db oracle -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>jconsole</artifactId>
</exclusion>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>tools</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- logback start -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>${logback-ext-spring.version}</version>
</dependency>
<!-- logback end -->
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
<!-- 指定maven编译方式为jdk1.7版本 -->
<profiles>
<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
</project>
3、配置web.xml文件 核心配置文件,启用Spring相关监听事件,同时引入Spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>SpringMybatisHelloWorld</display-name>
<listener>
<description>Spring</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置统一编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
4、配置 applicationContext.xml 文件 内容:加载外部properties配置文件,配置数据源,配置Mybatis中mapper文件的扫描,以及项目中针对Spring相关组件注解等的扫描
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 指定spring读取db.properties配置 -->
<context:property-placeholder location="classpath:connection.properties"/>
<!--容器自动扫描IOC组件 -->
<context:component-scan base-package="com.ltcui" />
<!-- druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<!-- 数据库基本信息配置 -->
<property name="url" value="${connect.oracle.url}" />
<property name="username" value="${connect.oracle.username}" />
<property name="password" value="${connect.oracle.password}" />
<property name="driverClassName" value="${connect.oracle.driverClassName}" />
<property name="filters" value="${connect.oracle.filters}" />
<!-- 最大并发连接数 -->
<property name="maxActive" value="${connect.oracle.maxActive}" />
<!-- 初始化连接数量 -->
<property name="initialSize" value="${connect.oracle.initialSize}" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${connect.oracle.maxWait}" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="${connect.oracle.minIdle}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${connect.oracle.timeBetweenEvictionRunsMillis}" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${connect.oracle.minEvictableIdleTimeMillis}" />
<property name="validationQuery" value="${connect.oracle.validationQuery}" />
<property name="testWhileIdle" value="${connect.oracle.testWhileIdle}" />
<property name="testOnBorrow" value="${connect.oracle.testOnBorrow}" />
<property name="testOnReturn" value="${connect.oracle.testOnReturn}" />
<property name="maxOpenPreparedStatements" value="${connect.oracle.maxOpenPreparedStatements}" />
<!-- 打开removeAbandoned功能 -->
<property name="removeAbandoned" value="${connect.oracle.removeAbandoned}" />
<!-- 1800秒,也就是30分钟 -->
<property name="removeAbandonedTimeout" value="${connect.oracle.removeAbandonedTimeout}" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="${connect.oracle.logAbandoned}" />
</bean>
<!-- MyBatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 显式指定Mapper文件位置 -->
<property name="mapperLocations" value="classpath*:com/ltcui/**/mapper/*Mapper.xml" />
<!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
<property name="typeAliasesPackage" value="com.ltcui.**.entity"/>
</bean>
</beans>
其中需要特殊说明的是 <property name="mapperLocations" value="classpath*:com/ltcui/**/mapper/*Mapper.xml" /> 这里的classpath处,发现如果后面的路径使用通配符的话,需要写成 classpath* 表示告诉程序使用通配符来解析后面的mapper.xml文件路径,不过classpath*会所有项目工程中的所有路径,所以在使用的时候,后面的路径尽量精确!
5、数据库连接配置 connection.properties
#连接数据库相关配置 ORACLE 开始####
connect.db=oracle
connect.oracle.url=jdbc:oracle:thin:@//127.0.0.1:1521/orcl
connect.oracle.driverClassName=oracle.jdbc.driver.OracleDriver
connect.oracle.username=yqzhilan
connect.oracle.password=yqzhilan
connect.oracle.filters=stat
#数据库最大连接池数量(可修改)
connect.oracle.maxActive=20
#数据库初始化时建立物理连接的个数(可修改)
connect.oracle.initialSize=5
#数据库获取连接时最大等待时间,单位毫秒
connect.oracle.maxWait=60000
#数据库最小连接池数量(可修改)
connect.oracle.minIdle=10
#数据库最大空闲数数量(可修改)
connect.oracle.maxIdle=50
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
connect.oracle.timeBetweenEvictionRunsMillis=60000
#一个连接在池中最小生存的时间,单位是毫秒
connect.oracle.minEvictableIdleTimeMillis=300000
connect.oracle.validationQuery=SELECT 'x' FROM DUAL
connect.oracle.testWhileIdle=true
connect.oracle.testOnBorrow=false
connect.oracle.testOnReturn=false
connect.oracle.maxOpenPreparedStatements=20
connect.oracle.removeAbandoned=true
connect.oracle.removeAbandonedTimeout=1800
connect.oracle.logAbandoned=true
#连接数据库相关配置 结束####
6、统一使用Logback来输出日志信息 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<!-- 定义日志的根目录 -->
<property name="LOG_HOME" value="D:/MyWorkData/YQZL/logs/SpringMybatisHelloWorld" />
<property name="appName" value="SpringMybatisHelloWorld"></property>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</layout>
</appender>
<appender name="appLogAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${appName}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<MaxHistory>90</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
</layout>
</appender>
<appender name="metricsLogAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/metrics/${appName}.metrics.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${appName}-metrics-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<MaxHistory>90</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%logger{50}] {%msg}%n</pattern>
</layout>
</appender>
<logger name="com.ltcui" level="debug" additivity="true"></logger>
<logger name="metrics" level="debug" additivity="true">
<appender-ref ref="metricsLogAppender" />
</logger>
<root level="info">
<appender-ref ref="stdout" />
<appender-ref ref="appLogAppender" />
</root>
</configuration>
8、写个 MybatisFactoryUtils.java 类来获取SqlSessionFactory对象,判断是否能成功连接数据库;
package com.ltcui;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MybatisFactoryUtils {
private static Logger logger = LoggerFactory.getLogger(MybatisFactoryUtils.class);
private static SqlSessionFactory factory = null;
/**
* 单例模式 获取 SqlSessionFactory 对象
*
* @return
*/
public static SqlSessionFactory getSessionFactory() {
if(MybatisFactoryUtils.factory == null){
synchronized(MybatisFactoryUtils.class){
if(MybatisFactoryUtils.factory == null){
logger.info("^_^初始化Spring配置文件 applicationContext.xml >>>>>> ");
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
logger.info("^_^初始化 Mybatis SqlSessionFactory >>>>>> ");
MybatisFactoryUtils.factory = (SqlSessionFactory)ctx.getBean("sqlSessionFactory");
}
}
}
return MybatisFactoryUtils.factory;
}
}
9、在src/test/main目录中新建与 MybatisFactoryUtils.java 同目录下的测试类 TestMybatisFactoryUtils.java
当然也可以在 MybatisFactoryUtils.java 类里面写Main方法来执行,不过建议按照标准的方式来,一个标准的工程里面,一般只有主程序入口类里面有main方法,其他类里面不建议有main方法:
package com.ltcui;
public class MybatisFactoryUtilsTest {
private static void tetsGetSessionFactory() {
System.out.println(MybatisFactoryUtils.getSessionFactory());
}
public static void main(String[] args) {
tetsGetSessionFactory();
}
}
10、下面开始实例测试 测试模块为学生管理 所在工程目录 : src/main/java/com/ltcui.student
在该模块中,逻辑功能划分
entity -- 模块下所有的实体类 (统一管理,也方便Mybatis自动扫描)
mapper --数据DAO接口,直接操作数据库的原子单位 (接口名称习惯与*Mapper.xml名称一致同时也放在同一个目录下,介时功能模块多的时候,就能看出这样做的好处来)
mapper.impl --数据DAO接口实现类 (对DAO接口通过SqlSessionFactory提供的SqlSession对象来执行,获取执行结果)
services --业务处理类 (在分布式项目部署时,这一层往往会被单独拆出去,拆出去后会使用 *Service与*ServiceImpl的形式来统一管理 ),本工程就不把services层再拆分出接口与实现接口了
工程截图如下:
11、完整的工程目录截图如下:
至此结束,谢谢!
源代码请点击下载 SpringMybatisHelloWorld
闪出 ... ...