Spring+SpringMVC+Mybatis开发

一、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的框架流程图示

image

上图属于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框架流程图示

image-20210326105904409

三、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 项目搭建

  1. 这里没有使用maven工程,需要的jar包如下:

    链接:https://pan.baidu.com/s/1qW9Kon7ZvOilvN-iJP4d-Q
    提取码:gps1

3.3 整合思路

image-20210326143729199

第一步:整合DAO层

​ 将Mybatis和Spring进行整合,通过Spring管理Mapper;使用mapper的扫描,实现自动扫描mapper接口,在spring里面进行注册

第二步:整合service

​ 通过Spring来管理service接口,使用配置的方式将service接口配置在spring配置文件中。

第三步:整合Spring和SpringMVC

​ 不需要整合,因为SpringMVC是Spring的子模块

3.4 整合DAO

  1. 准备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
  1. 准备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
  1. 配置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>
    
    1. 配置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>
    
    1. 编写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方法省略....
    }
    
    1. 编写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;
    }
    
    1. 编写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层

  1. 定义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;
}
  1. 实现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();
    }
}
  1. 配置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>
  1. 创建事务配置文件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

  1. 创建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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值