SSM框架,一般是指將spring mvc+spring+mybatis三個框架整合在一塊兒進行工做,spring mvc自己就是spring的一部分,因此這二者之間不用整合,這裏主要作的事情就是將spring與mybatis框架進行整合,實際上就是將SqlSessionFactory對象交由spring來管理,事務方面也交由spring來管理。css
SSM框架主要分爲bean/entity層,mapper/dao層,service層,controller層。html
(1)bean層(也叫entity/pojo/ model層) 用於存放咱們的實體類,與數據庫中的屬性值基本保持一致。在bean建立具體的實體類對象,便於其餘層對實體類對象進行直接操做前端
(2)dao層(mapper層) 負責與數據庫進行聯絡的一些任務都封裝在此,具體到對於某個表、某個實體的增刪改查java
(3)service層 service層主要負責業務模塊的邏輯應用設計,能夠細分爲service接口和serviceImpl實現類mysql
(4)controller層git
控制器,導入service層,負責具體的業務模塊流程的控制,在此層裏面要調用Service層的接口來控制業務流程github
調用流程: 前端JSP /html——> Controller ——> Service ——> Dao ——> 數據庫web
上圖來源 IDEA 整合 SSM 框架學習--我沒有三顆心臟ajax
controller層使用ajax+json與前端的html文件進行交互,獲取前端請求和返回數據給前端。前端頁面用戶請求經過ajax傳到controller層調用相應的方法處理,而後反饋數據到html文件,把處理後數據顯示在頁面上,反饋給用戶。spring
controller 層在執行相應的方法時,其實是去調用service層對應的接口,從而service層獲取實現類中的方法去完成對應業務,service層通常用事務來進行方法操做,保證操做的一致性。
service層實現類包含業務實現方法,也包含一些關於數據庫處理的操做,但不是直接和數據庫打交道。service層的方法若是須要操做數據庫,那麼就須要去調用dao層的接口。
dao層中mybatis框架經常使用mapper動態代理,因此dao層接口會對應mapper映射文件裏面相應的sql語句,從而實現對數據庫的操做。
這裏還有bean層,bean層一般存放咱們的實體類,與數據庫中的屬性值基本保持一致。在bean建立具體的實體類對象,便於其餘層對實體類對象進行直接操做。最終在dao層中這些實體類對象的操做會直接映射到對應的sql語句,操做對應的數據庫裏面的數據。
反過來理解:啓動項目的時候會解析mapper.xml文件,xml中有一個命名空間namespace指向dao,用動態代理和反射技術會生成一個dao層的實現類。dao層用來操做數據庫,返回數據,service調用dao層獲取的數據,根據具體的業務作一些處理,controller層調用service層,通常用來接收前臺傳來的數據,再將從service層獲取的數據傳給前臺。
一、建立一個maven項目,在裏面新建經常使用的包,bean、controller、service、dao等;
二、完成各配置文件配置
(1)添加依賴,在工程的pom.xml文件中添加項目須要的jar包(主要是spring mvc+spring+mybatis3個框架涉及的jar包)
<?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"> <parent> <artifactId>learn</artifactId> <groupId>test</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>_11_ssm_crud</artifactId> <packaging>war</packaging> <name>_11_ssm_crud</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.4.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.13</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.0.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.4.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-parameter-names</artifactId> <version>2.9.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jdk8</artifactId> <version>2.9.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.9.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.46</version> </dependency> </dependencies> <build> <finalName>_11_ssm_crud</finalName> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build> </project>
(2)完成spring-mvc部分的配置
a. resouce文件夾下添加spring-mvc.xml文件,完成spring-mvc部分配置文件配置。在spring-mvc.xml完成註冊組件掃描器、視圖解析器、內部視圖解析器、靜態資源、解決返回json數據亂碼問題的配置。
<?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.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"> <!--解決返回json數據亂碼問題--> <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <mvc:annotation-driven> <mvc:message-converters> <ref bean="stringHttpMessageConverter" /> </mvc:message-converters> </mvc:annotation-driven> <!--靜態資源--> <mvc:resources mapping="/images/**" location="/images/" /> <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/html/**" location="/html/" /> <!-- 註冊組件掃描器 ,組件掃描器只掃描controller包,不要掃描service等其餘包,不然事務配置會失效--> <context:component-scan base-package="test.controller"/> <!-- 視圖解析器 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> <!--內部視圖解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/html/"/> <property name="suffix" value=".html"/> </bean> </beans>
b. 完成WEB-INF/web.xml配置
完成指定spring配置文件的路徑、註冊spring監聽器、註冊字符集過濾器、註冊spring mvc中央控制器的配置。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!--指定spring配置文件的位置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-*.xml</param-value> </context-param> <!--註冊監聽器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--配置spring MVC配置項--> <!--字符編碼過濾器--> <filter> <filter-name>characterEncodingFilter</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> <!--強制指定字符編碼,即若是在request中指定了字符編碼,那麼也會爲其強制指定當前設置的字符編碼--> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 註冊spring MVC中央控制器 --> <servlet> <servlet-name>springMVC</servlet-name> <!-- spring MVC中的核心控制器 --> <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> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
(3)完成mybatis部分的配置
a. 添加數據庫配置文件db.properties
#驅動 jdbc.driver=com.mysql.jdbc.Driver #數據庫鏈接地址 jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm?useSSL=false #用戶名及數據庫密碼,這裏須要修改,每一個數據庫的密碼都不同 jdbc.user=root jdbc.password=mysql
b. 添加數據庫日誌配置文件log4j.properties
log4j.rootLogger=debug,console 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= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
c. 添加數據庫緩存配置文件ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </defaultCache> </ehcache>
d. 添加mybatis.xml配置文件
這裏只須要註冊bean便可,mapper 映射文件的註冊來使用spring的 MapperScannerConfigurer掃描器進行掃描,SqlSessionFactory交由spring管理,數據源也交由spring管理,因此都不須要配置。
<?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> <typeAliases> <package name="test.bean"/> </typeAliases> </configuration>
e. 添加spring-mybatis.xml配置文件
加載數據源,將sqlsessionfactory交由spring管理,使用MapperScannerConfigurer將將Mapper接口生成代理對象。須要注意的是,在註冊組件掃描器的時候無需再掃描controller包下的類了,由於已經在springmvc的配置文件中掃描過了。
<?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:aop="http://www.springframework.org/schema/aop" 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/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 加載配置文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 註冊組件掃描器 --> <context:component-scan base-package="test"> <!--再也不掃描controller註解--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" </context:component-scan> <!-- 數據庫鏈接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> <property name="driverClassName" value="${jdbc.driver}" /> <property name="maxActive" value="10" /> <property name="minIdle" value="5" /> </bean> <!-- 讓spring管理sqlsessionfactory 使用mybatis和spring整合包中的 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 數據庫鏈接池 --> <property name="dataSource" ref="dataSource" /> <!-- 加載mybatis的全局配置文件 --> <property name="configLocation" value="classpath:mybatis.xml" /> </bean> <!-- 自動掃描 將Mapper接口生成代理對象 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--Mapper文件所在路徑--> <property name="basePackage" value="monmkey1024.dao" /> </bean> </beans>
(4)完成spring部分的配置
添加spring-tx.xml文件進行事務的管理,採用AOP註解方式進行事務管理
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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/aop http://www.springframework.org/schema/aop/spring-aop.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"> <!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 數據源 --> <property name="dataSource" ref="dataSource" /> </bean> <!--開啓註解事務驅動--> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
三、完成各層接口及實現類
(1)建立對應的數據庫表t_user,包含id(主鍵)、name、phone、address、birthday字段
(2)bean層,建立User類--用戶類對象
package test1.bean; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; public class User { private int id; private String name; private String phone; private String address; @DateTimeFormat(pattern = "yyyy-mm-dd") private LocalDate birthday; public User() { } public User(String name, String phone, String address, LocalDate birthday) { this.name = name; this.phone = phone; this.address = address; this.birthday = birthday; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public LocalDate getBirthday() { return birthday; } public void setBirthday(LocalDate birthday) { this.birthday = birthday; } }
(3)dao層,建立UserDao接口文件和UserDao對應mapper文件UserDao.xml
UserDao接口文件
package test.dao; import test.bean.User; import java.util.List; public interface UserDao { void addUser(User user); void updateUser(User user); List<User> selectUsers(); User selectUserById(int id); void deleteUser(int id); }
UserDao.xml(具體對數據庫操做的sql語句在此編輯)---mapper文件
<?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="test.dao.UserDao"> <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> <insert id="addUser"> INSERT INTO t_user (name,phone,address,birthday) VALUES (#{name},#{phone},#{address},#{birthday}); <selectKey resultType="int" keyProperty="id" order="AFTER"> SELECT @@identity </selectKey> </insert> <delete id="deleteUser"> DELETE FROM t_user where id=#{id} </delete> <update id="updateUser"> UPDATE t_user set name=#{name},phone=#{phone},address=#{address},birthday=#{birthday} where id=#{id} </update> <select id="selectUsers" resultType="user"> SELECT id,name,phone,address,birthday FROM t_user </select> <select id="selectUserById" resultType="user"> SELECT id,name,phone,address,birthday FROM t_user where id=#{id} </select> </mapper>
(4)service層:建立UserService接口和實現類
UserService接口
package test.service; import test.bean.User; import java.util.List; public interface UserService { void addUser(User user); void updateUser(User user); List<User> selectUsers(); User selectUserById(int id); void deleteUser(int id); }
UserServiceImpl實現類()
package test.service.impl; import test.bean.User; import test.dao.UserDao; import test.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service //用於對 Service 實現類進行註解,Spring會去自動建立UserServiceImpl的對象,而且經過註解,容器會查找UserService類型的實例userService將其注入,也能夠用@Component @Transactional //使用註解配置事務 public class UserServiceImpl implements UserService { @Autowired //自動注入註解,該註解默認使用按類型自動裝配,即容器會查找UserDao類型的實例將其注入,初始化其對象,而後能夠直接使用對象中的方法如 userDao.addUser(user),不用再用new建立對象 private UserDao userDao; @Override public void addUser(User user) { userDao.addUser(user); } @Override public void updateUser(User user) { userDao.updateUser(user); } @Override public List<User> selectUsers() { return userDao.selectUsers(); } @Override public User selectUserById(int id) { return userDao.selectUserById(id); } @Override public void deleteUser(int id) { userDao.deleteUser(id); } }
(5)controller層:建立controller類,使用restful風格:
package test.controller; import com.alibaba.fastjson.JSON; import test.bean.User; import test.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController //restful風格中spring mvc經常使用註解 public class UserController { @Autowired private UserService userService; @GetMapping("/users") //該註解用來替代RequestMapping,特色是@GetMapping只處理get方式的請求,//註解後面要加上URL地址 public String selectUsers(){ List<User> users = userService.selectUsers(); return JSON.toJSONString(users); } @GetMapping("/users/{id}")//註解後面要加上URL地址,地址中包含所須要的資源,好比這裏的id public String selectUserById(@PathVariable int id) { User user = userService.selectUserById(id); return JSON.toJSONString(user); } @PostMapping("/users") public String addUser(@RequestBody User user) { try { userService.addUser(user); return JSON.toJSONString("success"); } catch (Exception e) { e.printStackTrace(); return JSON.toJSONString("fail"); } } @PutMapping("/users/{id}") public String updateUser(@PathVariable int id, @RequestBody User user) { try { user.setId(id); userService.updateUser(user); return JSON.toJSONString("success"); } catch (Exception e) { e.printStackTrace(); return JSON.toJSONString("fail"); } } @DeleteMapping("/users/{id}") public String deleteUser(@PathVariable int id) { try { userService.deleteUser(id); return JSON.toJSONString("success"); } catch (Exception e) { e.printStackTrace(); return JSON.toJSONString("fail"); } } }
四、最後根據須要在webapp/html文件夾下建立須要的html前端文件便可。
最終項目文件架構以下
以上就是搭建SSM框架組合完成簡單增刪改查的功能,你們能夠根據這個思路本身去實踐下。
demo文件:(如連接失效請留言)
github地址:https://github.com/Ideals-L/ssm_demo
或者網盤以下
連接:https://pan.baidu.com/s/19Z8GcMlFP57JISaXCp-14g
提取碼:mmgd
參考資料:
monkey1024-Spring系列教程