一、SSM簡介
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis兩個開源框架整合而成(SpringMVC是Spring中的部分內容)。常作爲數據源較簡單的web項目的框架。
1. Spring
- Spring就像是整個項目中裝配bean的大工廠,在配置文件中可以指定使用特定的參數去調用實體類的構造方法來實例化對象。也可以稱之爲項目中的粘合劑。
- Spring的核心思想是IoC(控制反轉),即不再需要程序員去顯式地
new
一個對象,而是讓Spring框架幫你來完成這一切。
2. SpringMVC
- SpringMVC在項目中攔截用戶請求,它用於web層,相當於controller(等價於傳統的servlet和struts的action)。它的核心Servlet即DispatcherServlet承擔中介或是前臺這樣的職責,將用戶請求通過HandlerMapping去匹配Controller,Controller就是具體對應請求所執行的操作。
- 例如,用戶在地址欄輸入http://網站域名/login,那麼springmvc就會攔截到這個請求,並且調用controller層中相應的方法,(中間可能包含驗證用戶名和密碼的業務邏輯,以及查詢數據庫操作,但這些都不是springmvc的職責),最終把結果返回給用戶,並且返回相應的頁面(當然也可以只返回json/xml等格式數據)。
3. mybatis
- mybatis是對jdbc的封裝,它讓數據庫底層操作變的透明。mybatis的操作都是圍繞一個sqlSessionFactory實例展開的。mybatis通過配置文件關聯到各實體類的Mapper文件,Mapper文件中配置了每個類對數據庫所需進行的sql語句映射。在每次與數據庫交互時,通過sqlSessionFactory拿到一個sqlSession,再執行sql命令。
二、SSM各個層解釋說明
轉載自博客:點擊查看原文章
1. 持久層:DAO層(mapper)
DAO層主要是做數據持久層的工作,負責與數據庫進行聯絡的一些任務都封裝在此,
- DAO層的設計首先是設計DAO的接口,
- 然後在Spring的配置文件 (applicationContext.xml) 中定義此接口的實現類,
- 然後就可在模塊中調用此接口來進行數據業務的處理,而不用關心此接口的具體實現類是哪個類,顯得結構非常清晰,
- DAO層的數據源配置,以及有關數據庫連接的參數都在Spring的配置文件中進行配置。
2. 業務層:Service層
Service層主要負責業務模塊的邏輯應用設計。
- 首先設計接口,再設計其實現的類
- 接着再在Spring的配置文件中配置其實現的關聯。這樣我們就可以在應用中調用Service接口來進行業務處理。
- Service層的業務實現,具體要調用到已定義的DAO層的接口,
- 封裝Service層的業務邏輯有利於通用的業務邏輯的獨立性和重複利用性,程序顯得非常簡潔。
3. 表現層/控制層:Controller層(Handler層)
Controller層負責具體的業務模塊流程的控制,在此層裏面要調用Service層的接口來控制業務流程。
- 控制的配置也同樣是在Spring的配置文件裏面進行,針對具體的業務流程,會有不同的控制器,我們具體的設計過程中可以將流程進行抽象歸納,設計出可以重複利用的子單元流程模塊,這樣不僅使程序結構變得清晰,也大大減少了代碼量。
4. View層
此層與控制層結合比較緊密,需要二者結合起來協同工發。View層主要負責前臺jsp頁面的表示.
三、整體流程
- 頁面發送請求給控制器(Controller),控制器調用業務層(Service)處理邏輯,邏輯層向持久層(Dao)發送請求,持久層與數據庫交互,後將結果返回給業務層,業務層將處理邏輯發送給控制器,控制器再調用視圖展現數據。
- 調用順序:web頁面發出請求 → web.xml(配置前端控制器)→ applicationContext.xml (開啓註解掃描)→ Controller(@Resource注入service,調用Service) → Service(注入dao,調用dao) →DAO(Mapper接口映射器) → 完成具體的數據庫操作
- 其中Service層應該既調用DAO層的接口,又要提供接口給Controller層的類來進行調用,它剛好處於一箇中間層的位置。每個模型都有一個Service接口,每個接口分別封裝各自的業務處理方法。
四、簡單測試流程案例
1.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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>SSMdemo</display-name>
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>ssm</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ssm</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
2.applicatonContext.xml
- 主要配置內容:
- 數據庫信息
- dao接口
- SqlSessionFactory
- 這裏使用sqlSessionFactoryBeanName屬性是因爲如果配置的是sqlSessionFactory屬性,將不會先加載數據庫配置文件及數據源配置
- mapper掃描器(註解方式)
<?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:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!--mybatis關鍵: UserDao dao=session.getMapper(UserDao.class); -->
<!-- mybatis-spring(5,-1)第5個包最後一個類 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 需要制定dao接口 setBasePackage() -->
<property name="basePackage" value="com.hqyj.dao"></property>
<!-- 需要SqlSession對象,由於框架比較智能,不用寫ref注入,它也會自動給我們注入 -->
</bean>
<!-- 獲取SqlSessionFactory. class值=jar包mybatis-spring(1,3)-->
<bean id="ssf" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定數據庫連接參數 -->
<property name="dataSource" ref="dbcp"></property>
<!-- 指定映射文件-->
<property name="mapperLocations" value="classpath:com/hqyj/sql/*.xml"></property>
</bean>
<!-- 數據庫連接池 class值=jar包commons-dbcp(1,4) -->
<bean id="dbcp" class="org.apache.commons.dbcp.BasicDataSource">
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="url" value="jdbc:mysql://localhost:3306/cloud_note?useUnicode=true&characterEncoding=utf8"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
</bean>
<!-- 配置handlerMapping 可以用註解的方式代替 @RequestMapping -->
<!-- 想使用註解,需要先開啓註解掃描 -->
<context:component-scan base-package="com.hqyj"></context:component-scan>
<!-- 開啓驅動 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".html"></property>
</bean>
</beans>
3.UserMapper.xml (數據庫操作)
<?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">
<!-- namespace命名空間,作用就是對sql進行分類化管理(sql隔離) -->
<!-- 輔配置文件 -->
<mapper namespace="com.hqyj.dao.UserDao">
//查詢所有信息
<select id="findAll" resultType="com.hqyj.entity.User">
select * from cn_user; <!-- 注意:加不加分號都可以 -->
</select>
//按名字查找
<select id="findByName" resultType="com.hqyj.entity.User" parameterType="string">
select * from cn_user where cn_user_name like concat('%',#{name},'%') <!-- 注意:只有一個參數時,#{}內的內容可以隨便寫 -->
</select>
//增加數據
<!-- 由於是插入了所有信息,參數類型可以直接用對象即可,但是values值必須與對象的屬性相同,不能隨便寫 -->
<insert id="save" parameterType="com.hqyj.entity.User">
insert into cn_user(cn_user_id,cn_user_name,cn_user_password,cn_user_token,cn_user_nick)
values(#{cn_user_id},#{cn_user_name},#{cn_user_password},#{cn_user_token},#{cn_user_nick})
</insert>
//刪除數據
<delete id="delete" parameterType="string">
delete from cn_user where cn_user_name = #{user_name}
</delete>
//修改數據
<update id="update" parameterType="com.hqyj.entity.User">
update cn_user set cn_user_nick = #{cn_user_nick} where cn_user_name = #{cn_user_name}
</update>
</mapper>
4.UserDao.java(與UserMapper.xml的操作相對應)
package com.hqyj.dao;
import java.util.List;
import com.hqyj.entity.User;
public interface UserDao {
/*
* Mapper接口映射規則
1.id就是方法名
2.resultType就是返回值類型
3.ParameterType就是參數
4.namespace就是我們的接口路徑:包名.接口名
*/
public List<User> findAll();
public List<User> findByName(String name);
public void save(User user);
public void delete(String name);
public void update(User user);
}
5.User.java
package com.hqyj.entity;
public class User {
private String cn_user_id;
private String cn_user_name;
private String cn_user_password;
private String cn_user_token;
private String cn_user_nick;
public String getCn_user_id() {
return cn_user_id;
}
public void setCn_user_id(String cn_user_id) {
this.cn_user_id = cn_user_id;
}
public String getCn_user_name() {
return cn_user_name;
}
public void setCn_user_name(String cn_user_name) {
this.cn_user_name = cn_user_name;
}
public String getCn_user_password() {
return cn_user_password;
}
public void setCn_user_password(String cn_user_password) {
this.cn_user_password = cn_user_password;
}
public String getCn_user_token() {
return cn_user_token;
}
public void setCn_user_token(String cn_user_token) {
this.cn_user_token = cn_user_token;
}
public String getCn_user_nick() {
return cn_user_nick;
}
public void setCn_user_nick(String cn_user_nick) {
this.cn_user_nick = cn_user_nick;
}
@Override
public String toString() {
return "User [cn_user_id=" + cn_user_id + ", cn_user_name=" + cn_user_name + ", cn_user_password="
+ cn_user_password + ", cn_user_token=" + cn_user_token + ", cn_user_nick=" + cn_user_nick + "]";
}
}
6.login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登錄頁面</title>
</head>
<body>
<form action="ssm.do">
<input type="submit" value="SSM"></input>
</form>
</body>
</html>
7.UserController.java
package com.hqyj.controller;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.hqyj.entity.User;
import com.hqyj.service.UserService;
//controller調用service
@Controller //這裏用控制層組件註解,不用通用註解!相當於<bean id="userController" class="com.hqyj.controller.UserController">
public class UserController {
@Resource //相當於<bean id="userService" class="com.hqyj.service.UserService">
private UserService service;
@RequestMapping("/ssm.do")
public String function(){
System.out.println(111);
List<User> users=service.testService();
for(User u:users){
System.out.println(u.getCn_user_name());
}
return "success";
}
}
8.UserService.java
package com.hqyj.service;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.hqyj.dao.UserDao;
//service調用dao
import com.hqyj.entity.User;
@Service
public class UserService {
@Resource
private UserDao userDao;
public List<User> testService(){
List<User> users=userDao.findByName("*d*");
return users;
}
}
9.success.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
you have succeed!
</body>
</html>
10.測試
(1) 運行login.html
(2) 點擊SSM
(3)從上圖可知測試成功