[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)

天星技術團隊發表於2018-07-28

作者:Sumn 時間: 2018.7.28

餘囊平平,業亦未精

0.基本介紹

0.1 Spring (由Rod Johnson建立的一個開源框架)

  Spring是一個開放原始碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向介面的程式設計思想貫穿整個系統應用。Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson建立。Spring的核心是控制反轉(IoC)面向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。(引自百度百科

0.2 SpringMVC

  Spring MVC屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裡面。Spring 框架提供了構建 Web 應用程式的全功能 MVC 模組。使用 Spring 可插入的 MVC 架構,從而在使用Spring進行WEB開發時,可以選擇使用Spring的SpringMVC框架或整合其他MVC開發框架,如Struts1(現在一般不用),Struts2(一般老專案使用)等。(引自百度百科

0.3 MyBatis

  MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。(引自MyBatis中文官網

1.準備工作

  該專案是由基於Maven的web專案進行整合的,如何配置基於Maven的web專案 請參考我的上篇文章juejin.im/post/5b2b61… 專案完整目錄結構如下圖:

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)

1.0 安裝mysql資料庫

  我這裡使用的mysql版本是5.6.25,視覺化工具用的是SQLYog,我在本地的mysql賬號密碼都是root(若放在伺服器,千萬別用此初始密碼)。Mysql安裝教程參考

  分享一些後臺常用的軟體安裝包 百度雲連結 密碼:qlnq,裡面有mysql安裝包以及mysql視覺化工具,當然你也可以自己去百度下。

1.1 新建一個資料庫

  我使用的是SQLYog視覺化工具,直接右鍵就可以建立一個新的資料庫,並設定字符集為UTF-8

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)

  建立一個User表,這裡我們用到的字符集是utf8mb4而不是utf8,為的是相容性,具體區別請參考

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)

1.1 IDEA外掛安裝

lombok外掛:安裝教程及介紹

另外lombok.jar能否適用於android參考Jake Wharton的這篇twitter twitter.com/JakeWharton…(需要翻牆)

mybatis外掛:安裝教程及介紹

2.開始整合

2.0 使用maven引入所需的jar包

開啟專案根目錄的pom.xml檔案

pom.xml


<?xml version="1.0" encoding="UTF-8"?>

<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>com.seeyou.sumn</groupId>
  <artifactId>SSMDemo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>SSMDemo Maven Webapp</name>
  <url>http://www.example.com</url>

  <properties>
    <!-- spring版本號 -->
    <spring.version>4.0.2.RELEASE</spring.version>
    <!-- mybatis版本號 -->
    <mybatis.version>3.2.6</mybatis.version>
    <!-- log4j日誌檔案管理包版本 -->
    <slf4j.version>1.7.7</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- spring核心包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</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-oxm</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-webmvc</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-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </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.2</version>
    </dependency>
    <!-- 匯入java ee jar 包 -->
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
    </dependency>
    <!-- 匯入Mysql資料庫連結jar包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.30</version>
    </dependency>
    <!-- 匯入dbcp的jar包,用來在applicationContext.xml中配置資料庫 -->
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.2.2</version>
    </dependency>
    <!-- JSTL標籤類 -->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <!-- 日誌檔案管理包 -->
    <!-- log start -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>


    <!-- 格式化物件,方便輸出日誌 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.1.41</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 -->
    <!--使用者簡化實體類 -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.6</version>
    </dependency>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.6</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.7.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.7.0</version>
    </dependency>

  </dependencies>

</project>


複製程式碼

  每次pom.xml加入新的jar或者更新jar版本的時候,一定要記得點選import Changes那樣jar才會在你的專案中生效。

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)

2.1 配置spring-mvc.xml

  在 resource資料夾中新建一個spring-mvc.xml

  作用:主要用於配置Controller的元件掃描器和檢視解析器

spring-mvc.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:p="http://www.springframework.org/schema/p"
       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-4.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <!-- 自動掃描 @Controller -->
    <context:component-scan base-package="com.seeyou.ssmdemo">
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller" />
        <context:include-filter type="annotation"
                                expression="org.springframework.web.bind.annotation.ControllerAdvice" />
    </context:component-scan>

    <!--避免IE執行AJAX時,返回JSON出現下載檔案(這裡是在適配IE瀏覽器) -->
    <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/plain;charset=UTF-8</value>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <!-- 啟動SpringMVC的註解功能,完成請求和註解POJO的對映 -->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON轉換器 -->
            </list>
        </property>
    </bean>

    <!-- 定義跳轉的檔案的前字尾 ,檢視模式配置 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
      <!--@ResponseBody返回的字串編碼格式改為UTF-8-->
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
        <property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
    </bean>

</beans>

複製程式碼

2.2 配置jdbc.properties以及log4j.properties

  在 resource資料夾中新建一個jdbc.properties,這個檔案是用於儲存與mysql資料庫連線的一些資訊

jdbc.properties

#連結驅動
driverClasss=com.mysql.jdbc.Driver
#mysql地址
jdbcUrl=jdbc:mysql://localhost:3306/ssmdemo
#賬號
username=root
#密碼
password=root

#定義初始連線數
initialSize=0
#定義最大連線數
maxActive=20
#定義最大空閒
maxIdle=20
#定義最小空閒
minIdle=1
#定義最長等待時間
maxWait=60000

複製程式碼

  同樣的在resource資料夾中新建一個log4j.properties,使用者儲存log配置的資訊

log4j.properties

log4j.rootLogger=INFO,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=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C] - %m%n
#mybatis顯示SQL語句日誌配置
#這裡填寫你的mapper所在的包
log4j.logger.com.seeyou.sssmdemo.mapper=DEBUG  
#普通檔案日誌־
log4j.appender.File=org.apache.log4j.RollingFileAppender
log4j.appender.File.File=logs/SeeYou.log
log4j.appender.File.MaxFileSize=10MB
#輸出日誌,如果換成DEBUG表示輸出DEBUG以上級別日誌־
log4j.appender.File.Threshold=ALL
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C] - %m%n
複製程式碼

2.3配置spring-mybatis.xml檔案

  在 resource資料夾中新建一個spring-mybatis.xml,並同時新建一個mapper資料夾,這一步主要是將spring和mybatis進行整合,主要的就是自動掃描,自動注入和配置資料庫。

spring-mybatis.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:p="http://www.springframework.org/schema/p"
       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.1.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    <!-- 自動掃描 專案的包名-->
    <context:component-scan base-package="com.seeyou.ssmdemo" />
    <!-- 引入配置檔案  這裡就會引用jdbc.properties這個配置檔案中的資訊 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties" />
    </bean>

    <!-- 配置資料來源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${driverClasss}"/>
        <property name="url" value="${jdbcUrl}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
        <!-- 初始化連線大小 -->
        <property name="initialSize" value="${initialSize}"></property>
        <!-- 連線池最大數量 -->
        <property name="maxActive" value="${maxActive}"></property>
        <!-- 連線池最大空閒 -->
        <property name="maxIdle" value="${maxIdle}"></property>
        <!-- 連線池最小空閒 -->
        <property name="minIdle" value="${minIdle}"></property>
        <!-- 獲取連線最大等待時間 -->
        <property name="maxWait" value="${maxWait}"></property>
    </bean>


    <!-- spring和MyBatis完美整合,不需要mybatis的配置對映檔案 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自動掃描mapping.xml檔案 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
    </bean>

    <!-- DAO介面所在包名,Spring會自動查詢其下的類  -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--這裡填寫你mapper包 -->
        <property name="basePackage" value="com.seeyou.ssmdemo.mapper" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

    <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

</beans>

複製程式碼

2.4將配置檔案註冊進web.xml檔案中

  檔案所在位置:src->main->webapp->WEB-INF->web.xml

  檔案作用:web.xml檔案是用來初始化配置資訊,我將它理解為android中的AndroidManifest.xml,你只有在這裡對spring-mybatis.xml以及spring-mvc.xml進行註冊了,才能使其生效

web.xml

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mybatis.xml</param-value>
  </context-param>

  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</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>

  <!-- spring監聽器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- 防止spring記憶體溢位監聽器,比如quartz -->
  <listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  </listener>

  <!-- spring mvc servlet -->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 此處也可以配置成 *.do 形式 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--歡迎頁面配置-->
  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>

  <!-- session配置 -->
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

</web-app>


複製程式碼

  完成這一步,你的ssm框架雛形算是出來了,接下來試試寫幾個介面,並對資料庫進行增刪改查操作

3.編寫介面並對資料庫進行CRUD

3.0 建立實體類TUserDo.java

   在model這個包下建立一個與剛剛資料庫中建立的表對應的實體類

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)

TUserDo.java

//源自lombok庫,通過註解以達到減少程式碼的Java庫,如通過註解的方式減少get,set方法,構造方法等
@Data
public class TUserDo implements Serializable {
    private static final long serialVersionUID = 1L;
    private  int uid;
    private  String uName;
    private  int uAge;
    private  String uSex;
}

複製程式碼

3.1 建立Mybatis java對映介面 TUserMapper.java

  該介面主要用於與對映檔案進行互動,寫上常用的CRUD方法,等下會和TUserMapper.xml中的對映語句一一對應。

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)


//spring的註解,會自動建立類的例項
@Repository
public interface TUserMapper {
    /**
     * insert selective.
     */
    int insertSelective(TUserDo record);

    /**
     * delete by primary key.
     */
    int deleteByPrimaryKey(TUserDo record);
    /**
     * select by primary key.
     */
    TUserDo selectByPrimaryKey(Long id);

    /**
     * update by primary key selective.
     */
    int updateByPrimaryKeySelective(TUserDo record);

}


複製程式碼

3.2 建立Mybatis 對映配置檔案 TUserMapper.xml

  MyBatis 的真正強大在於它的對映語句,也是它的魔力所在。由於它的異常強大,對映器的 XML 檔案就顯得相對簡單。如果拿它跟具有相同功能的 JDBC 程式碼進行對比,你會立即發現省掉了將近 95% 的程式碼。MyBatis 就是針對 SQL 構建的,並且比普通的方法做的更好。(引自mybatis官網

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)

TUserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--名稱空間需要填所對應的對映介面-->
<mapper namespace="com.seeyou.ssmdemo.mapper.TUserMapper">
    <!--這裡是對映實體類的結果集 -->
    <resultMap id="BaseResultMap" type="com.seeyou.ssmdemo.model.TUserDo">
        <!--  id:對應的是mysql中的主鍵,column:對應的是mysql中的列名,jdbcType:對應的是mysql中的資料型別 property:對應的是實體類中的屬性名-->
        <id column="u_id" jdbcType="INTEGER" property="uid"/>
        <!--mysql中的非主鍵列名使用result標籤即可-->
        <result column="u_name" jdbcType="VARCHAR" property="uName"/>
        <result column="u_age" jdbcType="INTEGER" property="uAge"/>
        <result column="u_sex" jdbcType="VARCHAR" property="uSex"/>
    </resultMap>

    <!-- id:對應的是java對映介面中的方法名  parameterType:對應的是方法中的引數型別
    resultMap:對應的是返回值,該方法返回的是實體類,而實體類在該對映檔案中的 結果集的id為BaseResultMap-->
    <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        select * from user where u_id = #{uid,jdbcType=INTEGER}
    </select>

    <!-- 在執行insert delete update標籤的時候 無需定義resultMap 預設會返回int型別的resultMap, 返回值大於0則表示操作成功-->
    <insert id="insertSelective" parameterType="com.seeyou.ssmdemo.model.TUserDo">
        insert into user
        <!--在對映檔案中執行sal語句時,可以像寫java一樣寫一些判斷語句,這也是mybatis的優勢之一-->
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="uName != null">
                u_name,
            </if>
            <if test="uAge != null">
                u_age,
            </if>
            <if test="uSex != null">
                u_sex,
            </if>

        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">

            <if test="uName != null">
                #{uName,jdbcType=VARCHAR},
            </if>
            <if test="uAge != null">
                #{uAge,jdbcType=INTEGER},
            </if>
            <if test="uSex != null">
                #{uSex,jdbcType=VARCHAR},
            </if>
        </trim>
    </insert>

    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        delete from user where u_id = #{uid,jdbcType=BIGINT}
    </delete>

    <update id="updateByPrimaryKeySelective" parameterType="com.seeyou.ssmdemo.model.TUserDo">
        update user
        <set>
            <if test="uName != null">
                u_name= #{uName,jdbcType=VARCHAR},
            </if>
            <if test="uAge != null">
                u_age=#{uAge,jdbcType=INTEGER},
            </if>
            <if test="uSex != null">
                u_sex=#{uSex,jdbcType=VARCHAR},
            </if>
        </set>
        where u_id = #{uid,jdbcType=BIGINT}
    </update>

</mapper>
複製程式碼

3.3 建立對映介面管理類 介面TUserManager.java 實現類 TUserManagerImpl.java

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)

TUserManager.java


public interface TUserManager {
    /**
     * insert selective.
     */
    int insertSelective(TUserDo record);

    /**
     * delete by primary key.
     */
    int deleteByPrimaryKey(TUserDo record);
    /**
     * select by primary key.
     */
    TUserDo selectByPrimaryKey(Long id);

    /**
     * update by primary key selective.
     */
    int updateByPrimaryKeySelective(TUserDo record);
}


複製程式碼

TUserManagerImpl.java



//把普通pojo例項化到spring容器中,相當於配置檔案中的<bean id="" class=""/>
@Component
public class TUserManagerImpl implements TUserManager {
    //從spring中獲取自動建立的例項
    @Autowired
    protected TUserMapper tUserMapper;


    public int insertSelective(TUserDo record) {
        return tUserMapper.insertSelective(record);
    }

    public int deleteByPrimaryKey(TUserDo record) {
        return tUserMapper.deleteByPrimaryKey(record);
    }

    public TUserDo selectByPrimaryKey(Long id) {
        return tUserMapper.selectByPrimaryKey(id);
    }

    public int updateByPrimaryKeySelective(TUserDo record) {
        return tUserMapper.updateByPrimaryKeySelective(record);
    }
}

複製程式碼

3.4最後一步編寫控制器類UserController.java

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)
UserController.java


//宣告控制器類
@Controller
/*
 * 相當於 http://你的ip:tomcat定義的埠(預設8080)/user/
 * 例: http://192.168.17.52:8080/user/
 * ip可以通過 win+R調出執行 輸入cmd 在輸入ipconfig 然後取IPv4地址
 */
@RequestMapping(value = "user")
//lombok註解 自動生成log類
@Log4j
public class UserController {
    @Autowired
    TUserManager tUserManager;

    /*
     * 請求引數uName,uAge,uSex
     */
    // @ResponseBody:controller的方法返回的物件通過適當的轉換器轉換為指定的格式之後,寫入到response物件的body區,通常用來返回JSON資料或者是XML
    @ResponseBody
    //相當於請求地址為http://192.168.17.52:8080/user/insert  請求方法為POST
    @RequestMapping(value = "insert", method = RequestMethod.POST)
    public String insert(HttpServletRequest request) {
        log.info("執行增加");
        //定義請求數
        String uName = request.getParameter("uName");
        int uAge = Integer.parseInt(request.getParameter("uAge"));
        String uSex = request.getParameter("uSex");
        log.info(uName+":"+uAge+":"+uSex);
        TUserDo tUserDo = new TUserDo();
        tUserDo.setUName(uName);
        tUserDo.setUAge(uAge);
        tUserDo.setUSex(uSex);
        int i = tUserManager.insertSelective(tUserDo);
        if (i > 0) {
            return "新增成功";
        } else {
            return "新增失敗";
        }
    }

    /*
     *請求引數:uid
     */
    @ResponseBody
    @RequestMapping(value = "delete", method = RequestMethod.POST)
    public String delete(HttpServletRequest request) {
        log.info("執行刪除");
        int id = Integer.parseInt(request.getParameter("uid"));
        log.info(id);
        TUserDo tUserDo = new TUserDo();
        tUserDo.setUid(id);
        int i = tUserManager.deleteByPrimaryKey(tUserDo);
        if (i > 0) {
            return "刪除成功";
        } else {
            return "刪除失敗";
        }
    }

    /*
     *請求引數:uid
     */
    @ResponseBody
    @RequestMapping(value = "select", method = RequestMethod.POST)
    public String select(HttpServletRequest request) {
        log.info("執行查詢");
        int id = Integer.parseInt(request.getParameter("uid"));
        log.info(id);
        TUserDo tUserDo = tUserManager.selectByPrimaryKey(id);
        JSONObject jsonObject = (JSONObject) JSON.toJSON(tUserDo);
        return jsonObject.toJSONString();
    }

    /*
     * 請求引數uName,uAge,uSex,id
     */
    @ResponseBody
    @RequestMapping(value = "update", method = RequestMethod.POST)
    public String update(HttpServletRequest request) {
        log.info("執行修改");
        int id = Integer.parseInt(request.getParameter("uid"));
        String uName = request.getParameter("uName");
        int uAge = Integer.parseInt(request.getParameter("uAge"));
        String uSex = request.getParameter("uSex");
        log.info(id+":"+uName+":"+uAge+":"+uSex);
        TUserDo tUserDo = new TUserDo();
        tUserDo.setUid(id);
        tUserDo.setUName(uName);
        tUserDo.setUAge(uAge);
        tUserDo.setUSex(uSex);
        int i = tUserManager.updateByPrimaryKeySelective(tUserDo);
        if (i > 0) {
            return "修改成功";
        } else {
            return "修改失敗";
        }

    }
}
複製程式碼

4執行並除錯

4.0 執行tomcat 如何執行可以參考我上篇文章

  當你的控制檯彈出如下介面,並且瀏覽器自動開啟了http://localhost:8080/ 說明執行成功了

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)

4.1除錯介面

   我這裡使用的是fiddler(既可以作為介面除錯工具,又可以作為抓包工具,神器,強推)

[Android]後端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)
   如執行成功你會在mysql的表中看到你新增的資料,其他介面除錯同理

   這裡的localhost可以替換為你電腦的本地ip,如果你用android就必須使用ipv4地址,且電腦和手機在同一區域網

   這裡在除錯工具的url中輸入中文你的tomcat會報如下錯誤

28-Jul-2018 13:41:53.167 資訊 [http-nio-8080-exec-7] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
 java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:479)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:687)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)
複製程式碼

網上查了下,大概原因是:

在tomcat 8.0.35之後 ,tomcat對url的引數做了比較規範的限制,必須按照RFC 7230 and RFC 3986規範,對於非保留字字元,如果不做轉義處理,一律都會報The valid characters are defined in RFC 7230 and RFC 3986 錯誤。

   解決這個問題的辦法有幾個:

   把非保留字字元做轉義

   就是使用保留字字元

   要麼就是換比較底一點的tomcat版本

   將json資料進行urlencode編碼就可以了 即把json中的{}編碼

實際上,我在使用app請求時並未發現該錯誤,因為app的情求會對請求引數自動編碼。

5 結尾

   如果遇到什麼問題,可以進天星的群找我,有問必答。如果有哪些地方寫的不好,不合理,也請大家指出並給出意見,謝謝

天星群號:557247785 點選我加入群聊【天星】

相關文章