Java系列--第一篇 Maven+Spring+Spring MVC+mybatis 示例


基於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就可以看到了。如圖示

http://images.cnblogs.com/cnblogs_com/SLKnate/515382/o_findout-sourcepath.png

 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>
spring-core-3.2.4-RELEASE

保存之后,注意觀察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>
spring-context-3.2.4-RELEASE

經實驗,實際上還需要spirng-tx的。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>3.2.4.RELEASE</version>
</dependency>
spirng-tx-3.2.4-RELEASE

以及spring-jdbc

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

4, 繼續引入mybatis

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.2</version>
</dependency>
mybatis3.2.2

以及mybatis和spring之間的溝通mybatis-spring1.2.0

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.0</version>
</dependency>
mybatis-spring1.2.0

5, 引入了mybatis,自然會有關系型數據庫的驅動包,這里我選用mysql數據庫,所以要引入mysql-connector-java5.1.26

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.26</version>
</dependency>
mysql-connector-java5.1.26

順帶改一下junit的版本,因為我從maven.org里看到最新的junit是4.11,所以用最時下最新的,改完之后,發現eclipse自動引用了hamcrest-core-1.3.jar

6, 接下來在mysql中創建一個表user,用mysqlworkbench打開。為演示方便,我直接使用了test數據庫,創建了一個只有3個字段的user表,並且只輸入了兩條數據。

http://images.cnblogs.com/cnblogs_com/SLKnate/515382/o_mysql.png

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>
generator.xml

然后創建一個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);
    }

}
service
@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";
    }
}
controller

您也可以從隨后的附件下載中查閱完整代碼,實現后的代碼結構如下所示:

http://images.cnblogs.com/cnblogs_com/SLKnate/515382/o_eclipse_project.PNG

 作為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>       
include static xml in src/main/java

9, 使用mvn clean install就會在target下面生成一個叫ssme.war的文件,將該文件復制進tomcat的webapps文件下面,啟動tomcat. 啟動mysqld,然后在瀏覽器上面敲入 http://localhost:8080/ssme/userController/1/index.do,應該就可以看到:

 http://images.cnblogs.com/cnblogs_com/SLKnate/515382/o_result.PNG

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]
引入spring-tx3.2.4-RELEASE即可解決
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
引入spring-jdbc3.2.4-RELEASE即可解決
<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>
解決src/main/java下的靜態文件打包進war的問題

 11,接下來我們還引入log4j這個組件來,首先當然是在pom中加入:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
log4j1.2.17

接着在需要寫日志的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
log4j_ssme

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"));
    }
}
unit test

由於使用了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>
fastjson1.1.36
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>3.2.4.RELEASE</version>
</dependency>
spring-test3.2.4-RELEASE

 

本文參考學習地址包括但不限於http://bbs.jeasyuicn.com/forum.php?mod=viewthread&tid=818&extra=page%3D1最后附上完整項目源碼供您下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM