SSM框架詳細(xì)整合
介紹
Spring + SpringMVC + Mybatis是現(xiàn)在輕量級(jí)J2EE框架方案中荞胡,非常流行的架構(gòu)。
筆記以創(chuàng)建Maven項(xiàng)目垮衷、搭建DAO層+Mybatis宗苍、Mybatis與Spring結(jié)合、SpringMVC與Spring的結(jié)合 為主線索開(kāi)始搭建SSM框架項(xiàng)目当娱。 最后實(shí)現(xiàn)對(duì)MySQL中數(shù)據(jù)的增刪改查。
使用Maven 創(chuàng)建項(xiàng)目的空架子架子
首先 檢查一下maven是否配置正確
cmd:
mvn -v
如果返回mvn相關(guān)的版本和配置信息考榨,則mvn配置正確跨细。
如果沒(méi)有安裝maven 這里簡(jiǎn)要的介紹一下安裝方法:
- 去官網(wǎng)下載maven的文件包
2.將下載后的maven解壓到硬盤(pán)合適的位置
3.windows系統(tǒng)設(shè)置環(huán)境變量,增加MAVEN_HOME =maven位置河质,在PATH中加入maven/bin的位置
4(可選).修改maven本地倉(cāng)庫(kù)的位置.找到 apache-maven-XXX下的 conf 下的 settings.xml 配置文件冀惭,修改<localRepository>標(biāo)簽內(nèi)容。
5.修改maven鏡像掀鹅,由于國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境的問(wèn)題散休,maven默認(rèn)的鏡像會(huì)很慢,這里可以改為國(guó)內(nèi)鏡像乐尊。在配置文件中的<mirrors>標(biāo)簽加入如下的阿里鏡像:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
在想要?jiǎng)?chuàng)建工程的目錄的位置 cmd 輸入創(chuàng)建maven項(xiàng)目的指令如下:
mvn archetype:generate -DgroupId=項(xiàng)目BundleID(例如:com.name) -DartifactId=項(xiàng)目名稱 -DarchetypeArtifactId=maven-archetype-webapp
以上戚丸,使用maven的 webapp模板搭建一個(gè)項(xiàng)目框架。注意:老版本的maven archetype是:create 而不是generateH忧丁O薷!
創(chuàng)建完的工程目錄結(jié)構(gòu)如下:
使用IDE導(dǎo)入maven項(xiàng)目,修改配置痢缎,添加依賴
這里的ide以IndelliJ IDEA為例
打開(kāi)IDE-file-open 然后找到剛才工程的pom.xml文件胁勺,打開(kāi) 注意這里打開(kāi)pom文件而不是工程文件夾
修改web.xml
接下來(lái)需要修改web.xml文件,因?yàn)閙aven自動(dòng)創(chuàng)建的web.xml文件servlet的版本是2.3 独旷,這個(gè)版本jsp默認(rèn)的el表達(dá)式是不工作的署穗,需要替換成更高的。
我們找到Tomcat自帶的example的web.xml嵌洼。Tomcat默認(rèn)的路徑是:
Apache Software Foundation\Tomcat 7.0_Tomcat7ForEclipse\webapps\examples\WEB-INF\web.xml
復(fù)制xml的頭案疲,修改到工程的web.xml文件,修改后的文件如下:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
</web-app>
添加目錄
IDE 中:Project Setting-Modules麻养,增加Source和test(單元測(cè)試)目錄的source和resource文件
注意添加相應(yīng)的目錄后要設(shè)置其成為Source或者Resources 目錄如下圖:
修改pom.xml添加項(xiàng)目依賴
依賴主要分為四大部分:
- 日志
- 數(shù)據(jù)庫(kù)相關(guān)
- Servlet Web相關(guān)
- Spring
配置好的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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.seckill</groupId>
<artifactId>seckill</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>seckill Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<!-- 使用junit4 支持注解模式 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 項(xiàng)目依賴 -->
<!--1:日志 Java日志:slf4j,log4j,logback,common-logging
slf4j 是規(guī)范/接口
日志實(shí)現(xiàn):log4j,logback,common-logging
使用:sl4f + logback
-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<!--實(shí)現(xiàn)sl4j接口合并-->
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
</dependency>
<!--2:數(shù)據(jù)庫(kù)相關(guān)-->
<!--驅(qū)動(dòng)-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
<!-- 生命周期為runtime褐啡,以為數(shù)據(jù)庫(kù)驅(qū)動(dòng)在工作的時(shí)候才會(huì)用到 -->
<scope>runtime</scope>
</dependency>
<!--連接池-->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!--DAO框架:Mybatis依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<!--mybatis 整合spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
<!--3:Servlet web 相關(guān)依賴-->
<!--標(biāo)簽庫(kù)-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--js標(biāo)簽-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--Json相關(guān)依賴-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!--4:Sping依賴-->
<!--1)Spring核心-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!--2) Spring DAO層依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<!--spring 事務(wù)-->
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!--3) spring web 先關(guān)依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!--4) spring test-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>seckill</finalName>
</build>
</project>
Tip 使用Intellj Idea IDE的ctrl+alt+L快捷鍵可以自動(dòng)調(diào)整代碼格式
DAO層的配置(數(shù)據(jù)庫(kù)、Mybatis)
為了以后的測(cè)試首先建一個(gè)數(shù)據(jù)庫(kù)回溺,做一個(gè)測(cè)試用的表:user_t
創(chuàng)建表的腳本如下:
CREATE TABLE `user_base` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR(40) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`age` INT(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
表大概長(zhǎng)這個(gè)樣子:
寫(xiě)接口
在工程目錄中java創(chuàng)建接口包:com.example這個(gè)包又包括兩個(gè)子包entity和dao
創(chuàng)建表對(duì)應(yīng)的entity
在entity目錄下創(chuàng)建 userBase 的entity春贸,UserBase.java
package com.example.entity;
public class UserBase {
private long id;
private String name;
private String password;
private int age;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
//為了以后測(cè)試方便,增加toString的打印方法
public String toString() {
return "UserBase{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
創(chuàng)建DAO 接口
dao文件一般按照對(duì)應(yīng)的entity+Dao的命名規(guī)則
在dao目錄下新建UserBaseDao.java
注意這里創(chuàng)建的Dao是個(gè)接口 interface遗遵,現(xiàn)在不用實(shí)現(xiàn)
package com.example.dao;
import com.example.entity.UserBase;
import java.util.List;
public interface UserBaseDao {
/*
增加用戶
*/
int createUser (UserBase userBase);
/*
更改某id的用戶信息
*/
int updateUserById (long id);
/*
查詢所有用戶信息
*/
List<UserBase> queryAllUser ();
/*
刪除某id的用戶
*/
int delateUserById(long id);
}
現(xiàn)在的項(xiàng)目目錄結(jié)構(gòu)如下:
用Mybatis實(shí)現(xiàn)DAO接口
實(shí)現(xiàn)DAO有兩種方法:
- XML提供SQL
- 注解提供SQL
XML提供SQL的方式最靈活萍恕,也可以通過(guò)高級(jí)的SQL技巧實(shí)現(xiàn)接口的性能優(yōu)化,故用XML方式
MyBatis通過(guò)mapper映射機(jī)制實(shí)現(xiàn)DAO
在resources目錄創(chuàng)建一個(gè)全局的Mybatis配置文件:mybatis-config.xml
從mybatis官網(wǎng)上找到全局配置文件的標(biāo)準(zhǔn)例子车要,包文件頭復(fù)制過(guò)來(lái),然后開(kāi)始配置xml文件如下:
<?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>
<!--使用jdbc的getGeneratedKeys 獲取數(shù)據(jù)庫(kù)自增主鍵值-->
<setting name="useGeneratedKeys" value="ture"/>
<!--使用列別名替換列明 默認(rèn)值true
select name as title from table
-->
<setting name="useColumnLabel" value="true"/>
<!-- 開(kāi)啟駝峰命名轉(zhuǎn)換:Table(create_time)->Entity(creatTime) -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
使用mapper方式實(shí)現(xiàn)Dao接口
在resources下創(chuàng)建一個(gè)目錄來(lái)存放不同的mapper
新建一個(gè)UserBase.xml文件
在Mybatis官網(wǎng)上找到mapper的示例允粤,復(fù)制xml文件頭,一個(gè)空的mapper文件應(yīng)該如下:
<?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>
</mapper>
注意mapper的文件名和對(duì)應(yīng)實(shí)現(xiàn)的Dao的文件名最好一樣,方便Mybatis或者Spring的的自動(dòng)掃描機(jī)制識(shí)別翼岁!
接下來(lái)要在Mapper中設(shè)置namespace來(lái)告訴mapper實(shí)現(xiàn)哪個(gè)Dao类垫,在mapper標(biāo)簽中 加入namespace屬性:
<mapper namespace="com.example.dao.UserBaseDao">
這樣,UserBase.xml和UserBase.java文件的映射關(guān)系就建立了琅坡。
為Dao接口的方法提供SQL語(yǔ)句配置
在mapper文件中一次實(shí)現(xiàn)Dao接口中方法的sql悉患,id需要和Dao接口的方法名完全一致,如下:
<?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.example.dao.UserBaseDao">
<insert id="createUser" parameterType="com.example.entity.UserBase">
INSERT IGNORE INTO user_base(
id,
user_name,
PASSWORD,
age
)
VALUES(
#{id},
#{name},
#{password},
#{age}
)
</insert>
</mapper>
注意榆俺,parameterType和parameterMap的區(qū)別售躁,傳入單個(gè)參數(shù)的時(shí)候用parameterType,傳入多個(gè)參數(shù)的時(shí)候用ParameterMap
目前的項(xiàng)目目錄架構(gòu)如下:
MyBatis整合Spring
首先在resources目錄下創(chuàng)建spring目錄用來(lái)存放spring配置文件茴晋。在這個(gè)目錄新建一個(gè)sprng-dao.xml文件陪捷。
在spring官方文檔中找到示例配置
<?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">
<!--配置整合Mybatis過(guò)程-->
<!--1:配置數(shù)據(jù)庫(kù)相關(guān)參數(shù)-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--2:數(shù)據(jù)庫(kù)連接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--配置連接池屬性-->
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!--c3p0私有屬性-->
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="20"/>
<!--關(guān)閉后不自動(dòng)commit-->
<property name="autoCommitOnClose" value="false"/>
<!--獲取鏈接超時(shí)時(shí)間-->
<property name="checkoutTimeout" value="3000"/>
<!--獲取鏈接失敗重試次數(shù)-->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!--3:配置SqlSessionFactory對(duì)象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入數(shù)據(jù)庫(kù)連接池-->
<property name="dataSource" ref="dataSource"/>
<!--配置MyBatis全局配置文件:Mybatis-config.xml-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 掃描entity包 使用別名,可以在value中用分號(hào)放入多個(gè)位置 -->
<property name="typeAliasesPackage" value="com.example.entity"/>
<!-- 掃描sql配置文件:mapper文件掃描 -->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!--4:配置掃描DAO接口包,動(dòng)態(tài)實(shí)現(xiàn)DAO接口,并注入到Spring容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory (適應(yīng)beanname方式后處理诺擅,防止在注入之前就使用)-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--給出掃描DAO 接口的包-->
<property name="basePackage" value="com.example.dao"/>
</bean>
</beans>
趨勢(shì):約定大于配置和->節(jié)省配置文件配置
另外市袖,需要想配置文件中描述的那樣在resource目錄下新建jdbc.properties數(shù)據(jù)庫(kù)配置文件:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
jdbc.username=root
jdbc.password=apple
使用JUnit 進(jìn)行接口測(cè)試
進(jìn)入U(xiǎn)serBaseDao類,選中類的名字然后使用快捷鍵Ctrl+shift+t烁涌,選擇Create Unit Test苍碟,選擇JUnit4,然后選中所有接口烹玉,創(chuàng)建測(cè)試類驰怎,在test/java目錄下會(huì)生成測(cè)試類文件,如下圖:
在測(cè)試類中需要配置Spring和JUnit整合的相關(guān)注解二打,這樣JUnit啟動(dòng)的時(shí)候會(huì)加載Spring县忌,而Spring又整合了Mybatis,從而實(shí)現(xiàn)了JUnit和Spring继效、MyBatis的整合症杏。
由于之前只實(shí)現(xiàn)了createUser接口,我們只對(duì)該接口進(jìn)行單元測(cè)試瑞信,測(cè)試之前不要忘記打開(kāi)MySQL數(shù)據(jù)庫(kù)服務(wù)厉颤。
package com.example.dao;
import com.example.entity.UserBase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import static org.junit.Assert.*;
/*
* 配置spring和junit整合,junit啟動(dòng)時(shí)加載springIOC容器
* spring-test,junit
*/
@RunWith(SpringJUnit4ClassRunner.class)
//告訴junit spring配置文件
@ContextConfiguration({"classpath:spring/spring-dao.xml"})
public class UserBaseDaoTest {
//注入Dao實(shí)現(xiàn)依賴
@Resource //注入dao實(shí)現(xiàn)
private UserBaseDao userBaseDao;
@Test
public void createUser() throws Exception {
UserBase user = new UserBase();
user.setId(7);
user.setAge(18);
user.setName("C羅");
user.setPassword("520cluo");
int insertUser = userBaseDao.createUser(user);
System.out.println(insertUser);
}
@Test
public void updateUserById() throws Exception {
}
@Test
public void queryAllUser() throws Exception {
}
@Test
public void delateUserById() throws Exception {
}
}
去數(shù)據(jù)庫(kù)里看看是否有新的用戶被插入了:
說(shuō)明我們的Dao層配置的正確
Service層
首先新建Service文件目錄:
- service 存放service類
- exception 存放異常
- dto 數(shù)據(jù)傳輸類凡简,與entity類似逼友,entity是業(yè)務(wù)數(shù)據(jù)實(shí)體精肃,而dto更關(guān)注web和service(客戶端和服務(wù)端)之間的數(shù)據(jù)傳遞。
在service目錄下帜乞,新建UserBaseService 的接口類司抱。然后在service目錄下簡(jiǎn)歷impl包,來(lái)存放Service接口的實(shí)現(xiàn)黎烈,并新建UserBaseServiceImpl類习柠,利用IDE快捷鍵,實(shí)現(xiàn)UserBaseService接口里的方法照棋。注意有的時(shí)候IDE當(dāng)寫(xiě)接口實(shí)現(xiàn)使用@Override注解的時(shí)候资溃,會(huì)報(bào)錯(cuò),嘗試修改File--Project Structure ---->Project--->project language level和 File--Project Structure ---->Module--->project language level調(diào)整到較高的版本即可(6或以上)烈炭。
接下來(lái) 在接口中定義所要用到的Dao和Logger溶锭。然后開(kāi)始實(shí)現(xiàn)接口。
public class UserBaseServiceImpl implements UserBaseService {
private UserBaseDao userBaseDao;//在Spring容器中已實(shí)例化
private org.slf4j.Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public int createUser(UserBase user) {
return userBaseDao.createUser(user);
}
}
利用Spring IOC 獲取類的實(shí)現(xiàn)
Spring IOC提供了多種依賴注入的方式
- XML:Bean來(lái)自第三方類庫(kù)梳庆;需要命名空間比如context暖途、aop、mvc等
- 注解:項(xiàng)目自身開(kāi)發(fā)使用的類膏执,可以直接在代碼中適用注解比如@Service驻售、@Controller
- Java配置類:需要代碼控制對(duì)象創(chuàng)建的邏輯場(chǎng)景例如自定義修改依賴庫(kù)(不常用)
在這個(gè)項(xiàng)目中使用了xml配置方式、package-scan包掃描和注解方式更米。
在Resource-spring目錄下創(chuàng)建一個(gè)spring-service.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">
<!--掃描service包下的所有注解的類型-->
<context:component-scan base-package="com.example.service"/>
</beans>
接下來(lái)征峦,在Service中加入關(guān)于注解的配置迟几,注解有多種:
- @Component:代表所有組件,當(dāng)不知道是具體什么組件的時(shí)候用
- @Service
- @Dao
- @Controller
在當(dāng)前案例栏笆,在Service類前面加入@Service注解
@Service
public class UserBaseServiceImpl implements UserBaseService {
因?yàn)镈ao使用Mybatis注入类腮,需要加入注解@Autowired讓Spring在容器中搜索并獲得實(shí)例
@Autowired
private UserBaseDao userBaseDao;//在Spring容器中已實(shí)例化
到此,Service的配置完成蛉加。
Spring聲明事務(wù)
聲明式事務(wù)的介紹:
Spring 事務(wù)聲明方式的演化:
- 2.0:ProxyFactoryBean+XML
- 永久生效:tx:advice-aop命名空間(例如聲明所有以u(píng)pdate開(kāi)頭的方法都是事務(wù)方法)
- 注解@Transaction
事務(wù)方法的嵌套
略
什么時(shí)候回滾事務(wù)
拋出運(yùn)行期異常(RuntimeException)
配置聲明事務(wù)
在spring-service.xml文件中加入事務(wù)配置蚜枢,注意xml頭的導(dǎo)入:
<?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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--掃描service包下的所有注解的類型-->
<context:component-scan base-package="com.example.service"/>
<!-- 配置事務(wù)管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入數(shù)據(jù)庫(kù)連接池-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--給予注解的聲明試事務(wù)
默認(rèn)使用注解管理事務(wù)行為
-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
在Service方法中加入注解控制事務(wù):
在方法上加入@Transactional注解和throws RuntimeException異常拋出聲明
整合SpringMvc
首先對(duì)web.xml文件進(jìn)行修改,加入SpringMvc請(qǐng)求分發(fā)等機(jī)制
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<!--配置DispatcherServlet-->
<servlet>
<servlet-name>demo-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置springMVC需要加載的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>demo-dispatcher</servlet-name>
<!--過(guò)濾收到的請(qǐng)求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
web.xml文件中针饥,對(duì)servlet和SpringMVC的配置厂抽,接下來(lái)對(duì)SpringMVC自身進(jìn)行配置,在spring目錄下新建springmvc-web.xml文件丁眼。從別的spring配置文件中拷貝文件頭筷凤。
<?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:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置SpringMVC-->
<!--1:開(kāi)啟SpringMVC的注解模式-->
<!--簡(jiǎn)化配置:
(1)自動(dòng)注冊(cè)DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter
(2)提供一系列:數(shù)據(jù)綁定苞七,數(shù)字和日期的format @NumberFormat藐守,@DataTimeFormat
xml,json默認(rèn)讀寫(xiě)支持
-->
<mvc:annotation-driven/>
<!--2:靜態(tài)資源默認(rèn)servlet配置
1.加入對(duì)靜態(tài)資源的處理:js,gif,png
2.允許使用servlet-mapping 映射路徑:"/" -->
<mvc:default-servlet-handler/>
<!--3:配置jsp 顯示ViewResolver-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--4:掃描web相關(guān)的bean(把自己開(kāi)發(fā)的controller放到容器當(dāng)中)-->
<context:component-scan base-package="com.example.web"/>
</beans>
以上配置文件就配置完成了
至此挪丢,項(xiàng)目的結(jié)構(gòu)如下:
開(kāi)發(fā)接口Controller
首先在dao、service同一目錄下新建web目錄卢厂,用來(lái)存放controller吃靠。然后新建UserController類,通過(guò)注解@Controller聲明此類是Controller,然后通過(guò)一些列的注解引入server實(shí)例足淆,和請(qǐng)求的方式等
package com.example.web;
import com.example.service.UserBaseService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@Controller
public class UserController {
private static final Logger logger = (Logger) LoggerFactory.getLogger(UserController.class);
@Autowired
private UserBaseService userBaseService;
@RequestMapping(value="/user/allUser",produces="text/html;charset=UTF-8")
@ResponseBody
public String allUser(HttpServletRequest request) {
return userBaseService.queryAllUser().toString();
}
}
接下來(lái)就可以測(cè)試接口了。
首先配置Tomcat容器礁阁,選中項(xiàng)目然后選擇菜單欄的Run-Edit Configurations
在server標(biāo)簽選擇如下的Tomcat配置
然后選擇Department標(biāo)簽巧号,將項(xiàng)目部署到Tomcat
接下來(lái)就可以在Tomcat上跑服務(wù)了
如果報(bào)Compile的錯(cuò),需要到File-Setting中修改編譯版本如下圖:
測(cè)試接口如下: