詳解SSM整合
SSM 整合
整合的思路是:
先建立spring框架
通過spring整合spring mvc
通過spring整合mybatis
工程建立
建立Maven工程–>create for archtype–>webapp
建立專案結構
在recourses目錄下建立 dbconfig.properties
,log4j.properties
,mysqlConfig.xml
,springmvc.xml
,applicationContext.xml
工作流程
在pom.xml新增相關依賴 — mybatis
<dependencies>
<!--junit4--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!--日誌--> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- mysql資料庫驅動依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version> </dependency> <!--c3p0 資料連線池 jar--> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.1</version> </dependency> <!--C3P0額外依賴的一個jar包--> <dependency> <groupId>com.mchange</groupId> <artifactId>mchange-commons-java</artifactId> <version>0.2.10</version> </dependency> <!-- Mybatis框架:--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.2</version> </dependency> <!-- MyBatis整合Spring的適配包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!--EL表示式--> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> <type>jar</type> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <type>jar</type> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!--json jar包--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.8.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.7.5</version> </dependency> <!-- Spring依賴 --> <!--1. Spring核心依賴,上面已經有日誌了 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!--spring的aop jar包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!--這兩個jar包是阿帕奇的--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.13</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> <!--2. SpringDAO層依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!--3. Spring WEB依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!--4.Spring-test相關依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.7.RELEASE</version> </dependency> </dependencies>
基本思路
建立spring框架
1.建立bean
public class user implements Serializable { private Integer id; private String name; private String gender; private String email; @Override public String toString() { return "user{" + "id=" + id + ", name='" + name + '\'' + ", gender='" + gender + '\'' + ", email='" + email + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
2.建立bean的dao
public interface userDao {
public List<user> findAll();
}
3.建立bean的userService的介面
package club.twzw.service; import club.twzw.bean.User; import org.springframework.stereotype.Service; import java.util.List; public interface UserService { public List<User> findAll(); }
4.實現userServiceImpl,並給userServiceImpl 起別名userService
@Service("userService") <<<<-----------
public class userServiceImpl implements userService {
@Override
public List<user> findAll() {
System.out.println("查詢所有使用者。。。");
return null;//service.findAll();
}
}
5.在resources檔案下建立檔案applicationContext.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!--只處理Service和dao -->
<context:component-scan base-package="club.twzw">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
7.書寫測試方法
@Test
public void testQueryUserList() {
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
userService service = (userService) ac.getBean("userService"); // 因為給service起了別名,所以通過id的方式獲取class
service.findAll();
}
輸出
至此spring框架已經建立。
建立spring mvc
在web.xml檔案中修改並配置過濾器,中文亂碼過濾
<?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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>spring-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--載入springmvc.xml配置檔案-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--啟動伺服器時,建立該servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置中文亂碼過濾器-->
<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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
</web-app>
在resources資料夾下建立springmvc.xml檔案,開啟註解掃描,檢視解析器以及過濾靜態資源和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: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">
<!--開啟註解掃描,只掃描controller-->
<context:component-scan base-package="club.twzw">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--配置檢視解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="suffix" value=".jsp"/>
<property name="prefix" value="/WEB-INF/views/"/>
</bean>
<!--過濾靜態資源-->
<!-- <mvc:resources mapping="/css/**" location="/css/"/>-->
<!-- <mvc:resources mapping="/images/**" location="/images/"/>-->
<!-- <mvc:resources mapping="/js/**" location="/js/"/>-->
<!--開啟springmvc註解支援-->
<mvc:annotation-driven/>
</beans>
書寫controller
package club.twzw.controller;
import club.twzw.bean.User;
import club.twzw.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
public class UserController {
@Autowired
private UserService service;
@RequestMapping("/findAll")
public String findAll(Model model){
System.out.println("success");
List<User> all = service.findAll();
model.addAttribute("user",all);
return "list";
}
}
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<a href="/findAll">檢視所有使用者</a>
</body>
</html>
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>scuccess</title>
</head>
<body>
<h1>scuccess</h1>
</body>
</html>
頁面如果做成顯示,自此成功新增spring mvc 開始整合
在整合之前需要明白,我們需要在controller中呼叫service,最快捷的便是使用依賴注入,而至今使用Tomcat伺服器只加載了springmvc.xml檔案,並沒有applicationContext.xml的載入(也就是spring並沒有被載入),所以可以通過監聽ServeltContext域物件,在建立時載入spring的配置檔案(applicationContext.xml)
配置監聽器
在web.xml檔案下新增listener,context-param設定監聽和applicationContext.xml的檔案路徑
<?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_4_0.xsd"
version="4.0">
<!--載入Spring-->
<!--配置監聽器,預設只加載web-inf目錄下的applicationContext.xml-->
<!--但是我們的檔案在resources資料夾下--> <<<<------
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--設定配置檔案路徑--> <<<<------
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--載入spring mvc-->
<!--配置前端控制器-->
<servlet>
<servlet-name>spring-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--載入springmvc.xml配置檔案-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--啟動伺服器時,建立該servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置中文亂碼過濾器-->
<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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
</web-app>
這樣我們就可以使用依賴注入了
使用依賴注入並從新發布,如果正常,就可以在控制檯看到兩句話
package club.twzw.controller;
import club.twzw.service.impl.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
@Autowired
private UserService service;
@RequestMapping("/findAll")
public String findAll(){
System.out.println("success");
service.findAll();
return "success";
}
}
這樣spring mvc 就已經整合完畢了
建立mybatis環境
在UserDao中使用註解查詢
package club.twzw.dao;
import club.twzw.bean.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserDao {
@Select("select * from user")
public List<User> findAll();
}
建立mybatis的核心配置檔案mysqlConfig.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">
<!-- mybatis 的 主配置檔案-->
<configuration>
<environments default="mysql">
<!--配置mysql-->
<environment id="mysql">
<!--配置事務型別-->
<transactionManager type="JDBC"/>
<!--配置資料來源/連線池-->
<dataSource type="POOLED">
<!--配置連線資料庫的基本資訊-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://xx.xx.xx:3306/learn?useSSL=false"/>
<property name="username" value="learn"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定對映配置檔案的位置,對映配置檔案指的是每個dao獨立的配置檔案-->
<mappers>
<!--使用xml進行查詢-->
<!--<mapper resource="mapper/UserDao.xml"/>-->
<!--使用註解-->
<!--<mapper class="club.twzw.dao.UserDao"/>-->
<!--掃描mapper下所有註解-->
<package name="mapper"/>
</mappers>
</configuration>
書寫測試方法
@Test
public void test() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("mysqlConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(resourceAsStream);
SqlSession session = factory.openSession(true);
UserDao mapper = session.getMapper(UserDao.class);
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
}
}
輸出結果:
說明了mybatis可用,那麼可以開始整合了
整理mybatis,思路相同,同樣使用依賴注入,將mysqlConfig.xml新增到容器中,並自動注入
在spring的檔案中整合mybatis,配置連線池,factory,dao所在的包,此時有無將mysqlConfig.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--只處理Service和dao -->
<context:component-scan base-package="club.twzw">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--Spring 配置mybatis-->
<!--配置連線池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://xx.xx.xx.xx:3306/learn?useSSL=false"/>
<property name="user" value="learn"/>
<property name="password" value="123456"/>
</bean>
<!--配置sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置dao所在的包-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="club.twzw.dao"/>
</bean>
</beans>
使用依賴注入
在dao類上新增@Repository註解
@Repository <<<<<--------
public interface UserDao {
@Select("select * from user")
public List<User> findAll();
}
在serviceimpl中注入介面
package club.twzw.service.impl;
import club.twzw.bean.User;
import club.twzw.dao.UserDao;
import club.twzw.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("UserService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao dao;
public List<User> findAll() {
System.out.println("查詢所有使用者。。。");
return dao.findAll();
}
}
修改controllerfindAll方法
package club.twzw.controller;
import club.twzw.bean.User;
import club.twzw.service.impl.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
public class UserController {
@Autowired
private UserService service;
@RequestMapping("/findAll")
public String findAll(Model model){
System.out.println("success");
List<User> all = service.findAll();
model.addAttribute("user",all);
return "list";
}
}
新增list.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/10/29
Time: 21:07
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:forEach items="${user}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.gender}</td>
<td>${user.email}</td>
</tr>
</c:forEach>
</body>
</html>
實現訪問
實現插入
controller
@RequestMapping("/save")
public String save(Model model){
System.out.println("success");
User u = new User();
u.setEmail("[email protected]");
u.setGender("男");
u.setName("comi");
boolean b = service.Save(u);
System.out.println(b);
return "success";
}
UserService
package club.twzw.service;
import club.twzw.bean.User;
import org.springframework.stereotype.Service;
import java.util.List;
public interface UserService {
public List<User> findAll();
public boolean Save(User u);
}
UserServiceImpl
package club.twzw.service.impl;
import club.twzw.bean.User;
import club.twzw.dao.UserDao;
import club.twzw.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("UserService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao dao;
public List<User> findAll() {
System.out.println("查詢所有使用者。。。");
return dao.findAll();
}
@Override
public boolean Save(User u) {
return dao.Save(u);
}
}
dao
package club.twzw.dao;
import club.twzw.bean.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserDao {
@Select("select * from user")
public List<User> findAll();
@Insert("insert into user (name,gender,email) values(#{name},#{gender},#{email})")
public boolean Save(User u);
}
輸出:
訪問路徑(http://localhost:8080/ssmWork_war_exploded/save)
這樣我們的ssm框架就完成整合了,可以去幹大事了!!
碼雲開源庫:碼雲連結