SSM框架整合
SSM框架整合
一、idea创建项目
1.创建普通的maven项目然后next


建完之后的第一件大事就是项目改成UTF-8编码:

2.maven导入相关的pom依赖
pom.xml:
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!--数据库驱动-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
<!--数据库连接池-->
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--Servlet - JSP -->
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--Mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!--Spring-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.6</version>
</dependency>
<!--lombok偷懒神器-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<!--json-->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
<!--事务织入-->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!--log4j日志-->
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
如果是连Oracle数据库的话,直接把数据库驱动的依赖换掉就行了:
<!--数据库驱动-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
3.maven资源过滤设置
pom.xml:
<!--在build中配置resources 防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
二、连接数据库、创建配置文件
连接数据库:

创建文件:

创建mybatis-config.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>
</configuration>
创建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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
applicationContext.xml是spring的配置文件,可以通过以下进行查看引入的配置文件:


创建database.properties:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=填你自个的密码
其中ssmbuild是数据库名,切记要改!!!
如果是oracle数据库:
jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:XE
jdbc.username=system
jdbc.password=填你自个的
三、Mybatis层
mybatis-config.xml中增加配置:
<configuration>
<!--交给spring去配置数据源-->
<typeAliases>
<!--直接扫描包-->
<package name="com.huang.pojo"/>
</typeAliases>
</configuration>
1. 创建实体类
pojo下按照数据库的表创建实体类Books:
package com.huang.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {
private int bookID;
private String bookName;
private int bookCounts;
private String detail;
}
其中引入了偷懒神器lombok:
@Data //相当于下图 Getter and Setter
@AllArgsConstructor //相当于下图 Constructor 有参构造
@NoArgsConstructor //相当于无参构造
'Alt'+'Insert'键呼出如下图:

查看引入的效果:

2.创建dao接口
在dao下创建BookMapper接口类,并增加需要的增删改查操作:
package com.huang.dao;
import com.huang.pojo.Books;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BookMapper {
//增加一本书
int addBook(Books books);
//按ID删除
int deleteBookById(@Param("bookID") int id);
//按ID修改
int updateBook(Books books);
//按ID查询
Books selectBookById(@Param("bookID") int id);
//查询所有
List<Books> selectAllBook();
//按Name查询
Books selectBookByName(@Param("bookName") String bookName);
}
然后在dao下创建BookMapper.xml写入相关的操作sql语句:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huang.dao.BookMapper">
<insert id="addBook" parameterType="books">
insert into ssmbuild.books(bookName,bookCounts,detail)
values(#{bookName},#{bookCounts},#{detail});
</insert>
<delete id="deleteBookById" parameterType="int">
delete from ssmbuild.books where bookID = #{bookID};
</delete>
<update id="updateBook" parameterType="books">
update ssmbuild.books
set bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail}
where bookID=#{bookID};
</update>
<select id="selectBookById" resultType="books">
select * from ssmbuild.books
where bookID=#{bookID};
</select>
<select id="selectAllBook" resultType="books">
select * from ssmbuild.books;
</select>
<select id="selectBookByName" resultType="books">
select * from ssmbuild.books where bookName=#{bookName};
</select>
</mapper>
如果是oracle数据库,相关的操作sql语句则和mysql稍微有点不同:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huang.dao.BookMapper">
<insert id="addBook" parameterType="books">
insert into "books"("bookName","bookCounts","detail")
values(#{bookName},#{bookCounts},#{detail})
</insert>
<delete id="deleteBookById" parameterType="int">
delete from "books" where "bookID" = #{bookID}
</delete>
<update id="updateBook" parameterType="books">
update "books"
set "bookName"=#{bookName},"bookCounts"=#{bookCounts},"detail"=#{detail}
where "bookID"=#{bookID}
</update>
<select id="selectBookById" resultType="books">
select * from "books"
where "bookID"=#{bookID}
</select>
<select id="selectAllBook" resultType="books">
select * from "books"
</select>
<select id="selectBookByName" resultType="books">
select * from "books" where "bookName"=#{bookName}
</select>
</mapper>
然后需要把xml文件绑定到mybatis-config.xml配置文件中:
<configuration>
<!--交给spring去配置数据源-->
<typeAliases>
<package name="com.huang.pojo">
</typeAliases>
<!--新增的xml文件需要绑定到这里面 不然无法识别-->
<mappers>
<mapper class="com.huang.dao.BookMapper"/>
<!--也可以直接扫描包-->
<!--<package name="com.huang.dao"/>-->
</mappers>
</configuration>
如果mapper文件和接口的名字不一样,可以用resource引入
<mapper resource="com.huang.dao.BookMapper"></mapper>
3.创建业务层service
service下创建BookService接口:
package com.huang.service;
import com.huang.pojo.Books;
import java.util.List;
public interface BookService {
//增加一本书
int addBook(Books books);
//按ID删除
int deleteBookById(int id);
//按ID修改
int updateBook(Books books);
//按ID查询
Books selectBookById(int id);
//查询所有
List<Books> selectAllBook();
//按Name查询
Books selectBookByName(String bookName);
}
service下创建接口的实现类BookServiceImpl类:

然后调用接口类,加上implements BookService,'Alt'+'Enter'呼出上图所示选择框,选择Implement methods继承接口类的所有方法:
package com.huang.service;
import com.huang.pojo.Books;
import java.util.List;
public class BookServiceImpl implements BookService{
@Override
public int addBook(Books books) {
return 0;
}
@Override
public int deleteBookById(int id) {
return 0;
}
@Override
public int updateBook(Books books) {
return 0;
}
@Override
public Books selectBookById(int id) {
return null;
}
@Override
public List<Books> selectAllBook() {
return null;
}
@Override
public Books selectBookByName(String bookName) {
return null;
}
}
service要调dao层,所以要组合dao,在类里面加上:
private BookMapper bookMapper;
然后增加它的set方法:
public void setBookMapper(BookMapper bookMapper) {
this.bookMapper = bookMapper;
}
然后就可以调用dao层,以addBook业务为例:
@Override
public int addBook(Books books) {
return bookMapper.addBook(books);
}
全部改完之后,BookServiceImpl类长这个样子:
package com.huang.service;
import com.huang.dao.BookMapper;
import com.huang.pojo.Books;
import java.util.List;
public class BookServiceImpl implements BookService{
private BookMapper bookMapper;
public void setBookMapper(BookMapper bookMapper) {
this.bookMapper = bookMapper;
}
@Override
public int addBook(Books books) {
return bookMapper.addBook(books);
}
@Override
public int deleteBookById(int id) {
return bookMapper.deleteBookById(id);
}
@Override
public int updateBook(Books books) {
return bookMapper.updateBook(books);
}
@Override
public Books selectBookById(int id) {
return bookMapper.selectBookById(id);
}
@Override
public List<Books> selectAllBook() {
return bookMapper.selectAllBook();
}
@Override
public Books selectBookByName(String bookName) {
return bookMapper.selectBookByName(bookName);
}
}
四、Spring层
1. 创建spring-dao.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
前面已经创建了ApplicationContext,直接点添加:

1.关联数据库配置文件:
<?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
https://www.springframework.org/schema/context/spring-context.xsd">
<!--1.关联数据库配置文件-->
<context:property-placeholder location="classpath:database.properties"/>
</beans>
2.数据库连接池:
<!--2.连接池 dbcp:半自动化操作 不能自动连接
c3p0:自动化操作(自动化的加载配置文件 并且可以自动设置到对象中)
druid
hikari
-->
<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="10"/>
<!-- 关闭连接后不自动commit -->
<property name="autoCommitOnClose" value="false"/>
<!-- 获取连接超时时间 -->
<property name="checkoutTimeout" value="10000"/>
<!-- 当获取连接失败重试次数 -->
<property name="acquireRetryAttempts" value="2"/>
</bean>
3.sqlSessionFactory配置:
<!--3.配置sessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!--加载mybatis核心文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
4.配置dao接口扫描包:
<!--4.扫描mapper所在的包 为mapper创建实现类-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入sqlSessionFactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--扫描包:dao-->
<property name="basePackage" value="com.huang.dao"/>
</bean>
2. 创建spring-service.xml文件
1.扫描service下的包:
<!--1.扫描service下的包-->
<context:component-scan base-package="com.huang.service"/>
2.将所有业务类注入到Spring:
<!--2.将我们的所有业务类注入到Spring 可以通过配置 或 注解实现-->
<bean id="BookServiceImpl" class="com.huang.service.BookServiceImpl">
<property name="bookMapper" ref="bookMapper"/>
</bean>
如果爆红了,则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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-dao.xml"/>
<import resource="spring-service.xml"/>
</beans>
其实这个配置可以用注解代替:

3.声明式事务配置
<!--3.声明式事务配置-->
<bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
最后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"
xmlns:aop="http://www.springframework.org/schema/aop"
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
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--1.扫描service下的包-->
<context:component-scan base-package="com.huang.service"/>
<!--2.将我们的所有业务类注入到Spring 可以通过配置 或 注解实现-->
<bean id="BookServiceImpl" class="com.huang.service.BookServiceImpl">
<property name="bookMapper" ref="bookMapper"/>
</bean>
<!--3.声明式事务配置-->
<bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
五、SpringMVC层
1. 将项目变成web项目



web.xml中增加:
<!--1.配置DispatchServlet: 这个是SpringMVC的核心:请求分发器 前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--DispatchServlet要绑定spring的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!--启动级别:1-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--2.配置springMVC的乱码过滤-->
<!--encodingFilter-->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Session过期时间-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
另外在web.xml中加上:
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
可以指定默认打开的页面。
2. 创建spring-mvc.xml文件
spring-mvc.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:mvc="http://www.springframework.org/schema/mvc"
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/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--1.注解驱动-->
<mvc:annotation-driven/>
<!--2.静态资源过滤-->
<mvc:default-servlet-handler/>
<!--3.扫描包:controller-->
<context:component-scan base-package="com.huang.controller"/>
<!--4.视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
引入到总的applicationContext.xml文件中:
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-dao.xml"/>
<import resource="spring-service.xml"/>
<import resource="spring-mvc.xml"/>
</beans>
至此,基本的SSM框架已经全部搭建完成!!!

六、实现业务
在框架的基础上,让controller跟jsp交互起来就行了。
1. 创建BookController文件
在controller下创建BookController文件:
package com.huang.controller;
import com.huang.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/book")
public class BookController {
//controller 调 service 层
@Autowired
@Qualifier("BookServiceImpl")
private BookService bookService;
}
以上的@Qualifier("BookServiceImpl")只有在 四、2.2中加了配置而不是注解才能用。
BookController.java:
@Controller
@RequestMapping("/book")
public class BookController {
//controller 调 service 层
@Autowired
@Qualifier("BookServiceImpl")
private BookService bookService;
//查询全部书籍,并且返回到一个书籍展示页面
@RequestMapping("/allBook")
public String list(Model model) {
List<Books> books = bookService.selectAllBook();
model.addAttribute("books", books);
return "allBook";
}
}
2. 创建并配置jsp页面
当调用controller层/book/allBook时根据spring-mvc.xml中配置视图解析器:
<!--4.视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
我们可以知道return "allBook";会跳转到/WEB-INF/jsp/allBook.jsp
我们新建文件:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>书籍展示</title>
</head>
<body>
<h1>书籍展示</h1>
</body>
</html>
于是,我们在index.jsp中:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h3>
<a href="${pageContext.request.contextPath}/book/allBook">进入书籍页面</a>
</h3>
</body>
</html>
点击a连接即可发出/book/allBook请求,启动tomcat9测试一下:


3. 遇到常见错误
然后一跑就报错:Artifact ssmbuild2:war exploded: Error during artifact deployment. See server log for details.

解决办法:


然后就发现多了一个lib里面有很多jar包:



然后再重新配tomcat就行:

最后,保证这些选项,文件结构更好看:

浙公网安备 33010602011771号