天天看點

SpringMybatisHelloWorld(Spring4.x與Mybatis3.x架構整合示例)

閃入...

在了解本項目前,如果想簡單的了解下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/ltcuimapper/*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層再拆分出接口與實作接口了

工程截圖如下:

SpringMybatisHelloWorld(Spring4.x與Mybatis3.x架構整合示例)

11、完整的工程目錄截圖如下:

SpringMybatisHelloWorld(Spring4.x與Mybatis3.x架構整合示例)

至此結束,謝謝!

源代碼請點選下載下傳 SpringMybatisHelloWorld

閃出 ... ...