複習電商筆記-5
SSM框架技術
Spring+SpringMVC+Mybatis
建立專案的步驟:
1)建立配置檔案,Spring配置、Mybatis配置、SpringMVC配置、資料庫連線、日誌配置。
2)建立web.xml,在web.xml中完成Spring容器的初始化和SpringMVC入口的配置。
3)新增所需的依賴,是新增到jt-manage工程還是jt-manage-xxx工程,選擇原則:在哪些工程中需要。
問題:將依賴放在哪個工程呢?
例如:junit單元測試,是放在jt-manage中還是jt-manage-web呢?它們有什麼區別?放在jt-manage,它的子工程就都加入了這個jar包。junit所有工程都需要,所有就放進去。
4)拷貝jsp、js、css、工具類
拷貝jt-common專案程式碼
連結:https://pan.baidu.com/s/1gKsJjbPEcmNuda_qNBrAKw
提取碼:5091
applicationContext.xml(spring 配置)
Spring配置檔案程式碼如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 使用spring自帶的佔位符替換功能,可以實現註解方式獲取屬性檔案中的配置值 --> <bean class="com.jt.common.spring.exetend.ExtendedPropertyPlaceholderConfigurer"> <!-- 允許JVM引數覆蓋 --> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <!-- 忽略沒有找到的資原始檔 --> <property name="ignoreResourceNotFound" value="true" /> <!-- 配置資原始檔 --> <property name="locations"> <list> <value>classpath:jdbc.properties</value> <value>classpath:env.properties</value> <value>classpath:redis.properties</value> <value>classpath:httpclient.properties</value> <value>classpath:rabbitmq.properties</value> </list> </property> </bean> <!-- 掃描包 --> <context:component-scan base-package="com.jt" /> <!-- 配置連線池 --> <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"> <!-- 資料庫驅動 --> <property name="driverClass" value="${jdbc.driver}" /> <!-- 相應驅動的jdbcUrl --> <property name="jdbcUrl" value="${jdbc.url}" /> <!-- 資料庫的使用者名稱 --> <property name="username" value="${jdbc.username}" /> <!-- 資料庫的密碼 --> <property name="password" value="${jdbc.password}" /> <!-- 檢查資料庫連線池中空閒連線的間隔時間,單位是分,預設值:240,如果要取消則設定為0 --> <property name="idleConnectionTestPeriod" value="60" /> <!-- 連線池中未使用的連結最大存活時間,單位是分,預設值:60,如果要永遠存活設定為0 --> <property name="idleMaxAge" value="30" /> <!-- 每個分割槽最大的連線數 --> <property name="maxConnectionsPerPartition" value="150" /> <!-- 每個分割槽最小的連線數 --> <property name="minConnectionsPerPartition" value="5" /> </bean> </beans>
applicationContext-mybatis.xml(spring -mybatis整合)
Spring和MyBatis整合配置檔案,程式碼如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 構造SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 定義資料來源 --> <property name="dataSource" ref="dataSource"/> <!-- mybatis-config.xml --> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/> <!-- 別名包 --> <property name="typeAliasesPackage" value="com.jt.manage.pojo"/> <!-- mapper.xml --> <property name="mapperLocations" value="classpath:mybatis/mappers/*.xml"/> </bean> <!-- 定義Mapper介面掃描器 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 掃描mapper包 --> <property name="basePackage" value="com.jt.manage.mapper"/> </bean> </beans>
applicationContext-transaction.xml(spring 事物配置)
Spring的事務配置檔案,程式碼如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 定義事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 定義事務策略 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--定義查詢方法都是隻讀的 -->
<tx:method name="query*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="get*" read-only="true" />
<!-- 主庫執行操作,事務傳播行為定義為預設行為 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<!--其他方法使用預設事務策略 -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 定義切面,所有的service的所有方法 -->
<aop:pointcut id="txPointcut" expression="execution(* com.jt.manage.service.*.*(..))" />
<!-- 應用事務策略到Service切面 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
</beans>
事務具備ACID四種特性:
ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔離性)和Durability(永續性)的英文縮寫。
事務的傳播特性:
事務傳播行為就是多個事務方法呼叫時,如何定義方法間事務的傳播。Spring定義了7中傳播行為:
(1)propagation_requierd:如果當前沒有事務,就新建一個事務,如果已存在一個事務中,加入到這個事務中,這是Spring預設的選擇。
(2)propagation_supports:支援當前事務,如果沒有當前事務,就以非事務方法執行。
(3)propagation_mandatory:使用當前事務,如果沒有當前事務,就丟擲異常。
(4)propagation_required_new:新建事務,如果當前存在事務,把當前事務掛起。
(5)propagation_not_supported:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
(6)propagation_never:以非事務方式執行操作,如果當前事務存在則丟擲異常。
(7)propagation_nested:如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作。
事務的隔離級別:
(1)read uncommited 讀未提交:是最低的事務隔離級別,它允許另外一個事務可以看到這個事務未提交的資料。
(2)read commited 讀已提交:保證一個事物提交後才能被另外一個事務讀取。另外一個事務不能讀取該事物未提交的資料。
(3)repeatable read 可重複讀:這種事務隔離級別可以防止髒讀,不可重複讀。但是可能會出現幻象讀。它除了保證一個事務不能被另外一個事務讀取未提交的資料之外還避免了以下情況產生(不可重複讀)。
(4)serializable 序列化:這是花費最高代價但最可靠的事務隔離級別。事務被處理為順序執行。除了防止髒讀,不可重複讀之外,還避免了幻象讀
(5)髒讀、不可重複讀、幻象讀概念說明:
a.髒讀:指當一個事務正字訪問資料,並且對資料進行了修改,而這種資料還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。因為這個資料還沒有提交那麼另外一個事務讀取到的這個資料我們稱之為髒資料。依據髒資料所做的操作肯能是不正確的。
b.不可重複讀:指在一個事務內,多次讀同一資料。在這個事務還沒有執行結束,另外一個事務也訪問該同一資料,那麼在第一個事務中的兩次讀取資料之間,由於第二個事務的修改第一個事務兩次讀到的資料可能是不一樣的,這樣就發生了在一個事物內兩次連續讀到的資料是不一樣的,這種情況被稱為是不可重複讀。
c.幻象讀:一個事務先後讀取一個範圍的記錄,但兩次讀取的紀錄數不同,我們稱之為幻象讀(兩次執行同一條 select 語句會出現不同的結果,第二次讀會增加一資料行,並沒有說這兩次執行是在同一個事務中)
具體可以參考 https://blog.csdn.net/chinacr07/article/details/78817449
mybatis-config.xml(mybatis配置檔案)
Mybatis配置檔案,程式碼如下:
<?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="mapUnderscoreToCamelCase" value="true" />
<!-- 二級快取的總開關 -->
<setting name="cacheEnabled" value="false" />
</settings>
<plugins>
<!-- 分頁外掛:com.github.pagehelper為PageHelper類所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 方言 -->
<property name="dialect" value="mysql" />
<!-- 該引數預設為false -->
<!-- 設定為true時,使用RowBounds分頁會進行count查詢,查詢資料總條數 -->
<property name="rowBoundsWithCount" value="true" />
</plugin>
<!-- 通用Mapper外掛 -->
<plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
<!--主鍵自增回寫方法,預設值MYSQL,詳細說明請看文件 -->
<property name="IDENTITY" value="MYSQL" />
<!--通用Mapper介面,多個通用介面用逗號隔開 -->
<property name="mappers" value="com.jt.manage.mapper.base.mapper.SysMapper" />
</plugin>
</plugins>
</configuration>
mybatis提供了快取機制減輕資料庫壓力,提高資料庫效能
mybatis的快取分為兩級:一級快取、二級快取
一級快取是SqlSession級別的快取,快取的資料只在SqlSession內有效(一次有效的對話,預設一級快取是開啟的)
二級快取是mapper級別的快取,同一個namespace公用這一個快取,所以對SqlSession是共享的
https://www.cnblogs.com/winclpt/articles/7511672.html (參考)
mybatis呼叫mysql儲存過程 https://www.cnblogs.com/winclpt/articles/7501852.html
jdbc.properties(資料來源配置檔案)
資料庫連線屬性檔案,程式碼如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/jtdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
jdbc.username=root
jdbc.password=root
autoReconnect 閒置8小時,mysql會自動斷掉連結,配置後會自動重新連結
allowMultiQueries 一次可以執行多個SQL語句
log4j.properties(日誌配置)
- 日誌級別:ERROR, WARN, INFO, DEBUG or TRACE
- 日誌級別從低到高分為:TRACE < DEBUG < INFO < WARN < ERROR < FATAL 。
- 引數資料:https://www.cnblogs.com/bigben0123/p/7895696.html
log4j.rootLogger=INFO,A1
log4j.logger.org.mybatis = DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n