1. 程式人生 > >SpringMvc+MyBatis+MySQL+Maven+Redis搭建一個基礎的web專案

SpringMvc+MyBatis+MySQL+Maven+Redis搭建一個基礎的web專案

前言

近來由於公司專案的需要,暫時放下了前端android的開發,慢慢投入到後臺介面系統搭建,在經過與眾兄弟的討論下,決定就使用最常規的框架去搭建一個後臺介面系統,這樣一方面大家都比較的熟悉,另一方面對於新人和後期的維護都會相對比較容易一些,因此,針對這一系列框架最基礎的搭建,在此做一個簡單的總結,希望能對這一塊兒還相對陌生的猿猿能有所幫助

先上原始碼,點選下載
閱讀請參考部落格:SpringMvc+MyBatis+MySQL+Maven+Redis搭建一個基礎的web專案

軟體安裝及資源配置

JDK安裝

  • jdk下載
    jdk1.8下載之後,安裝;
  • 環境變數配置
    • “我的電腦”–>右鍵–>屬性–>高階系統設定–>環境變數–>系統變數–>新建–>新增一項“JAVA_HOME”路徑為jdk的安裝路徑,如下圖:
    • 然後path中新增 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;,如下圖:
    • 測試
      cmd下輸入:java -version 如下圖效果說明安裝成功

MyEclipse10安裝及破解

  • 資源下載

    MyEclipse10及破解工具下載入口
  • 安裝及破解
    MyEclipse的安裝就是next next…finish即可;其中破解工具開啟軟體日誌欄中寫有相應的教程,請參考教程步驟;一步步破解,這是我目前發現最好用的一個破解工具。

Maven安裝及配置

(根據個人需要;可用可不用)
- 資源下載
maven-3.2.1版本下載
- 解壓壓縮包
如下圖:

- 配置環境變數
- 如第一步中配置jdk一樣,進入到環境變數配置頁面
- 新增“MAVEN_HOME”配置解壓後maven的路徑
如下圖:

- 將maven路徑指定到path下
如下圖:
這裡寫圖片描述
- 測試
開啟cmd (如果還是之前測試jdk的cmd視窗,請關閉了重新開啟)輸入:mvn -v 如果出現以下效果,說明已經安裝成功:

- 調整maven的配置檔案
- 找到解壓路徑下的conf檔案,進去找到setting.xml配置檔案
- 將該配置檔案拷貝至“C:\Users\Administrator.m2”路徑下
配置到這裡的目的是為了以後我們更新了maven的版本之後,不需要出現配置setting檔案,至需要更換一下環境變數即可,如下圖:

- 開啟setting檔案,找到“localRepository”配置自己本機maven倉庫的路徑(根據個人習慣配置),如果不配置這個路徑,預設會在將以下路徑“C:\Users\Administrator.m2\repository“作為Maven倉庫

- Myeclipse配置Maven
開啟MyEclipse,選擇Window–>Preferences–>Maven4MyEclipse–>User Settings,配置上一步中修改的settings.xml檔案,如下圖:


MySQL下載及安裝

  • 資源下載
    MySQL安裝版、免安裝版及Navicat破解版下載
  • 安裝
    • MySQL安裝版安裝
      以上鍊接中下載MySQL安裝版,解壓,安裝,然後next next …finish即可
    • 免安裝版安裝
      請參考之前的部落格MySQL安裝及視覺化工具使用
    • Navicat(MySQL)視覺化工具安裝及破解
      下載以上鍊接中Navicat工具,根據個人電腦的情況選擇32位或者64位的安裝;安裝完之後執行”patchNavicat.exe”即可完成工具破解

Tomcat下載及安裝

  • 資源下載
    Tomcat 7.0資源下載;rar和exe檔案為安裝版tomcat,zip包為免安裝版tomcat;根據需要下載相應的檔案;演示選擇的exe安裝版。
  • Tomcat安裝
    老規矩,next next.. finish即可;安裝路徑最好不要出現空格在裡面;隱隱約約記得好像Tomcat的全路徑中有空格在什麼地方是會有問題;具體什麼問題也記不清了;也可能是我記錯了;嘮叨一句,選擇一個不含空格的路徑安裝;以防萬一。
  • MyEclipse配置Tomcat
    開啟MyEclipse,選擇Window–>Preferences–>MyEclipse–>service–>Tomcat 7.x;按如下圖配置上面步驟中安裝的路徑;

    注:記得要勾選上“Enable”選項,否則這個配置將不會生效;
  • 測試Tomcat
    • 啟動服務
      按下圖步驟啟動服務,見日誌欄中出現下圖中的日誌,說明服務啟動成功;
    • 瀏覽器測試
      瀏覽器中輸入:localhost:8080;如出現如下效果,說明tomcat配置成功;

Redis下載及安裝

(根據個人需要,redis可用可不用)
可參考資料Redis安裝

  • 資源下載
    Redis-x64-3.2.100下載,並解壓安裝包
  • 啟動服務
    cmd下進入解壓目錄,輸入:redis-server.exe redis.windows.conf;見到如下圖效果,說明服務已經啟動成功了。
  • redis客戶端測試
    新起一個cmd視窗(注意上面的服務cmd視窗不要關閉了);輸入:redis-cli.exe -h 127.0.0.1 -p 6379 連結到本地redis的服務;通過set、get指令測試存取值正常;如下圖:

專案搭建

專案建立

  • 建立maven專案

    • 專案搭建
      右鍵–>New–>Web Project;輸入專案名,選擇j2ee 6.0,勾選上Add Maven support,點選finish,如下圖

    • 建立成功之後為如下結構:

  • 專案結構調整

    • 建立基礎的資源配置、測試程式碼、測試資源配置資料夾
      右鍵–>build Path–>New Source Folder

      或者右鍵–>New–>Source Folder

      然後分別建立“src/main/resources”、”src/test/java”、”src/test/resources” 如下圖:
  • 整理程式碼及資源配置檔案結構

    按以上結構分別建立資料夾即可

資料庫基礎資料準備

  • 建立一個簡單的使用者表,使用者測試即可,如下圖:

    建立指令碼如下

    Date: 2017-07-02 19:20:45
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for userinfo
    -- ----------------------------
    DROP TABLE IF EXISTS `userinfo`;
    CREATE TABLE `userinfo` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `NAME` varchar(20) NOT NULL,
      `AGE` int(5) DEFAULT NULL,
      `SEX` int(1) DEFAULT NULL,
      `ADD` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of userinfo
    -- ----------------------------
    INSERT INTO `userinfo` VALUES ('1', '張三', '10', '0', '北京');
    INSERT INTO `userinfo` VALUES ('2', '李四', '20', '1', '上海');
    INSERT INTO `userinfo` VALUES ('3', '趙五', '23', '1', '廣州');
    INSERT INTO `userinfo` VALUES ('4', '錢六', '50', '0', '臺灣');

外掛配置

  • Maven的pom.xml配置

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- spring版本號 -->
        <spring.version>3.2.8.RELEASE</spring.version>
        <!-- log4j日誌檔案管理包版本 -->
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <!-- junit版本號 -->
        <junit.version>4.10</junit.version>
        <!-- mybatis版本號 -->
        <mybatis.version>3.2.1</mybatis.version>
    </properties>
    
    <dependencies>
        <!-- 新增Spring依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</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-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
    
        <!--單元測試依賴 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    
        <!-- 日誌檔案管理包 -->
        <!-- log start -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log end -->
    
        <!--spring單元測試依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
    
        <!--mybatis依賴 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
    
        <!-- mybatis/spring包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.0</version>
        </dependency>
    
        <!-- mysql驅動包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.29</version>
        </dependency>
    
        <!-- javaee-api包 注意和專案使用的JDK版本對應 -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
    
        <!-- javaee-web-api包 注意和專案使用的JDK版本對應 -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
    
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.4</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.7.4</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.7.4</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.32</version>
        </dependency>
    
        <!-- redis -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.3.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.6.2</version>
        </dependency>
    </dependencies>

    新增成功儲存,Maven會自動下載相應的對應版本的包到本地倉庫;由於部分資源包在不同的網路環境下下載會比較慢,如果Maven下載不下來,我在百度雲盤共享了一份上面各個版本對應的包,可以下載下來解壓到本地的倉庫即可使用;點選下載

  • MyBatis配置

    • jdbc屬性配置檔案
      在properties資料夾下建立jdbc.properties,並配置以下引數:

      jdbc_driverClassName=com.mysql.jdbc.Driver
      jdbc_url=jdbc:mysql://127.0.0.1:3306/springmvcdb
      jdbc_username=lpf
      jdbc_password=123456
    • mybatis配置
      這裡直接配置在application.xml;請參考後續的applocation配置

  • redis配置

    • redis引數配置檔案
      在redis資料夾下建立redis.properties,新增如下引數:

      redis.pool.maxTotal=105
      redis.pool.maxIdle=10
      redis.pool.maxWaitMillis=5000
      redis.pool.testOnBorrow=true
      redis.host=127.0.0.1
      redis.port=6379
      redis.password=
      redis.db.index=0
    • redis基礎配置
      在redis下建立redis-config.xml檔案,並新增一下配置檔案:

      <?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.xsd   
              http://www.springframework.org/schema/context   
              http://www.springframework.org/schema/context/spring-context.xsd">
      
          <!-- 快取的層級 -->
          <context:component-scan base-package="com.lpf.springmvc" />
          <!-- 引入redis配置 -->
          <!-- <context:property-placeholder location="redis.properties" ignore-unresolvable="true" 
              /> -->
      
          <!-- Redis 配置 -->
          <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
              <property name="maxTotal" value="${redis.pool.maxTotal}" />
              <property name="maxIdle" value="${redis.pool.maxIdle}" />
              <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}" />
              <property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
          </bean>
      
          <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
              <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
              <constructor-arg name="host" value="${redis.host}" />
              <constructor-arg name="port" value="${redis.port}" type="int" />
              <constructor-arg name="timeout" value="${redis.pool.maxWaitMillis}" type="int" />
              <constructor-arg name="password" value="#{'${redis.password}'!=''?'${redis.password}':null}" />
              <constructor-arg name="database" value="${redis.db.index}" type="int" />
          </bean>
      
          <!-- JedisCluster 叢集高可用配置 -->
          <!--<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg 
              index="0"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg 
              index="0" value="${redis.ip1}" /> <constructor-arg index="1" value="${redis.port1}" 
              type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg 
              index="0" value="${redis.ip2}" /> <constructor-arg index="1" value="${redis.port2}" 
              type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg 
              index="0" value="${redis.ip3}" /> <constructor-arg index="1" value="${redis.port3}" 
              type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg 
              index="0" value="${redis.ip4}" /> <constructor-arg index="1" value="${redis.port4}" 
              type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg 
              index="0" value="${redis.ip5}" /> <constructor-arg index="1" value="${redis.port5}" 
              type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg 
              index="0" value="${redis.ip6}" /> <constructor-arg index="1" value="${redis.port6}" 
              type="int" /> </bean> </set> </constructor-arg> <constructor-arg index="1" 
              value="2000" type="int"></constructor-arg> <constructor-arg index="2" value="100" 
              type="int"></constructor-arg> <constructor-arg index="3" ref="jedisPoolConfig"></constructor-arg> 
              </bean> -->
      
          <!--redis Sentinel主從高可用方案配置 -->
          <!-- <bean id="sentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration"> 
              <property name="master"> <bean class="org.springframework.data.redis.connection.RedisNode"> 
              <property name="name" value="master-1"></property> </bean> </property> <property 
              name="sentinels"> <set> <bean class="org.springframework.data.redis.connection.RedisNode"> 
              <constructor-arg name="host" value="${sentinel1.ip}"></constructor-arg> <constructor-arg 
              name="port" value="${sentinel1.port}"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisNode"> 
              <constructor-arg name="host" value="${sentinel2.ip}"></constructor-arg> <constructor-arg 
              name="port" value="${sentinel2.port}"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisNode"> 
              <constructor-arg name="host" value="${sentinel3.ip}"></constructor-arg> <constructor-arg 
              name="port" value="${sentinel3.port}"></constructor-arg> </bean> </set> </property> 
              </bean> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
              p:use-pool="true"> <property name="password" value="${redis.pass}" /> <property 
              name="poolConfig"> <ref bean="jedisPoolConfig" /> </property> <constructor-arg 
              name="sentinelConfig" ref="sentinelConfiguration" /> </bean> -->
      
          <!-- redis單節點資料庫連線配置 -->
          <bean id="jedisConnectionFactory"
              class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
              <property name="hostName" value="${redis.host}" />
              <property name="port" value="${redis.port}" />
              <property name="password" value="${redis.password}" />
              <property name="poolConfig" ref="jedisPoolConfig" />
          </bean>
      
          <!-- redisTemplate配置,redisTemplate是對Jedis的對redis操作的擴充套件,有更多的操作,封裝使操作更便捷 -->
          <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
              <property name="connectionFactory" ref="jedisConnectionFactory" />
          </bean>
      
      </beans> 
    • redis dao層相關配置

      • 介面定義
        在Dao檔案加下建立一個用於獲取redis下資料的介面(以獲取一個文字型的資料為例)

        package com.lpf.springmvc.dao;
        
        import org.springframework.stereotype.Repository;
        
        @Repository
        public interface RedisDao
        {
            String get(String key);
        }
      • 建立Jedis幫助物件
        一個公共的幫助類,程式碼太長,放到網盤了,下載下來即可:JedisUtil

      • 建立dao的具體實現
        在dao檔案下建立RedisDaoImpl,實現RedisDao介面,程式碼如下:
        package com.lpf.springmvc.dao;
        
        import javax.annotation.Resource;
        
        import com.lpf.springmvc.utils.JedisUtil;
        
        import redis.clients.jedis.JedisPool;
        
        public class RedisDaoImpl implements RedisDao
        {
            @Resource
            JedisPool jedisPool;
        
            public String get(String key)
            {
                // TODO Auto-generated method stub
                JedisUtil jedisUtil = new JedisUtil(jedisPool);
                JedisUtil.Strings strings = jedisUtil.new Strings();
                System.out.println("cache: " + strings.get(key));
                return strings.get(key);
            }
        
        }

    配置完成之後,為如下效果:

  • SpringMvc相關配置

    • springmvc基礎配置
      在springmvc資料夾下建立spring-mvc.xml,並配置以下程式碼
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:mvc="http://www.springframework.org/schema/mvc"
          xsi:schemaLocation="
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.2.xsd
          http://www.springframework.org/schema/mvc
          http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
      
          <!-- <mvc:annotation-driven /> -->
          <!-- 設定Jackson在返回的時候過濾掉null的資料 -->
          <mvc:annotation-driven>
              <mvc:message-converters register-defaults="true">
                  <bean
                      class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                      <property name="objectMapper">
                          <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                              <property name="serializationInclusion">
                                  <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
                              </property>
                          </bean>
                      </property>
                  </bean>
              </mvc:message-converters>
          </mvc:annotation-driven>
      
          <!-- 啟動Spring MVC的註解功能,完成請求和註解POJO的對映 -->
          <bean
              class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
              <property name="messageConverters">
                  <list>
                      <!--json轉換器 -->
                      <ref bean="mappingJacksonHttpMessageConverter" />
                  </list>
              </property>
          </bean>
          <bean
              class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
              <property name="messageConverters">
                  <list>
                      <ref bean="mappingJacksonHttpMessageConverter" />
                  </list>
              </property>
          </bean>
      
          <bean id="mappingJacksonHttpMessageConverter"
              class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
              <property name="supportedMediaTypes">
                  <list>
                      <bean class="org.springframework.http.M