SSM 架构基础

文章目录

一、简介

Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。

spring主要的核心依赖有beans,code, context,spel 这是spring里最基本的也是最核心的jar包(或者说是依赖)

spring有两个核心思想:IOC (控制反转) , AOP(面向切面编程)

spring容器可以理解为生产对象(OBJECT)的地方,在这里容器不只是帮我们创建了对象那么简单,它负责了对象的整个生命周期--创建、装配、销毁。

而这里对象的创建管理的控制权都交给了Spring容器,所以这是一种控制权的反转,称为IOC容器,而这里IOC容器不只是Spring才有,很多框架也都有该技术。

springmvc是spring的子框架,继承于spring框架 , 在ssm框架环境中,springmvc可以向上的扫描去用spring的东西,但是spring却不能扫描到springmvc里面去。

springmvc也是接收请求,返回响应 ,实际上也是一个servlet ,dispatchServlet。

springmvc和servlet的流程是差不多的,都是接受请求,返回响应,和 Sping 无缝结合

mybatis是目前非常流行的持久层框架,功能很强大,然而其实现却比较简单、优雅。mybatis是一个半自动的orm框架,也还是需要自己去写sql语句

mybatis是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情:

  • 封装JDBC操作
  • 利用反射打通Java类与SQL语句之间的相互转换

mybatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。

mybatis和大部分框架一样需要一个配置文件,如果是和spring整合的话则不怎么需要,当然如果要开启缓存的话还是需要

然后需要mapper映射文件和dao层的类和方法所对应 , 在mapper里面写sql语句

单独的mybatis使用需要解析配置文件,然后去调用mapper里的sql语句

二、Spring

2.1 Spring xml写法

原始类:

1public class Source {  
2    private String property01; 
3    private String property02; 
4    /* setter and getter */
5}

bean.xml 文件:

1<beans xmlns="http://www.springframework.org/schema/beans"
2       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
4    <bean name="source" class="pojo.Source">
5        <property name="property01" value="v01"/>
6        <property name="property02" value="v02"/>
7    </bean>
8</beans>    

测试类

 1public class TestSpring {
 2    @Test
 3    public void test(){
 4        ApplicationContext context = new ClassPathXmlApplicationContext(
 5                new String[]{"applicationContext.xml"}
 6        );
 7        Source source = (Source) context.getBean("source");
 8        System.out.println(source.property01());
 9        System.out.println(source.property02());
10    }
11}

ApplicationContext 是 BeanFactory 的子接口之一

换句话说:BeanFactory 是 Spring IoC 容器所定义的最底层接口,而 ApplicationContext 是其最高级接口之一,并对 BeanFactory 功能做了许多的扩展,所以在绝大部分的工作场景下,都会使用 ApplicationContext 作为 Spring IoC 容器。

如果说BeanFactory是Sping的心脏,那么ApplicationContext就是完整的身躯了

2.2 通过注解装配 Bean

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:

  • 如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低
  • 在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率

为了解决这两个问题,Spring引入了注解,通过 "@XXX" 的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。

 1@Component(value = "source1")
 2public class Source {
 3
 4    @Value("1")
 5    int id;
 6
 7    @Value("student_name_1")
 8    String name;
 9
10    // getter and setter
11}

下面是几个基础注解,更多注解及含义请参见: Spring 常用注解

@Component

把普通pojo实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>

@Component是一个元注解,意思是可以注解其他类注解,如@Controller @Service @Repository @Aspect。

官方的原话是:带此注解的类看为组件,当使用基于注解的配置和类路径扫描的时候,这些类就会被实例化

其他类级别的注解也可以被认定为是一种特殊类型的组件,比如@Repository @Aspect。所以,@Component可以注解其他类注解。

@Autowired

Autowired(自动装配)注释可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。

@Autowired 根据类型(type)进行自动注入,默认注入单例(SingleTon)的bean 。

如果发现找到有很多bean,则按照byName方式对比获取,若有名称一样的则可以加上@Qualifier("XXX")配置使用。若非必须装配则可以设置required=false。

 1@Component("studentService")
 2public class StudentServiceImp implements StudentService {
 3
 4    @Autowired
 5    private Student source = null;
 6
 7    public void printStudentInfo() {
 8        System.out.println(source.getName());
 9    }
10}

@Configuration @Bean 注解

@Bean 注解 可以标记在方法和注解上面,主要标记在方法上.被标记的方法的返回值会被加入到springIOC容器之中

使用 @Bean 注解的好处就是能够动态获取一个 Bean 对象,能够根据环境不同得到不同的 Bean 对象。或者说将 Spring 和其他组件分离(其他组件不依赖 Spring,但是又想 Spring 管理生成的 Bean)

1@Configuration
2public class AppConfig {
3
4    @Bean
5    public TransferService transferService() {
6        return new TransferServiceImpl();
7    }
8
9}

这个配置就等同于之前在xml里的配置

1<beans>
2    <bean id="transferService" class="com.acme.TransferServiceImpl"/>
3</beans>

2.3 AOP

AOP技术利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

第一步:选择连接点
Spring 是方法级别的 AOP 框架,我们主要也是以某个类额某个方法作为连接点,另一种说法就是:选择哪一个类的哪一方法用以增强功能。

1public void service() {
2    // 核心的业务功能
3    System.out.println("签合同");
4    System.out.println("收房租");
5}

第二步:创建切面

 1@Component
 2@Aspect
 3class Broker {
 4
 5    @Before("execution(* pojo.Landlord.service())")
 6    public void before(){
 7        System.out.println("带租客看房");
 8        System.out.println("谈价格");
 9    }
10
11    @After("execution(* pojo.Landlord.service())")
12    public void after(){
13        System.out.println("交钥匙");
14    }
15}

第三步:定义切点

 1@Component
 2@Aspect
 3class Broker {
 4
 5    @Pointcut("execution(* pojo.Landlord.service())")
 6    public void lService() {
 7    }
 8
 9    @Before("lService()")
10    public void before() {
11        System.out.println("带租客看房");
12        System.out.println("谈价格");
13    }
14
15    @After("lService()")
16    public void after() {
17        System.out.println("交钥匙");
18    }
19}

第四步:测试 AOP

三、SpringMVC

3.1 运行原理:

(1) Http请求:客户端请求提交到DispatcherServlet。
(2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。
(3) 调用处理器:DispatcherServlet将请求提交到Controller。
(4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。
(6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定视图
(8) Http响应:视图负责将结果显示到客户端。

接口:
(1)DispatcherServlet接口:
Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。

(2)HandlerMapping接口:
能够完成客户请求到Controller映射。

(3)Controller接口:
需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。
Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。
从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

(4)ViewResolver接口:
Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。

DispatcherServlet:
整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:

  • 截获符合特定格式的URL请求。
  • 初始化DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
  • 初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。

3.2 传统方式:

dispatcher-servlet.xml

 1<bean id="simpleUrlHandlerMapping"
 2          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 3        <property name="mappings">
 4            <props>
 5                <!-- /hello 路径的请求交给 id 为 helloController 的控制器处理-->
 6                <prop key="/hello">helloController</prop>
 7            </props>
 8        </property>
 9    </bean>
10    <bean id="helloController" class="controller.HelloController"></bean>
11</beans>   

Controller:

1public class HelloController implements Controller {
2    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
3        ModelAndView mav = new ModelAndView("index.jsp");
4        mav.addObject("message", "Hello Spring MVC");
5        return mav;
6    }
7}

View: index.jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
2<h1>${message}</h1>

3.3 使用注解配置 Spring MVC

Controller:

 1@Controller
 2public class HelloController{
 3
 4    @RequestMapping("/hello")
 5    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
 6        ModelAndView mav = new ModelAndView("index.jsp");
 7        mav.addObject("message", "Hello Spring MVC");
 8        return mav;
 9    }
10}

使用 @Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面
若返回json等内容到页面,则需要加**@ResponseBody注解**,@RestController注解相当于@ResponseBody + @Controller合在一起的作用

使用@RequestMapping 注解映射请求路径,@RequestMapping 既可以定义在类上,也可以定义方法上

dispatcher-servlet.xml :

 1<beans xmlns="http://www.springframework.org/schema/beans"
 2xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3xmlns:context="http://www.springframework.org/schema/context"
 4xsi: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">
 5
 6    <!-- 扫描controller下的组件 -->
 7    <context:component-scan base-package="controller"/>
 8</beans>
 9
10<!-- 配置视图解析器 -->
11<bean id="viewResolver"
12      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
13    <property name="prefix" value="/WEB-INF/page/" />
14    <property name="suffix" value=".jsp" />
15</bean>

数据显示

 1@RequestMapping("hello")
 2public String testVelocity(Model model,String name){
 3    model.addAttribute("name",name);
 4    return "hello";
 5}
 6
 7@RequestMapping("model")
 8public ModelAndView testModel(String name) {
 9    //构建ModelAndView实例,并设置跳转地址
10    ModelAndView view = new ModelAndView("test");
11    //将数据放置到ModelAndView对象view中,第二个参数可以是任何java类型
12    view.addObject("name",name);
13    //返回ModelAndView对象view
14    return view;
15}

跳转:

1@RequestMapping("/jump")
2public String jump() {
3    return "redirect: ./hello";
4}

四、MyBatis

4.1 基本配置

数据库配置文件:mybatis-config.xml

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 3<configuration>
 4    <!-- 别名 -->
 5    <typeAliases>
 6        <package name="pojo"/>
 7    </typeAliases>
 8    <!-- 数据库环境 -->
 9    <environments default="development">
10        <environment id="development">
11            <transactionManager type="JDBC"/>
12            <dataSource type="POOLED">
13                <property name="driver" value="com.mysql.jdbc.Driver"/>
14                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8"/>
15                <property name="username" value="root"/>
16                <property name="password" value="root"/>
17            </dataSource>
18        </environment>
19    </environments>
20    <!-- 映射文件 -->
21    <mappers>
22        <mapper resource="pojo/Student.xml"/>
23    </mappers>
24</configuration>

Mapper 文件:StudentMapper.xml

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE mapper
 3PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5<mapper namespace="pojo">
 6    <select id="listStudent" resultType="Student">
 7        select * from  student
 8    </select>
 9
10    <insert id="addStudent" parameterType="Student">
11        insert into student (id, studentID, name) values (#{id},#{studentID},#{name})
12    </insert>
13
14    <delete id="deleteStudent" parameterType="Student">
15        delete from student where id = #{id}
16    </delete>
17
18    <select id="getStudent" parameterType="_int" resultType="Student">
19        select * from student where id= #{id}
20    </select>
21
22    <update id="updateStudent" parameterType="Student">
23        update student set name=#{name} where id=#{id}
24    </update>
25</mapper>

测试类

 1public class TestMyBatis {
 2    public static void main(String[] args) throws IOException {
 3        // 根据 mybatis-config.xml 配置的信息得到 sqlSessionFactory
 4        String resource = "mybatis-config.xml";
 5        InputStream inputStream = Resources.getResourceAsStream(resource);
 6        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7
 8        // 然后根据 sqlSessionFactory 得到 session
 9        SqlSession session = sqlSessionFactory.openSession();
10
11        // 增加学生
12        Student student1 = new Student();
13        student1.setId(4);
14        student1.setStudentID(4);
15        student1.setName("新增加的学生");
16        session.insert("addStudent", student1);
17
18        // 删除学生
19        Student student2 = new Student();
20        student2.setId(1);
21        session.delete("deleteStudent", student2);
22
23        // 获取学生
24        Student student3 = session.selectOne("getStudent", 2);
25
26        // 修改学生
27        student3.setName("修改的学生");
28        session.update("updateStudent", student3);
29
30        // 最后通过 session 的 selectList() 方法调用 sql 语句 listStudent
31        List listStudent = session.selectList("listStudent");
32        for (Student student : listStudent) {
33            System.out.println("ID:" + student.getId() + ",NAME:" + student.getName());
34        }
35        // 提交修改
36        session.commit();
37        // 关闭 session
38        session.close();
39    }
40}

应用程序找 MyBatis 要数据 MyBatis 从数据库中找来数据

1.通过 mybatis-config.xml 定位哪个数据库
2.通过 Student.xml 执行对应的 sql 语句
3.基于 Student.xml 把返回的数据库封装在 Student 对象中
4.把多个 Student 对象装载一个 Student 集合中

4.2 使用注解开发 MyBatis

为 Mapper 增加注解:

 1public interface StudentMapper {
 2
 3	// 根据 id 查询学生信息
 4	@Select("SELECT * FROM student WHERE student_id = #{id}")
 5	public Student findStudentById(int id) throws Exception;
 6
 7	// 添加学生信息
 8	@Insert("INSERT INTO student(student_id, name) VALUES(#{id}, #{name})")
 9	public void insertStudent(Student student) throws Exception;
10
11	// 删除学生信息
12	@Delete("DELETE FROM student WHERE student_id = #{id}")
13	public void deleteStudent(int id) throws Exception;
14
15	// 修改学生信息
16	@Update("UPDATE student SET name = #{name} WHERE student_id = #{id}")
17	public void updateStudent(Student student) throws Exception;
18}

mybatis-config.xml:

1<mappers>
2    <!--<mapper resource="pojo/StudentMapper.xml"/>-->
3    <mapper class="mapper.StudentMapper"/>
4</mappers>

五、Spring+SpringMVC+MyBatis (Maven)

5.1 创建SqlMapperContext.xml全局配置文件

 1<?xml version="1.0" encoding="UTF-8" ?>
 2<!DOCTYPE configuration
 3PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4"http://www.mybatis.org/dtd/mybatis-3-config.dtd">
 5<configuration>
 6  <typeAliases>
 7       <package name="com.fjm.ssm.po"/>
 8   </typeAliases> 
 9
10</configuration>

5.2 Spring 和 Mybatis 配置:

spring-mybatis.xml

 1<?xml version="1.0" encoding="UTF-8"?>
 2<beans xmlns="http://www.springframework.org/schema/beans"
 3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
 5       xsi:schemaLocation="http://www.springframework.org/schema/beans
 6       http://www.springframework.org/schema/beans/spring-beans.xsd
 7       http://www.springframework.org/schema/context
 8       http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
 9
10    <!-- 配置数据库相关参数properties的属性:${url} -->
11    <context:property-placeholder location="classpath:jdbc.properties"/>
12
13    <!-- 数据库连接池 -->
14    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
15        <property name="driverClass" value="${jdbc.driver}"/>
16        <property name="jdbcUrl" value="${jdbc.url}"/>
17        <property name="user" value="${jdbc.username}"/>
18        <property name="password" value="${jdbc.password}"/>
19        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
20        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
21        <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
22        <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
23        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
24    </bean>
25
26    <!-- 配置SqlSessionFactory对象 -->
27    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
28        <!-- 注入数据库连接池 -->
29        <property name="dataSource" ref="dataSource"/>
30        <!-- 扫描entity包 使用别名 -->
31        <property name="typeAliasesPackage" value="cn.wmyskxz.entity"/>
32        <!-- 扫描sql配置文件:mapper需要的xml文件 -->
33        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
34    </bean>
35
36    <!-- 配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
37    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
38        <!-- 注入sqlSessionFactory -->
39        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
40        <!-- 给出需要扫描Dao接口包 -->
41        <property name="basePackage" value="cn.wmyskxz.dao"/>
42    </bean>
43</beans>

5.3 Spring Service 配置:

spring-service.xml

 1<?xml version="1.0" encoding="UTF-8"?>
 2<beans xmlns="http://www.springframework.org/schema/beans"
 3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4       xmlns:aop="http://www.springframework.org/schema/aop"
 5       xmlns:tx="http://www.springframework.org/schema/tx"
 6       xmlns:context="http://www.springframework.org/schema/context"
 7       xsi:schemaLocation="
 8       http://www.springframework.org/schema/beans 
 9       http://www.springframework.org/schema/beans/spring-beans.xsd
10       http://www.springframework.org/schema/tx 
11       http://www.springframework.org/schema/tx/spring-tx.xsd
12       http://www.springframework.org/schema/aop 
13       http://www.springframework.org/schema/aop/spring-aop.xsd
14       http://www.springframework.org/schema/context 
15       http://www.springframework.org/schema/context/spring-context.xsd
16       ">
17    <!-- 扫描service包下所有使用注解的类型 --> 
18    <context:component-scan base-package="cn.wmyskxz.service"/>
19   
20    <!--配置事务管理器  -->
21    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
22       <property name="dataSource" ref="dataSource"></property>
23    </bean>
24        
25    <!--配置通知  -->
26    <tx:advice id="txAdvice" transaction-manager="transactionManager">
27        <tx:attributes>
28            <!-- 传播特性 -->
29            <tx:method name="save*" propagation="REQUIRED" />
30            <tx:method name="add*" propagation="REQUIRED" />
31            <tx:method name="insert*" propagation="REQUIRED" />
32            <tx:method name="delete*" propagation="REQUIRED" />
33            <tx:method name="del*" propagation="REQUIRED" />
34            <tx:method name="remove*" propagation="REQUIRED" />
35            <tx:method name="update*" propagation="REQUIRED" />
36            <tx:method name="modify*" propagation="REQUIRED" />
37            <tx:method name="find*" read-only="true" />
38            <tx:method name="query*" read-only="true" />
39            <tx:method name="select*" read-only="true" />
40            <tx:method name="get*" read-only="true" />
41        </tx:attributes>
42    </tx:advice>
43    <!--配置切面  -->
44    <aop:config>
45        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.fjm.ssm.service.*.*(..))"/>
46    </aop:config>
47 </beans>

5.4 Spring MVC 的相关配置

spring-mvc.xml

 1<?xml version="1.0" encoding="UTF-8"?>
 2<beans xmlns="http://www.springframework.org/schema/beans"
 3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4       xmlns:context="http://www.springframework.org/schema/context"
 5       xmlns:mvc="http://www.springframework.org/schema/mvc"
 6       xsi:schemaLocation="http://www.springframework.org/schema/beans
 7       http://www.springframework.org/schema/beans/spring-beans.xsd
 8       http://www.springframework.org/schema/context
 9       http://www.springframework.org/schema/context/spring-context.xsd
10       http://www.springframework.org/schema/mvc
11       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
12
13    <!-- 扫描web相关的bean -->
14    <context:component-scan base-package="cn.wmyskxz.controller"/>
15
16    <!-- 开启SpringMVC注解模式 -->
17    <mvc:annotation-driven/>
18
19    <!-- 静态资源默认servlet配置 -->
20    <mvc:default-servlet-handler/>
21
22    <!-- 配置jsp 显示ViewResolver -->
23    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
24        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
25        <property name="prefix" value="/WEB-INF/views/"/>
26        <property name="suffix" value=".jsp"/>
27    </bean>
28
29</beans>

5.5 jdbc.properties 中配置数据库连接池

jdbc.driver=com.mysql.jdbc.Driver
#数据库地址
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8
#用户名
jdbc.username=root
#密码
jdbc.password=root
#最大连接数
c3p0.maxPoolSize=30
#最小连接数
c3p0.minPoolSize=10
#关闭连接后不自动commit
c3p0.autoCommitOnClose=false
#获取连接超时时间
c3p0.checkoutTimeout=10000
#当获取连接失败重试次数
c3p0.acquireRetryAttempts=2

5.6 创建接口和实现类,调用 mapper 接口实现数据调用

 1@Service
 2public class ItemsServiceImpl implements ItemsService {
 3    
 4    @Autowired
 5    private ItemsExtMapper mapper;
 6    @Override
 7    public List<Items> queryItemsByItemsQuery(ItemsQuery vo) {
 8        return mapper.ItemsQuery(vo);
 9    }
10}

参考:
https://www.cnblogs.com/wmyskxz/p/8916365.html
https://www.cnblogs.com/fengjunming/p/7583229.html**