色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 學習資源 > 講師博文 > 三層架構實現Java Web案例

三層架構實現Java Web案例 時間:2018-04-01      來源:未知

三層架構一方面是為了解決應用程序中代碼之間調用復雜,代碼職責不清的問題;通過各層之間定義接口的形式,并將接口與實現分離,可以很容易的用不同的實現來替換原有的實現,從而有效的降低層與層之間的依賴關系。這種方式不僅有利于整個團隊理解整個應用架構,降低后期維護成本,同時也有利于制定整個應用程序架構的標準。

另一方面三層架構的出現從某種程度上解決了企業內部如果有效的根據技能調配技術人員,提高生產效率的問題,在大環境下,有效的分層能使不同職責的人各司其職,聚焦于個人專業技能的發展與培養上。

三層架構的出現不僅標準化了復雜系統的邏輯劃分,更幫助企業解決如果有效的形成技術人員組織機構的問題,因此在很長的一段時間內,它一直是軟件架構設計的經典模式之一。

優勢

層次清晰,每個層次都提供了接口定義

很容易用新的實現替換原來的層次實現。例如對sql進行性能優化,并不會影響其他層的代碼結構。有利于后期維護。

有利于實現切面編程,減輕業務的復雜程度,加快編碼效率。

每個層次的定位明晰,業務處理的內容明確。依據層次,可以劃分不同的分工。開發人員可以只關注整個結構的其中某一層。

接口定義也提供了良好的可擴展性。例如數據庫從mysql切換到oracle,只需要通過配置來切換。

降低了代碼之間,層與層的依賴關系

復用性:利于各層代碼邏輯的復用

安全性:接口設計需要符合對擴展開發,對修改關閉的原則,增強了系統的安全性

各層次職責

表示層:是應用的用戶接口部分,擔負著用戶與應用的對話,交互功能。

業務邏輯層:主要是業務邏輯的處理,操作,是系統功能核心。

數據訪問層:也稱為是數據持久層,其功能主要是負責數據庫的訪問。

遵循的規格

1. 系統按照三層架構劃分:表示層,業務層,數據訪問層。

2. 系統各層次之間接口通信,不能訪問實現類對象。

3.系統各層次之間單向依賴,不能反向,不能跨層次訪問,

案例實現

三層架構實現

1.pom.xml
<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.hq</groupId>
      <artifactId>ssm_base</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>war</packaging>
      <dependencies>
           <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
                 <version>4.12</version>
                 <scope>test</scope>
           </dependency>
           <dependency>
                 <groupId>javax</groupId>
                 <artifactId>javaee-api</artifactId>
                 <version>8.0</version>
                 <scope>provided</scope>
           </dependency>
           <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>druid</artifactId>
                 <version>1.1.6</version>
           </dependency>
           <dependency>
                 <groupId>org.mybatis</groupId>
                 <artifactId>mybatis-spring</artifactId>
                 <version>1.3.1</version>
           </dependency>
           <dependency>
                 <groupId>org.mybatis</groupId>
                 <artifactId>mybatis</artifactId>
                 <version>3.4.5</version>
           </dependency>
           <!-- 數據庫驅動 -->
           <dependency>
                 <groupId>mysql</groupId>
                 <artifactId>mysql-connector-java</artifactId>
                 <version>5.1.10</version>
           </dependency>
           <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-webmvc</artifactId>
                 <version>4.3.14.RELEASE</version>
           </dependency>
           <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-jdbc</artifactId>
                 <version>4.3.14.RELEASE</version>
           </dependency>
           <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-test</artifactId>
                 <version>4.3.14.RELEASE</version>
                 <scope>test</scope>
           </dependency>
           <dependency>
                 <groupId>com.fasterxml.jackson.core</groupId>
                 <artifactId>jackson-databind</artifactId>
                 <version>2.9.3</version>
           </dependency>
           <dependency>
                 <groupId>org.aspectj</groupId>
                 <artifactId>aspectjweaver</artifactId>
                 <version>1.8.13</version>
           </dependency>
           <dependency>
                 <groupId>aopalliance</groupId>
                 <artifactId>aopalliance</artifactId>
                 <version>1.0</version>
           </dependency>
           <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
           <dependency>
                 <groupId>com.github.pagehelper</groupId>
                 <artifactId>pagehelper</artifactId>
                 <version>5.1.2</version>
           </dependency>
           <!-- https://mvnrepository.com/artifact/log4j/log4j -->
           <dependency>
                 <groupId>log4j</groupId>
                 <artifactId>log4j</artifactId>
                 <version>1.2.17</version>
           </dependency>
      </dependencies>
      <build>
           <finalName>ssm_base</finalName>
      </build>
</project>

2.spring.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"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        ">
    <context:property-placeholder location="classpath:config.properties" />
    <!-- 配置DataSource數據源 -->
    <!-- 阿里 druid 數據庫連接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        destroy-method="close">
        <!-- 數據庫基本信息配置 -->
        <property name="url" value="${druid.url}" />
        <property name="username" value="${druid.username}" />
        <property name="password" value="${druid.password}" />
        <property name="driverClassName" value="${druid.driverClassName}" />
        <property name="filters" value="${druid.filters}" />
        <!-- 最大并發連接數 -->
        <property name="maxActive" value="${druid.maxActive}" />
        <!-- 初始化連接數量 -->
        <property name="initialSize" value="${druid.initialSize}" />
        <!-- 配置獲取連接等待超時的時間 -->
        <property name="maxWait" value="${druid.maxWait}" />
        <!-- 最小空閑連接數 -->
        <property name="minIdle" value="${druid.minIdle}" />
        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
        <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
        <property name="validationQuery" value="${druid.validationQuery}" />
        <property name="testWhileIdle" value="${druid.testWhileIdle}" />
        <property name="testOnBorrow" value="${druid.testOnBorrow}" />
        <property name="testOnReturn" value="${druid.testOnReturn}" />
        <property name="maxOpenPreparedStatements" value="${druid.maxOpenPreparedStatements}" />
        <!-- 打開 removeAbandoned 功能 -->
        <property name="removeAbandoned" value="${druid.removeAbandoned}" />
        <!-- 1800 秒,也就是 30 分鐘 -->
        <property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" />
        <!-- 關閉 abanded 連接時輸出錯誤日志 -->
        <property name="logAbandoned" value="${druid.logAbandoned}" />
    </bean>
    <!-- spring和MyBatis整合-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="com.ssm.entity" />
        <property name="configLocation" value="classpath:mybatis-config/mybatis-config.xml" />
        <!-- mapperresultmap配置路徑 -->
        <property name="mapperLocations" value="classpath:mybatis-config/mapper/*Mapper.xml"></property>
    </bean>
    <!-- DAO接口所在包名,Spring會自動查找其下的類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.ssm.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="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />
    <context:component-scan base-package="com.ssm">
        <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
</beans>

2.表示層控制器實現

//控制器

@Controller

public class UserController {

//依賴注入業務層對象 聲明是業務層的接口引用

@Autowired

private BookService bookService;

//處理器 映射http服務

@RequestMapping("list")

//返回json類型數據

@ResponseBody

public List list(@RequestParam(required=false,defaultValue="1")int page,

@RequestParam(required=false,defaultValue="3")int pageSize){

System.out.println("請求list");

return bookService.getBooks(page,pageSize);

}

}

3.業務層接口

public interface BookService {

public List getBooks(int page,int pageSize);

}

4.業務層實現

//業務層

@Service

public class BookServiceImpl implements BookService {

//依賴數據服務層對象

@Autowired

private BookMapper bookMapper;

//調用數據訪問層對象方法,獲取所需數據

@Transactional

public List getBooks(int page,int pageSize) {

PageHelper.startPage(page, pageSize);

return bookMapper.findBooks();

}

}

5.數據訪問層接口

public interface BookMapper {

public List findBooks();

}

6.數據訪問映射
<mapper namespace="com.ssm.dao.BookMapper">
     <select id="findBooks" resultType="book">
         select * from books
     </select>
</mapper>

 

上一篇:java異常處理機制原理

下一篇:Java字節流使用方法

戳我查看嵌入式每月就業風云榜

點我了解華清遠見高校學霸學習秘籍

猜你關心企業是如何評價華清學員的

干貨分享
相關新聞
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2024 北京華清遠見科技發展有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 亚洲国产精品成人精品无码区在线 | 最近最新MV在线观看免费高清 | 日本高清一区二区三 | 手机永久无码国产AV毛片 | 中文字幕亚洲一区一区 | 国产午精品午夜福利757视频播放 | 久久精品国产麻豆 | sese久久 | 久久亚洲中文无码咪咪爱 | 99久久免费国产精品四虎 | 天美传媒AV成人片免费看 | 被黑人猛男连续高潮视频 | 国产免费激情视频 | 天天av天天翘天天综合网色鬼 | 亚洲国产一区二区a毛片日本 | 色偷偷AV男人的天堂京东热 | gogogo高清在线播放韩国 | 中文字幕四虎 | 女人被爽到高潮视频免费国产 | 台湾中文佬娱乐网 | 三年片大全在线观看免费观看第二集 | 久久久无码精品无码国产人妻丝瓜 | 国产免费av一区二区 | 日本19禁啪啪无遮挡 | 美女极度色诱图片www | 国产又黄又硬又粗 | 做爰全过程免费120秒 | 人人摸人人搞人人透 | 18禁无遮挡无码国产免费网站 | 国产成人不卡无码免费视频 | 欧美最猛黑人XXXX黑人猛交98 | 国产av福利第一精品 | 免费国产黄线在线播放 | 高跟丝袜AV专区 | 久久亚洲道色宗和久久 | 欧美人与禽猛交乱配 | 精品人妻无码一区二区三区竹菊影视 | 亚洲日韩精品无码专区加勒比 | 夜夜操夜夜爱 | 美女黄网站色视频免费国产 | 亚洲中文字幕久久精品无码2021 |