認真寫博客第一篇:java基於spring jersey mybatis 構建restful


本例基於IDEA:

1.先建立項目

new出一個projec

QQ截圖20160324155059

起個什么名字比較好呢,哈哈哈哈!

那么就叫他德瑪西亞吧!

QQ截圖20160324155452

然后呢基於maven,大家事先准備好maven哦。

QQ截圖20160324155435

那么接下來就是設置這個狂拽酷炫的項目名字

QQ截圖20160324155803

好了完成我們正式進入主界面把。

2.IDEA的自動生成模板項目

QQ截圖20160324160606

左上角的自動導入ok既然這么有心我們就接受好了!手動斜眼

等待載入完成,好無聊,好慢,為什么!!!

QQ截圖20160324162027

終於下載完成,太慢了,上網一搜發現是從遠端倉庫獲取的我們可以讓他在本地獲取

QQ截圖20160324162125

測試了下速度瞬間鳥槍換炮。

3.然后我們先來往maven添加架包

可以下看下文件結構,再加不遲

QQ截圖20160324162412

一個標准的web項目成型

下面我們來添加倚賴包

<!-- 配置倉庫 -->

  <properties>
    <java-version>1.6</java-version>
    <spring.version>4.0.2.RELEASE</spring.version>
    <mybatis.version>3.2.6</mybatis.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <org.aspectj-version>1.7.3</org.aspectj-version>
  </properties>


  <dependencies>
    <!-- junit lib -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <!-- slf4j lib -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.5</version>
      <scope>provided</scope>
    </dependency>

    <!-- spring核心包 -->
    <!-- jersey中已存在 -->
    <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-orm</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>

    <!-- tomcat jdbc -->
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-jdbc</artifactId>
      <version>7.0.56</version>
      <scope>provided</scope>
    </dependency>

    <!-- 導入java ee jar 包 -->
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
    </dependency>

    <!-- 導入dbcp的jar包,用來在applicationContext.xml中配置數據庫 -->
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.2.2</version>
    </dependency>

    <!-- mysql connector -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.30</version>
    </dependency>

    <!-- 新增 Jersey 框架支持 2014-11-18 14:19:41 -->
    <dependency>
      <groupId>org.glassfish.jersey.ext</groupId>
      <artifactId>jersey-spring3</artifactId>
      <version>2.4.1</version>
      <exclusions>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-json-jackson</artifactId>
      <version>2.4.1</version>
    </dependency>

    <!-- jacson依賴包 -->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.3</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-jaxrs</artifactId>
      <version>1.8.1</version>
    </dependency>

    <!-- Logging -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>

    <!-- Servlet -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
    </dependency>


  </dependencies>

所有包在此包括很多個

其中有

junit lib 
slf4j lib
spring核心包
mybatis核心包
mybatis/spring包
tomcat jdbc
java ee jar 包
導入dbcp的jar包,用來在applicationContext.xml中配置數據庫
mysql connector
Jersey 框架支持
jacson依賴包
Logging
Servlet
QQ截圖20160324163457

添加之后茫茫多的依賴都要暈了都。

 

然后在最后IDEA不能自動識別xml配置文件我們可以在pom里面設置自動刷新

<resources>
      <resource>
        <directory>src/main/java</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>

4.下面我們就開始寫配置文件

從那里開始呢當然是web.xml了所有的訪問入口

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>DEMAXIYA - Restful Web Application</display-name>
  
</web-app>

修改修改頭文件,以及默認的名字,那么我們就開始了

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

首先是入口,

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mybatis.xml</param-value>
  </context-param>

配置context-param這個節點,然后讓spring去讀取這個文件來實現我們的配置

然后就開始配置spring-mybatis.xml這個文件

首先

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

這個是聲明文件

然后接下來是beans文件

<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"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:task="http://www.springframework.org/schema/task"
       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
       http://www.springframework.org/schema/jdbc
       http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task-3.1.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

這個文件的主要作用就是

1、避免命名沖突,像Java中的package一樣 

2、將不同作用的標簽分門別類(像Spring中的tx命名空間針對事務類的標簽,context命名空間針對組件的標簽) 

然后我們新建java包,並且將其轉化成源碼包,然后新建我們的包

com.demaxiya

<!-- 自動掃描 -->
    <context:component-scan base-package="com.demaxiya.." />

然后可以讓spring自動掃描里面的加commpent類來加載

xmlns:context="http://www.springframework.org/schema/context"
<!-- 自動掃描 -->
<context:component-scan base-package="com.demaxiya.." />

相對應的

xmlns="http://www.springframework.org/schema/beans"
<!-- 引入配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:jdbc.properties" />
</bean>

加入jdbc配置文件,然后配置jdbc參數

driver=com.mysql.jdbc.Driver
url_Master=jdbc:mysql://ip:port/(數據庫名字)?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true&autoReconnect=true&autoReconnectForPools=true
username_Master=xxx
password_Master=xxx

url_Slave=jdbc:mysql://ip:port/(數據庫名字)?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true&autoReconnect=true&autoReconnectForPools=true
username_Slave=xxx
password_Slave=xxx

#\u5B9A\u4E49\u521D\u59CB\u8FDE\u63A5\u6570  
initialSize=0
#\u5B9A\u4E49\u6700\u5927\u8FDE\u63A5\u6570  
maxActive=20
#\u5B9A\u4E49\u6700\u5927\u7A7A\u95F2  
maxIdle=20
#\u5B9A\u4E49\u6700\u5C0F\u7A7A\u95F2  
minIdle=1
#\u5B9A\u4E49\u6700\u957F\u7B49\u5F85\u65F6\u95F4  
maxWait=60000
<!-- 主數據庫節點,更新寫入 -->
    <bean id="Master" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url_Master}" />
        <property name="username" value="${username_Master}" />
        <property name="password" value="${password_Master}" />
        <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>

    <!-- 從數據庫節點,讀取 -->
    <bean id="Slave" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url_Slave}" />
        <property name="username" value="${username_Slave}" />
        <property name="password" value="${password_Slave}" />
        <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>

配置一個或者多個數據庫連接

<!-- 設置默認數據連接 -->
    <bean id="multipleDataSource" class="com.demaxiya.utils.ChangeDatabases.MultipleDataSource">
        <property name="defaultTargetDataSource" ref="Master"/>
        <property name="targetDataSources">
            <map>
                <entry key="Master" value-ref="Master"/>
                <entry key="Slave" value-ref="Slave"/>
            </map>
        </property>
    </bean>

設置默認數據庫連接,本例有兩個數據庫連接,為了項目做讀寫分離做准備

<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="multipleDataSource" />
        <property name="configLocation" value="classpath:mybatis.xml" />
        <property name="mapperLocations" value="classpath:com/demaxiya/mapper/*.xml"></property>
    </bean>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <setting name="callSettersOnNulls" value="true"/>
    </settings>
   <!-- 配置實體類短別名 -->
     <typeAliases>
          <typeAlias alias="Account" type="com.demaxiya.entities.Account"/>
          <typeAlias alias="PageEx" type="com.demaxiya.entities.PageEx"/>
         <typeAlias alias="PubSource" type="com.demaxiya.entities.PubSource"/>
    </typeAliases>
   
    <!-- 配置Mapper  -->
    <mappers>
    </mappers>

</configuration>

配置這個文件可以在mybatis .xml文件中使用別名

<!-- DAO接口所在包名,Spring會自動查找其下的類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.nico.dao" />
        <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="Master" />
    </bean>
    <!-- 開啟注解配置 -->
    <context:annotation-config />

    <!-- 開啟事務注解驅動 -->
    <tx:annotation-driven />

    <!-- 設置定時任務 -->
    <task:annotation-driven/>
    <context:component-scan base-package="com.nico.utils"></context:component-scan>

然后是下面的事務管理,注解配置,定時任務等

tx,tash需要在頭文件中加入

下面是完整的配置文件

<?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"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:task="http://www.springframework.org/schema/task"
       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/tx
       http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task-3.1.xsd">

    <!-- 自動掃描 -->
    <context:component-scan base-package="com.demaxiya.." />

    <!-- 引入配置文件 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties" />
    </bean>

    <!-- 主數據庫節點,更新寫入 -->
    <bean id="Master" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url_Master}" />
        <property name="username" value="${username_Master}" />
        <property name="password" value="${password_Master}" />
        <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>

    <!-- 從數據庫節點,讀取 -->
    <bean id="Slave" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url_Slave}" />
        <property name="username" value="${username_Slave}" />
        <property name="password" value="${password_Slave}" />
        <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>
    <!-- 設置默認數據連接 -->
    <bean id="multipleDataSource" class="com.demaxiya.utils.ChangeDatabases.MultipleDataSource">
        <property name="defaultTargetDataSource" ref="Master"/>
        <property name="targetDataSources">
            <map>
                <entry key="Master" value-ref="Master"/>
                <entry key="Slave" value-ref="Slave"/>
            </map>
        </property>
    </bean>
    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="multipleDataSource" />
        <property name="configLocation" value="classpath:mybatis.xml" />
        <property name="mapperLocations" value="classpath:com/demaxiya/mapper/*.xml"></property>
    </bean>

    <!-- DAO接口所在包名,Spring會自動查找其下的類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.demaxiya.dao" />
        <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="Master" />
    </bean>

    <!-- 開啟注解配置 -->
    <context:annotation-config />

    <!-- 開啟事務注解驅動 -->
    <tx:annotation-driven />

    <!-- 設置定時任務 -->
    <task:annotation-driven/>
    <context:component-scan base-package="com.demaxiya.utils"></context:component-scan>
</beans>
繼續來配置web.xml文件讓全部請求都由jersey來轉發
<servlet>
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>com.demaxiya.utils.RestApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>jersey-serlvet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

全部的web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>BJDR - Restful Web Application</display-name>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mybatis.xml</param-value>
  </context-param>
  <servlet>
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>com.demaxiya.utils.RestApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>jersey-serlvet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

其中的restapplication就是注冊jersey服務的入口

// 注冊JAX-RS應用組件
    public RestApplication(){
        //服務類所在的包路徑  
        packages("com.nico.service");
        
        register(RequestContextFilter.class);    // System
        register(JacksonFeature.class);            // System
        register(JacksonJsonProvider.class);    // System
        register(LoggingFilter.class);            // Log
        
    }

注冊服務。然后我們就可以正式開始寫接口了

5.建立service來提供訪問地址

下面的就是平常的建立class

package com.demaxiya.service;

import com.demaxiya.dao.AccountMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;

/**
 * Created by Administrator on 2016/4/18.
 */
@Component
@Path("accounts")
public class AccountService {

    @Autowired
    private AccountMapper accountMapper;


    @GET
    @Consumes({ "application/json; charset=UTF-8", "application/xml; charset=UTF-8" })
    @Produces({ "application/json; charset=UTF-8", "application/xml; charset=UTF-8" })
    public Response getAccounts(){
        System.out.println("測試來啦!!!!");

        return null;
    }
}

然后過來訪問,然后建立映射等,mapper文件。具體DEMO在下面的鏈接

https://github.com/308681282/my_work

示例代碼嘍。


免責聲明!

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



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