一、SpringMVC框架相关
1.1 SpringMVC的核心组件
SpringMVC的核心组件:
1、前端控制器DispatcherServlet
作用:接受请求,响应结果,相当于转发器,该组件可以降低耦合度
2、处理器映射器HandlerMapping
作用:根据请求的URL查找Handler
3、处理器适配器HandlerAdapter
作用:按照特定的规则去执行Handler
4、处理器Handler
作用:按照要求编写Handler
5、视图解析器View Resolver
作用:进行视图解析,根据逻辑视图解析为真正的视图
6、视图View
作用:view是一个接口,实现类支持不同的view类型(JSP、freemarker)
1.2 SpringMVC的框架流程图示
上图属于SpringMVC的流程图,下列对上述的流程图进行解释
第一步:客户端发起请求到前端控制器DispatcherServlet
第二步:前端控制器请求处理器映射器HandlerMapping查找Handler,可以根据XML配置或者注解的方式查找
第三步:处理器映射器的HandlerMapping向前端控制器返回Hander
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器执行Handler
第六步:Handler处理器执行完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView,其中ModelAndView是SpringMVC框架的底层对象,其中包括了ModelAndView
第八步:前端控制器请求视图解析器进行视图解析,根据逻辑视图解析成真正的视图
第九步:视图解析器向前端控制器返回view
第十步:前端控制器进行视图渲染,视图渲染是将模型数据填充到Request域中
第十一步:前端控制器向用于响应结果
二、Mybatis框架相关
2.1 Mybatis的核心组件
1、SqlSessionFactoryBuilder:它会根据配置信息或者代码来生成SqlSessionFactory会话工厂
2、SqlSessionFactory:依靠工厂来生产会话SqlSession
3、SqlSession:可以发送SQL指令并返回结果,也可以获取Mapper接口
4、SqlMapper 它是Mybatis其中的一个组件,他是由一个java接口的XML配置文件构成的,需要给出对应的SQL和映射规则,它负责发送SQL指令并返回结果
2.2 Mybatis框架流程图示
三、SSM项目整合开发
3.1 数据库脚本
-- 创建书籍表
CREATE TABLE `t_book` (
`book_id` int NOT NULL AUTO_INCREMENT,
`book_name` varchar(30) DEFAULT NULL,
`author` varchar(30) DEFAULT NULL,
`price` double(11,0) DEFAULT NULL,
`reserve` int DEFAULT NULL,
`store_id` int DEFAULT NULL,
`kind_id` int DEFAULT NULL,
PRIMARY KEY (`book_id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
-- 向书籍表中插入数据
INSERT INTO db_book.t_book (book_name,author,price,reserve,store_id,kind_id) VALUES
('史前一万年','唐三',20.0,99,1,1)
,('三国演义','罗贯中',30.0,88,1,2)
,('斗破苍穹','酱香土豆',40.0,77,2,3)
,('巴黎圣母院','史蒂夫',50.0,66,3,4)
,('史前两万年','棒槌',20.0,333,2,1)
,('巴黎圣父院','棒棒锤',30.0,1231,4,2)
,('红楼梦','曹雪芹',40.0,2222,9,2)
,('水浒传','施耐庵',20.0,11223,10,2)
,('巴黎圣子院','喜喜',30.0,13213,6,2)
,('史前两万年','棒槌',20.0,3123,7,1);
3.2 项目搭建
-
这里没有使用maven工程,需要的jar包如下:
链接:https://pan.baidu.com/s/1qW9Kon7ZvOilvN-iJP4d-Q
提取码:gps1
3.3 整合思路
第一步:整合DAO层
将Mybatis和Spring进行整合,通过Spring管理Mapper;使用mapper的扫描,实现自动扫描mapper接口,在spring里面进行注册
第二步:整合service
通过Spring来管理service接口,使用配置的方式将service接口配置在spring配置文件中。
第三步:整合Spring和SpringMVC
不需要整合,因为SpringMVC是Spring的子模块
3.4 整合DAO
- 准备db.properties数据库配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db_book?useUnicode=true&charsetEncoding=utf-8
name=root
password=root
- 准备log4j日志文件
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
-
配置mybatis-config.xml配置文件
配置mybatis的全局配置文件,配置相关内容
<?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> <!--设置驼峰规则--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!--设置别名--> <typeAliases> <!--使用包扫描的方式--> <package name="com.woniuxy.book.model"/> </typeAliases> <!--加载mapper 现在需要将mybatis和spring进行整合,mapper交给spring进行管理 需要遵循的要求:mapper.xml配置文件和mapper.java需要在同一个包下 --> </configuration>
- 配置applicationContext-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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!--读取properties配置文件--> <context:property-placeholder location="db.properties" /> <!--加载数据源,这里使用的druid的连接池--> <bean id = "dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <!--加载四个参数--> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}" /> <property name="username" value="${name}"/> <property name="password" value="${password}" /> <!-- 设置初始化连接池大小 --> <property name="initialSize" value="5"></property> <!-- 最大连接数 --> <property name="maxActive" value="10"></property> <!-- 设置等待时间 --> <property name="maxWait" value="5000"></property> <!-- --> <property name="filters" value="stat"></property> </bean> <!--配置会话工厂--> <bean id = "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean"> <!--数据库连接池--> <property name="dataSource" ref="dataSource" /> <!--加载mybatis的全局配置文件mybatis-config.xml--> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/> </bean> <!--配置mapper--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.woniuxy.book.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean> </beans>
- 编写book对应的实体类
/** * @Title: Book * @ProjectName WoniuBook * @Description: Book实体类 * @Author Alon * @Date 2021/3/26 15:36 * @Version:1.0 */ public class Book { //book_id, book_name, author, price, reserve, store_id, kind_id private int bookId; private String bookName; private String author; private double price; private int reserve; private int storeId; private int kindId; //get和set方法省略.... }
- 编写Book的mapper接口
/** * @Title: BookMapper * @ProjectName WoniuBook * @Description: Book类相关的接口 * @Author Alon * @Date 2021/3/26 15:41 * @Version:1.0 */ public interface BookMapper { /** * 查询所有的书籍数据 * @return * @throws Exception */ public List<Book> queryAllBook() throws Exception; }
- 编写Book的mapper.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"> <mapper namespace="com.woniuxy.book.mapper"> <!-- 需求:查询所有的书籍信息 --> <select id="queryAllBook" resultType="Book"> SELECT book_id, book_name, author, price, reserve, store_id, kind_id FROM db_book.t_book; </select> </mapper>
3.5 整合Service层
- 定义BookService接口
/**
* @Title: BookService
* @ProjectName WoniuBook
* @Description: TODO
* @Author Alon
* @Date 2021/3/26 15:59
* @Version:1.0
*/
public interface BookService {
/**
* 查询所有的书籍
* @return
* @throws Exception
*/
public List<Book> queryAllBook() throws Exception;
}
- 实现BookService接口
/**
* @Title: BookServiceImpl
* @ProjectName WoniuBook
* @Description: BookService接口实现类
* @Author Alon
* @Date 2021/3/26 16:34
* @Version:1.0
*/
public class BookServiceImpl implements BookService {
//注入BookMapper
@Autowired
private BookMapper bookMapper;
@Override
public List<Book> queryAllBook() throws Exception {
return bookMapper.queryAllBook();
}
}
- 配置Service相关配置文件,applicationContext-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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--管理service实现类-->
<bean id = "bookService" class="com.woniuxy.book.service.impl.BookServiceImpl"/>
</beans>
- 创建事务配置文件applicationContext-transaction.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
http://www.springframework.org/schema/context/spring-context.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">
<!--引入applicationContext-dao.xml配置文件-->
<import resource="applicationContext-dao.xml" />
<!--配置事务管理,这里使用spring的jdbc进行控制事务-->
<bean id = "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置通知-->
<tx:advice id = "txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="query*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!--配置aop-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.woniuxy.book.service.impl.*.*(..))"/>
</aop:config>
</beans>
3.6 整合SpringMVC
- 创建springmvc.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:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
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">
<!--注解驱动-->
<mvc:annotation-driven />
<!--配置扫描controller里面的类-->
<context:component-scan base-package="com.woniuxy.book.controller" />
<!--试图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置前缀和后缀-->
<property name="prefix" value="/WEB-INF/jsp" />
<property name="suffix" value = ".jsp" />
</bean>
</beans>
3.7 加载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">
<!--加载spring容器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<!--配置监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置servlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springmvc.xml配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
3.8 编写Controller代码
/**
* @Title: BookController
* @ProjectName WoniuBook
* @Description: Book类的控制器
* @Author Alon
* @Date 2021/3/26 17:25
* @Version:1.0
*/
@Controller
@RequestMapping("/book")
public class BookController {
//引入BookService对象
@Autowired
private BookService bookService;
@RequestMapping("/queryAll")
public ModelAndView queryAllBook() throws Exception{
List<Book> listBook = bookService.queryAllBook();
//创建ModelAndView对象
ModelAndView model = new ModelAndView();
//填充数据
model.addObject("listBook",listBook);
//设置前端路径
model.setViewName("book");
return model;
}
}
3.9 前端测试jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>书籍编号</td>
<td>书籍名称</td>
<td>书籍作者</td>
<td>书籍单价</td>
</tr>
<c:forEach var = "book" items="${listBook}">
<tr>
<td>${bookId}</td>
<td>${bookName}</td>
<td>${author}</td>
<td>${price}</td>
</tr>
</c:forEach>
</table>
</body>
</html>