基於Maven的Spring+SpringMVC+Mybatis的一個小項目的搭建,由於使用Maven3.1.0管理,所以Spring等都將使用的是時下(2013/9/8)最新的版本。即從http://search.maven.org/ 得到最新的POM文件。
以下是我的一步一步實現步驟:
1, cmd 下面輸入
mvn archetype:generate -DgroupId=com.vanceinfo.javaserial -DartifactId=ssme -DarchetypeArtifactId=maven-archetype-webapp -DpackageName=com.vanceinfo.javaserial
2,Kepler中導入已存在的maven 項目,卻發現沒有src/main/java 和src/test/java兩個source folder,只有一個src/main/resources source folder. 要解決這個問題,只需要項目屬性中改一下System library就可以看到了。如圖示
3,接下來,由於我們要使用Spring 和mybatis,所以我們需要引用相關的依賴進POM.xml文件里面。為保持時下的最新性,首先進入search.maven.org里面,搜索spring-core,得到最新版本號為3.2.4.RELEASE,所以復制如下pom至pom.xml 文件。

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.4.RELEASE</version> </dependency>
保存之后,注意觀察Eclipse 上面的Maven Dependencies里面自動加上了commons-logging-1.1.1.jar,也就是說你需要使用什么Jar,直接引用該Jar即可,無需顧慮其依賴的Jar,其依賴的Jar,Maven會自動加載上去的。這也是Maven的一大引人注目的亮點。
當然,作為時下最新的版本,要使用Spring,還需要引用spring-context的。

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.4.RELEASE</version> </dependency>
經實驗,實際上還需要spirng-tx的。

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>3.2.4.RELEASE</version> </dependency>
以及spring-jdbc

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>3.2.4.RELEASE</version> </dependency>
4, 繼續引入mybatis

<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.2</version> </dependency>
以及mybatis和spring之間的溝通mybatis-spring1.2.0

<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.0</version> </dependency>
5, 引入了mybatis,自然會有關系型數據庫的驅動包,這里我選用mysql數據庫,所以要引入mysql-connector-java5.1.26

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.26</version> </dependency>
順帶改一下junit的版本,因為我從maven.org里看到最新的junit是4.11,所以用最時下最新的,改完之后,發現eclipse自動引用了hamcrest-core-1.3.jar
6, 接下來在mysql中創建一個表user,用mysqlworkbench打開。為演示方便,我直接使用了test數據庫,創建了一個只有3個字段的user表,並且只輸入了兩條數據。
7, 使用mybatis generator(MBG) 工具生成dao,mapping和model,使用的generator.xml如下:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 數據庫驅動包位置 --> <classPathEntry location="C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\5.1.26\mysql-connector-java-5.1.26.jar" /> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <!-- 數據庫鏈接URL、用戶名、密碼 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- 生成模型的包名和位置 --> <javaModelGenerator targetPackage="com.vanceinfo.javaserial.model" targetProject="E:\Java\mybatis-generator-core-1.3.2\lib\src"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- 生成的映射文件包名和位置 --> <sqlMapGenerator targetPackage="com.vanceinfo.javaserial.mapping" targetProject="E:\Java\mybatis-generator-core-1.3.2\lib\src"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 生成DAO的包名和位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.vanceinfo.javaserial.dao" targetProject="E:\Java\mybatis-generator-core-1.3.2\lib\src"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- 要生成那些表(更改tableName和domainObjectName就可以) --> <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" /> </context> </generatorConfiguration>
然后創建一個MBG_HOME的環境變量和一個mbg.cmd的文件,該cmd內容如下:
java -jar %MBG_HOME%\lib\mybatis-generator-core-1.3.2.jar -configfile %MBG_HOME%\lib\generator.xml -overwrite
cmd中運行mbg就會分別生成dao,mapping,model,將這三個文件夾復制至java下面,然后刷新eclipse里面的方案,即可。
8, 接下來就是Java的代碼編寫了,主要是service 和 controller的編寫,極其簡單:

public interface IUserService { public User getUserById(int id); } @Service("userService") public class UserServiceImpl implements IUserService { private UserMapper userMapper; public UserMapper getUserMapper() { return userMapper; } @Autowired public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; } @Override public User getUserById(int id) { return userMapper.selectByPrimaryKey(id); } }

@Controller @RequestMapping("/userController") public class UserController { private IUserService userService; public IUserService getUserService() { return userService; } @Autowired public void setUserService(IUserService userService) { this.userService = userService; } @RequestMapping("/{id}/index") public String showUser(@PathVariable int id, HttpServletRequest request) { User u = userService.getUserById(id); request.setAttribute("user", u); return "index"; } }
您也可以從隨后的附件下載中查閱完整代碼,實現后的代碼結構如下所示:
作為Maven管理的項目,src/main/resource就是那個classpath的根目錄了,而且還需要注意一點就是mvn打包時不會把src/main/java source folder下面的.xml之類的文件包進war包的,解決方案是在pom中手動加上resource節點,結構是

<build>
<resources>
<resource>
<directory>src/main/java<directory>
<includes>
<include>*.xml</include>
.. ..
</includes>
</resource>
.......
</resources>
</build>
9, 使用mvn clean install就會在target下面生成一個叫ssme.war的文件,將該文件復制進tomcat的webapps文件下面,啟動tomcat. 啟動mysqld,然后在瀏覽器上面敲入 http://localhost:8080/ssme/userController/1/index.do,應該就可以看到:
10, Trouble shouting, 要學會看log,尤其是tomcat啟動時,如果有錯就會有各種錯誤日志出來,學會從這些日志里找出根源,然后處理,上面為了出現那簡短的兩個字段,我還真是重新啟動了好幾次tomcat7才搞定的。一般都是少了pom引用。列舉一些如下:

SEVERE: Context initialization failed org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Config uration problem: Unable to locate Spring NamespaceHandler for XML schema namespa ce [http://www.springframework.org/schema/tx] Offending resource: class path resource [spring-mybatis.xml]

org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find clas s [org.springframework.jdbc.datasource.DataSourceTransactionManager] for bean wi th name 'transactionManager' defined in class path resource [spring-mybatis.xml] ; nested exception is java.lang.ClassNotFoundException: org.springframework.jdbc .datasource.DataSourceTransactionManager

<build>
<finalName>ssme</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml </include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*.xml </include>
<include>*.properties </include>
</includes>
</resource>
<resource>
<directory>src/main/webapp/WEB-INF</directory>
<includes>
<include>*.xml </include>
<include>*.properties </include>
</includes>
</resource>
</resources>
</build>
11,接下來我們還引入log4j這個組件來,首先當然是在pom中加入:

<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
接着在需要寫日志的java源文件中定義private static final Logger logger = Logger.getLogger(XXXXXX.class);
然后在log4j.properties中輸入, 這個基本上沒有什么改變的,要改的就是log4j.appender.File.File=ssme.log,改成自己的項目名或其它你喜歡的名字即可。

log4j.rootLogger=DEBUG,Console,File log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.Target=System.out log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=[%c]%m%n log4j.appender.File=org.apache.log4j.RollingFileAppender log4j.appender.File.File=ssme.log log4j.appender.File.MaxFileSize=10MB log4j.appender.File.Threshold=ALL log4j.appender.File.layout=org.apache.log4j.PatternLayout log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n
12, 單元測試,由於本次主要是找spring 和mybatis的整合,所以只對userService時進行了一下單元測試,其余的象controller之類的,暫沒有列入。其實本人公司 要求使用Parameter集成測試。以后找個理由來討論一下這個參數化單元測試。代碼比較簡單,所以您可以打開在線查看一下

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:spring.xml", "classpath:spring-mybatis.xml" }) public class UserServiceImplTest { private static final Logger logger = Logger.getLogger(UserServiceImplTest.class); private IUserService userService; public IUserService getUserSerivce() { return userService; } @Autowired public void setUserSerivce(IUserService userSerivce) { this.userService = userSerivce; } @Test public void getUserByIdtest() { User u = userService.getUserById(1); logger.info(JSON.toJSONStringWithDateFormat(u, "yyyy-MM-dd HH:mm:ss")); } }
由於使用了log4j來查看取回來的User 數據,同時為了查看方便,再次引用阿里巴巴的溫少的fastjson,利用該組件,我們將看到返回的信息是
{"email":"jin@163.com","id":1,"name":"nate"}
結果正確,所以講解一下上面這段代碼如何正確運行。引入以下兩個pom

<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.36</version> </dependency>

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.2.4.RELEASE</version> </dependency>
本文參考學習地址包括但不限於http://bbs.jeasyuicn.com/forum.php?mod=viewthread&tid=818&extra=page%3D1,最后附上完整項目源碼供您下載。