Skip to content

15 SSM框架整合

  • 搭建Spring、Springmvc框架
  • 搭建mybatis的框架程序
  • 整合mybaits SQLSEssionFactory,Mapper 交给 IOC容器管理

15.1 创建Springmvc的程序

  • 创建web项目
  • 添加依赖
    • spring-webmvc
    • jstl
    • lombok
    • junit :test
    • servlet-api : provide
    • jsp-api :provide
    • jackson

15.1.1 POM文件如下:

xml
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
    
    
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.neuedu.ssm</groupId>
    <artifactId>p21-ssm</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <packaging>war</packaging>
		
    <name>p21-ssm Maven Webapp</name>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <spring.version>5.2.4.RELEASE</spring.version>
        <junit.version>4.13.2</junit.version>
        <jstl.version>1.2</jstl.version>
        <jackson.version>2.9.9.1</jackson.version>
        <lombok.version>1.18.16</lombok.version>
        <servlet.version>4.0.1</servlet.version>
        <jsp.version>2.2</jsp.version>
    </properties>

    <dependencies>

<!--        测试框架 start -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
        <!--        测试框架 end -->


        <!--      SpringMVC start -->

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--      SpringMVC start -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</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>${jackson.version}</version>
        </dependency>


<!--        不想写  setter  getter  to.....可以使用 lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>${jsp.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>




</project>

15.1.2 配置前端控制器

在web.xml中配置前端控制器DispatcherServlet

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>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/spring-mvc.xml</param-value>
    </init-param>
    <!-- load-on-startup 正数:启动容器(Tomcat)的时候加载Servlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>


</web-app>

15.1.3 配置SpringMVC文件

  • 在resources目录中创建ioc的配置文件, spring/spring-mvc.xml

    • 包扫描

    • mvc:annoation-driver :配置HandlerMapping 、HandlerAdapter、ViewResolver

    • ViewResolver :配置视图解析器 配置前缀、后缀。

      • 日期转换(全局)
    • 配置默认的静态资源处理器

      mvc:resouece-defult-serlver/

    • 全局的异常处理器

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:mvc="http://www.springframework.org/schema/mvc"
       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
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--包扫描的形式 注解驱动 -->
    <context:component-scan base-package="com.neuedu"/>

    <!--mvc的注解启动 -->
    <mvc:annotation-driven/>


    <!--默认的静态资源处理器 -->
    <mvc:default-servlet-handler/>

    <!--视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>


</beans>

15.3.4 创建Controller使用MVC

  • 创建Controller、service,并添加依赖
    • 响应视图的Controller
java
package com.neuedu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

@Controller
public class HelloController {

    /**
     * http://localhost:8080/ssm/index
     * http://127.0.0.1:8080/ssm/index
     * @return
     */
    @RequestMapping("index")
    String hello(){
        return "hello";
    }

}
  • 响应json的Controller

使用RestController注解注册Controller,所有Controller方法默认响应的是JSON格式数据

java
package com.neuedu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

//@Controller
@RestController
public class UserController {


    /**
     * http://localhost:8080/ssm/map
     * @return
     */
    @RequestMapping("map")
//    @ResponseBody
    Map map(){

        Map map = new HashMap();
        map.put("name","jshand");
        map.put("address","HLJ");
        return map;

    }
}

15.2 搭建Mybatis环境

  • 准备数据
  • 添加依赖
  • 创建SqlMapConfig.xml
  • 添加Mapper.xml、Mapper.java、实体类

15.2.1准备ssm数据库

脚本如下:

sql
/*
SQLyog Ultimate v12.08 (64 bit)
MySQL - 5.7.18 : Database - ssm-java1
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`ssm` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `ssm`;

/*Table structure for table `check_apply` */

DROP TABLE IF EXISTS `check_apply`;

CREATE TABLE `check_apply` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `register_id` INT(11) DEFAULT NULL COMMENT '病历号',
  `item_id` INT(11) DEFAULT NULL COMMENT '项目id',
  `item_name` VARCHAR(100) DEFAULT NULL COMMENT '项目名称',
  `fee` DECIMAL(8,2) DEFAULT NULL COMMENT '检查费用',
  `status` INT(11) DEFAULT NULL COMMENT '状态',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT='检查申请';

/*Data for the table `check_apply` */

INSERT  INTO `check_apply`(`id`,`register_id`,`item_id`,`item_name`,`fee`,`status`,`active`,`createtime`) VALUES (4,4,1,'甲状腺超声(小器官)','110.00',1,1,'2021-01-06 10:05:26'),(5,4,2,'腹部超声','140.00',1,1,'2021-01-06 10:05:26'),(6,7,1,'甲状腺超声(小器官)','110.00',1,1,'2021-01-06 10:09:47'),(7,7,2,'腹部超声','140.00',1,1,'2021-01-06 10:09:47'),(14,8,1,'甲状腺超声(小器官)','110.00',1,1,'2021-01-06 10:13:45'),(15,8,2,'腹部超声','140.00',1,1,'2021-01-06 10:13:45'),(16,8,3,'腋窝超声','50.00',1,1,'2021-01-06 10:20:50'),(17,2,1,'甲状腺超声(小器官)','110.00',4,1,'2021-01-06 11:01:06'),(18,2,2,'腹部超声','140.00',4,1,'2021-01-06 11:01:06'),(19,21,1,'甲状腺超声(小器官)','110.00',2,1,'2021-01-07 15:02:16'),(20,21,2,'腹部超声','140.00',4,1,'2021-01-07 15:02:16');

/*Table structure for table `check_item` */

DROP TABLE IF EXISTS `check_item`;

CREATE TABLE `check_item` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` VARCHAR(100) DEFAULT NULL COMMENT '检查名称',
  `fee` DECIMAL(8,2) DEFAULT NULL COMMENT '检查费用',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='检查项目';

/*Data for the table `check_item` */

INSERT  INTO `check_item`(`id`,`name`,`fee`,`active`,`createtime`) VALUES (1,'甲状腺超声(小器官)','110.00',1,'2021-01-05 11:04:44'),(2,'腹部超声','140.00',1,'2021-01-05 13:40:09'),(3,'腋窝超声','50.00',1,'2021-01-05 13:40:27'),(4,'测试待删除','120.00',0,'2021-01-05 13:41:07');

/*Table structure for table `constant_item` */

DROP TABLE IF EXISTS `constant_item`;

CREATE TABLE `constant_item` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `type_id` INT(11) DEFAULT NULL COMMENT '类别id',
  `code` VARCHAR(100) DEFAULT NULL COMMENT '常数项代码',
  `name` VARCHAR(100) DEFAULT NULL COMMENT '常数项名称',
  `sort` INT(11) DEFAULT NULL COMMENT '排序',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='常数项表';

/*Data for the table `constant_item` */

INSERT  INTO `constant_item`(`id`,`type_id`,`code`,`name`,`sort`,`active`,`createtime`) VALUES (1,1,'1','男',1,1,'2020-12-29 13:40:20'),(2,1,'2','女士',1,1,'2020-12-29 14:05:58'),(3,1,'3','33',333,0,'2020-12-29 14:07:05'),(4,5,'SHOW','展示菜单',0,1,'2021-01-04 11:28:02'),(5,5,'BTN','按钮',0,1,'2021-01-04 11:28:14'),(6,6,'1','是',0,1,'2021-01-04 14:02:59'),(7,6,'2','否',2,1,'2021-01-04 14:03:10'),(8,7,'1','已挂号',0,1,'2021-01-04 14:05:48'),(9,7,'2','已接诊',2,1,'2021-01-04 14:06:05'),(10,7,'3','已退号',3,1,'2021-01-04 14:06:16'),(11,8,'1','待缴费',1,1,'2021-01-06 14:03:27'),(12,8,'2','待检查',2,1,'2021-01-06 14:03:44'),(13,8,'3','已检查',3,1,'2021-01-06 14:03:55'),(14,8,'4','已退费',4,1,'2021-01-06 14:04:04');

/*Table structure for table `constant_type` */

DROP TABLE IF EXISTS `constant_type`;

CREATE TABLE `constant_type` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `code` VARCHAR(100) DEFAULT NULL COMMENT '代码',
  `name` VARCHAR(100) DEFAULT NULL COMMENT '名称',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='常数类别';

/*Data for the table `constant_type` */

INSERT  INTO `constant_type`(`id`,`code`,`name`,`active`,`createtime`) VALUES (1,'XB','性别',1,'2020-12-29 11:32:19'),(2,'GHZT','挂号状态',1,'2020-12-29 11:51:25'),(3,'JCZT','检查状态',1,'2020-12-29 11:52:26'),(4,'JYZT','检验状态',1,'2020-12-29 14:04:48'),(5,'MENU_TYPE','菜单类型',1,'2021-01-04 11:27:35'),(6,'IS_BOOK','是否需要病历本',1,'2021-01-04 14:02:38'),(7,'REGISTER_STATUS','挂号状态',1,'2021-01-04 14:05:36'),(8,'APPLY_STATUS','申请状态(检查、检验)',1,'2021-01-06 14:02:19');

/*Table structure for table `department` */

DROP TABLE IF EXISTS `department`;

CREATE TABLE `department` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` VARCHAR(100) DEFAULT NULL COMMENT '名称',
  `address` VARCHAR(200) DEFAULT NULL COMMENT '办公地址',
  `leader` VARCHAR(100) DEFAULT NULL COMMENT '负责人',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='科室';

/*Data for the table `department` */

INSERT  INTO `department`(`id`,`name`,`address`,`leader`,`active`,`createtime`) VALUES (1,'神经内科','1111','1',1,'2020-12-23 09:06:58'),(2,'消化科','内科楼101','扁鹊主任',1,'2021-01-04 15:24:31'),(3,'普外科','外科大楼2层','孙医生',1,'2021-01-04 15:41:49');

/*Table structure for table `inspect_apply` */

DROP TABLE IF EXISTS `inspect_apply`;

CREATE TABLE `inspect_apply` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `item_id` INT(11) DEFAULT NULL COMMENT '项目id',
  `item_name` VARCHAR(100) DEFAULT NULL COMMENT '项目名称',
  `fee` DECIMAL(8,2) DEFAULT NULL COMMENT '检查费用',
  `status` INT(11) DEFAULT NULL COMMENT '状态',
  `register_id` INT(11) DEFAULT NULL COMMENT '病历号',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='检验申请';

/*Data for the table `inspect_apply` */

INSERT  INTO `inspect_apply`(`id`,`item_id`,`item_name`,`fee`,`status`,`register_id`,`active`,`createtime`) VALUES (1,1,'乙肝抗原','200.00',4,2,1,'2021-01-06 11:12:06'),(2,2,'血常规','40.00',4,2,1,'2021-01-06 11:12:06'),(3,1,'乙肝抗原','200.00',2,21,1,'2021-01-07 15:02:25'),(4,2,'血常规','40.00',2,21,1,'2021-01-07 15:02:26');

/*Table structure for table `inspect_item` */

DROP TABLE IF EXISTS `inspect_item`;

CREATE TABLE `inspect_item` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` VARCHAR(100) DEFAULT NULL COMMENT '检查名称',
  `fee` DECIMAL(8,2) DEFAULT NULL COMMENT '检查费用',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='检验项目';

/*Data for the table `inspect_item` */

INSERT  INTO `inspect_item`(`id`,`name`,`fee`,`active`,`createtime`) VALUES (1,'乙肝抗原','200.00',1,'2021-01-05 10:57:47'),(2,'血常规','40.00',1,'2021-01-05 11:09:10'),(3,'肝功5项','60.00',1,'2021-01-05 11:10:12'),(4,'尿常规','60.00',1,'2021-01-05 13:51:19'),(5,'测试删除项目','10.00',0,'2021-01-05 13:51:46');

/*Table structure for table `menu` */

DROP TABLE IF EXISTS `menu`;

CREATE TABLE `menu` (
  `menu_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '菜单id',
  `menu_name` VARCHAR(100) DEFAULT NULL COMMENT '菜单名称',
  `url` VARCHAR(100) DEFAULT NULL COMMENT '菜单url',
  `parent_id` INT(11) DEFAULT NULL COMMENT '上级菜单id',
  `menu_type` INT(10) DEFAULT NULL COMMENT '菜单类型1 展示、2按钮',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`menu_id`)
) ENGINE=INNODB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT='菜单';

/*Data for the table `menu` */

INSERT  INTO `menu`(`menu_id`,`menu_name`,`url`,`parent_id`,`menu_type`,`active`,`createtime`) VALUES (1,'系统管理',NULL,NULL,1,1,'2020-12-28 14:13:19'),(2,'用户管理','/user',1,1,1,'2020-12-28 14:54:43'),(4,'角色管理','/role',1,1,1,'2020-12-28 14:55:59'),(5,'挂号收费',NULL,NULL,1,1,'2020-12-28 15:51:32'),(6,'挂号','/regist',5,1,1,'2020-12-28 15:51:47'),(7,'收费','/fee',5,1,1,'2020-12-28 15:52:06'),(8,'退号','unregist',5,1,1,'2020-12-28 15:52:16'),(9,'退费','refund',5,1,1,'2020-12-28 15:52:24'),(10,'用户查询','/user?type=query',2,2,1,'2021-01-04 11:21:55'),(11,'用户添加','/user?type=add',2,2,1,'2021-01-04 11:24:46'),(12,'用户所有操作','/user',2,2,1,'2021-01-04 11:25:14'),(13,'菜单管理','/menu',1,1,1,'2021-01-07 11:38:49'),(14,'门诊医生',NULL,NULL,1,1,'2021-01-07 11:39:57'),(15,'门诊病历','doctor',14,1,1,'2021-01-07 11:41:40'),(16,'基础数据管理',NULL,NULL,1,1,'2021-01-07 11:41:53'),(17,'部门管理','dept',16,1,1,'2021-01-07 11:42:01'),(18,'挂号级别管理','regist_level',16,1,1,'2021-01-07 11:42:11'),(19,'检查项目维护','check_item',16,1,1,'2021-01-07 11:42:15'),(20,'检验项目维护','inspect_item',16,1,1,'2021-01-07 11:42:23'),(21,'常数类别','constant_type',16,1,1,'2021-01-07 11:42:31'),(22,'常数项目管理','constant_item',16,1,1,'2021-01-07 11:42:40'),(23,'角色的处理','/role',4,2,1,'2021-01-07 14:16:38'),(24,'患者的信息','/register',15,2,1,'2021-01-07 14:18:21'),(25,'医生相关的操作','/doctor',24,2,1,'2021-01-07 14:19:24'),(26,'部门的操作','/dept',2,2,1,'2021-01-07 14:51:05'),(27,'挂号级别查询','/regist_level',2,2,1,'2021-01-07 14:51:25');

/*Table structure for table `regist_level` */

DROP TABLE IF EXISTS `regist_level`;

CREATE TABLE `regist_level` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` VARCHAR(100) DEFAULT NULL COMMENT '名称',
  `fee` DECIMAL(8,2) DEFAULT NULL COMMENT '费用',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='挂号级别';

/*Data for the table `regist_level` */

INSERT  INTO `regist_level`(`id`,`name`,`fee`,`active`,`createtime`) VALUES (1,'专家','500.00',1,'2021-01-04 13:58:22'),(2,'教授','400.00',1,'2021-01-04 13:58:40'),(3,'主治','30.00',1,'2021-01-04 13:58:44'),(4,'住院医师','10.00',1,'2021-01-04 13:59:09'),(5,'测试级别','30.50',1,'2021-01-04 14:24:36'),(6,'实习大夫','2.00',1,'2021-01-04 14:55:20');

/*Table structure for table `register` */

DROP TABLE IF EXISTS `register`;

CREATE TABLE `register` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id病历号',
  `name` VARCHAR(100) DEFAULT NULL COMMENT '姓名',
  `gender` INT(11) DEFAULT NULL COMMENT '性别',
  `idno` VARCHAR(100) DEFAULT NULL COMMENT '身份证号',
  `birthday` DATE DEFAULT NULL COMMENT '出生日期',
  `age` INT(11) DEFAULT NULL COMMENT '年龄',
  `address` VARCHAR(200) DEFAULT NULL COMMENT '家庭住址',
  `regsit_level_id` INT(11) DEFAULT NULL COMMENT '挂号级别',
  `dept_id` INT(11) DEFAULT NULL COMMENT '挂号科室',
  `doctor_id` INT(11) DEFAULT NULL COMMENT '看诊医生',
  `book` INT(11) DEFAULT NULL COMMENT '是否要病历本',
  `visittime` DATE DEFAULT NULL COMMENT '看诊时间',
  `fee` DECIMAL(8,2) DEFAULT NULL COMMENT '挂号费用',
  `readme` VARCHAR(500) DEFAULT NULL COMMENT '主诉',
  `present` VARCHAR(500) DEFAULT NULL COMMENT '现病史',
  `present_treat` VARCHAR(500) DEFAULT NULL COMMENT '现病史治疗情况',
  `history` VARCHAR(500) DEFAULT NULL COMMENT '既往史',
  `allergy` VARCHAR(500) DEFAULT NULL COMMENT '过敏史',
  `disease` VARCHAR(500) DEFAULT NULL COMMENT '确诊疾病',
  `suit` VARCHAR(500) DEFAULT NULL COMMENT '处置方案',
  `drug` VARCHAR(500) DEFAULT NULL COMMENT '药品清单',
  `status` INT(11) DEFAULT NULL COMMENT '状态',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 COMMENT='诊疗信息';

/*Data for the table `register` */

INSERT  INTO `register`(`id`,`name`,`gender`,`idno`,`birthday`,`age`,`address`,`regsit_level_id`,`dept_id`,`doctor_id`,`book`,`visittime`,`fee`,`readme`,`present`,`present_treat`,`history`,`allergy`,`disease`,`suit`,`drug`,`status`,`active`,`createtime`) VALUES (1,'张飞',1,'232323232136546456',NULL,40,NULL,1,25,NULL,1,'2021-01-04','501.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,'2021-01-04 14:07:05'),(2,'张三',1,'1212121212',NULL,1212,'12121212112',1,1,NULL,1,NULL,'500.00','主诉1','现病史2','现病史治疗情况2','既往史2','过敏史2',NULL,NULL,NULL,2,1,'2021-01-05 09:22:56'),(3,'关羽',1,'1212121221121211','2010-01-04',50,'黑龙江齐齐哈尔',1,1,27,1,NULL,'500.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,0,'2021-01-05 09:26:50'),(4,'刘备',1,'1212121221121211',NULL,50,'黑龙江齐齐哈尔',2,1,27,1,NULL,'500.00','主诉12111','现病1211','现病史治疗情221','既往史321','过敏史421',NULL,NULL,NULL,2,1,'2021-01-05 09:27:19'),(5,'孙悟空',1,'1212121221121211','2010-01-04',50,'黑龙江齐齐哈尔',1,1,27,1,NULL,'500.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,0,'2021-01-05 09:28:56'),(6,'刘备',1,'1212121221121211','2010-01-04',50,'黑龙江齐齐哈尔',2,1,27,1,'2021-01-07','500.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,0,'2021-01-05 09:30:34'),(7,'李逵',1,'1212121221121211',NULL,50,'黑龙江齐齐哈尔',1,1,27,1,'2021-01-07','500.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,1,'2021-01-05 09:36:54'),(8,'诸葛亮',1,'1212121221121211',NULL,50,'黑龙江齐齐哈尔',2,1,27,1,'2021-01-07','501.00','122','112','12','12','121212',NULL,NULL,NULL,1,1,'2021-01-05 09:41:52'),(9,'关羽',1,'54654654165464564','2021-01-12',50,'12121212121212',1,1,27,1,'2021-01-06','501.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,0,'2021-01-05 09:46:40'),(12,'诸葛亮',1,'1212121','2010-01-04',80,'东吴',2,2,25,1,'2021-01-06','401.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,0,'2021-01-05 10:53:19'),(13,'孙尚香',2,'5464854654654','2017-01-03',18,'东吴',2,2,25,1,'2021-01-08','401.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,0,'2021-01-05 10:54:23'),(15,'邹兆龙',1,'45651654684651651','2011-01-03',48,'32132132',1,1,27,1,'2021-01-07','501.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,'2021-01-06 10:29:41'),(16,'邹毅',1,'121212112212','2015-12-28',55,'1212121212',1,2,23,0,'2021-01-07','500.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,'2021-01-06 10:32:38'),(17,'徐玮辰',1,'12121212121212',NULL,50,'大撒旦法师法',2,1,28,0,'2021-01-13','400.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,1,'2021-01-06 10:35:53'),(18,'徐罗成',1,'12121212',NULL,12,'是大是大非',1,1,27,0,'2021-01-06','500.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,1,'2021-01-06 10:44:08'),(19,'杨旭',1,'231321321',NULL,50,'1212121212',1,2,23,0,'2021-01-08','500.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,1,'2021-01-07 14:55:43'),(20,'露露',2,'121212121','2016-01-04',50,'1211212',1,2,29,1,'2021-01-08','501.00',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,'2021-01-07 14:56:42'),(21,'韦吉亮',1,'121212',NULL,50,'121212',1,2,23,1,'2021-01-07','501.00','主诉','现病史','现病史治疗情况','既往史','过敏史\n',NULL,'尊医嘱,多喝水,多喝热水',NULL,2,1,'2021-01-07 15:01:45');

/*Table structure for table `role` */

DROP TABLE IF EXISTS `role`;

CREATE TABLE `role` (
  `role_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '角色id',
  `role_name` VARCHAR(100) DEFAULT NULL COMMENT '角色名称',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`role_id`)
) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='角色';

/*Data for the table `role` */

INSERT  INTO `role`(`role_id`,`role_name`,`active`,`createtime`) VALUES (1,'门诊医生',1,'2020-12-28 13:38:52'),(2,'挂号收费员',1,'2020-12-28 13:39:21'),(3,'系统管理员',1,'2020-12-28 13:39:41'),(4,'测试角色',0,'2020-12-28 13:59:02'),(5,'测试校验',1,'2021-01-07 10:49:23');

/*Table structure for table `role_menu` */

DROP TABLE IF EXISTS `role_menu`;

CREATE TABLE `role_menu` (
  `menu_id` INT(11) NOT NULL COMMENT '菜单id',
  `role_id` INT(11) NOT NULL COMMENT '角色id',
  PRIMARY KEY (`menu_id`,`role_id`),
  KEY `FK_Reference_2` (`role_id`),
  CONSTRAINT `FK_Reference_1` FOREIGN KEY (`menu_id`) REFERENCES `menu` (`menu_id`),
  CONSTRAINT `FK_Reference_2` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='角色菜单信息';

/*Data for the table `role_menu` */

INSERT  INTO `role_menu`(`menu_id`,`role_id`) VALUES (5,2),(6,2),(7,2),(8,2),(9,2),(1,3),(2,3),(4,3),(5,3),(6,3),(7,3),(8,3),(9,3),(10,3),(11,3),(12,3),(13,3),(14,3),(15,3),(16,3),(17,3),(18,3),(19,3),(20,3),(21,3),(22,3),(23,3),(24,3),(25,3),(26,3),(27,3);

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `user_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '医生id',
  `username` VARCHAR(100) DEFAULT NULL COMMENT '用户名',
  `password` VARCHAR(100) DEFAULT NULL COMMENT '密码',
  `realname` VARCHAR(100) DEFAULT NULL COMMENT '真实姓名',
  `telephone` VARCHAR(20) DEFAULT NULL COMMENT '电话号码',
  `dept_id` INT(11) DEFAULT NULL COMMENT 'id',
  `user_type` INT(11) DEFAULT NULL COMMENT '医生类型',
  `regist_level` INT(10) DEFAULT NULL COMMENT '医生级别',
  `lastlogin` DATETIME DEFAULT NULL COMMENT '最后登录时间',
  `active` INT(11) DEFAULT '1' COMMENT '是否有效,1 有效,0 失效',
  `createtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`user_id`),
  KEY `FK_Reference_5` (`dept_id`),
  CONSTRAINT `FK_Reference_5` FOREIGN KEY (`dept_id`) REFERENCES `department` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8 COMMENT='医生-用户信息';

/*Data for the table `user` */

INSERT  INTO `user`(`user_id`,`username`,`password`,`realname`,`telephone`,`dept_id`,`user_type`,`regist_level`,`lastlogin`,`active`,`createtime`) VALUES (21,'admin','123456','管理员','13888888880',1,1,1,NULL,0,'2020-12-23 09:07:06'),(22,'jshand','123456','姓名1','13888888881',1,1,1,NULL,0,'2020-12-23 09:07:06'),(23,'huatuo','123456','华佗','13888888882',2,1,1,NULL,1,'2020-12-23 09:07:06'),(24,'admin3','1234563','姓名3','13888888883',2,1,2,NULL,1,'2020-12-23 09:07:06'),(25,'bianque','1234564','扁鹊','13888888884',2,1,2,NULL,1,'2020-12-23 09:07:06'),(26,'admin5','1234565','姓名5','13888888885',2,1,2,NULL,1,'2020-12-23 09:07:06'),(27,'admin6','1234566','姓名6','13888888886',1,1,1,NULL,1,'2020-12-23 09:07:06'),(28,'admin7','1234567','姓名7','13888888887',1,1,2,NULL,1,'2020-12-23 09:07:06'),(29,'admin8','1234568','姓名8','13888888888',2,1,1,NULL,1,'2020-12-23 09:07:06'),(30,'admin9','1234569','姓名dddddd','13888888889',2,1,2,NULL,1,'2020-12-23 09:07:06'),(31,'admin10','12345610','姓名10','138888888810',1,1,1,NULL,1,'2020-12-23 09:07:06'),(32,'admin11','12345611','姓名11','138888888811',2,1,2,NULL,1,'2020-12-23 09:07:06'),(33,'admin12','12345612','姓名12','138888888812',1,1,1,NULL,1,'2020-12-23 09:07:06'),(34,'admin13','12345613','姓名13','138888888813',1,1,2,NULL,1,'2020-12-23 09:07:06'),(35,'admin14','12345614','姓名14','138888888814',1,1,1,NULL,1,'2020-12-23 09:07:06'),(36,'admin15','12345615','姓名15','138888888815',1,1,2,NULL,1,'2020-12-23 09:07:06'),(37,'admin16','12345616','姓名16','138888888816',1,1,NULL,NULL,1,'2020-12-23 09:07:06'),(38,'admin17','12345617','姓名17','138888888817',1,1,NULL,NULL,1,'2020-12-23 09:07:06'),(39,'admin18','12345618','姓名18','138888888818',1,1,NULL,NULL,1,'2020-12-23 09:07:06'),(40,'admin19','12345619','姓名19','138888888819',1,1,NULL,NULL,1,'2020-12-23 09:07:06'),(51,'vuejs','123456','张医生','17745125669',2,1,NULL,NULL,1,'2020-12-25 09:19:19'),(52,'aaa','123456','135341','32131321',2,1,NULL,NULL,1,'2020-12-25 09:21:19'),(53,'abcbdb','123456','45646','121212',NULL,1,NULL,NULL,1,'2020-12-25 09:22:19'),(54,'aaaa','11212','121212','1212',2,1,NULL,NULL,1,'2020-12-25 09:23:31'),(55,'abcdef','123456','4564864','321321321',NULL,1,NULL,NULL,1,'2020-12-25 09:24:51'),(56,'lastuser','123456','789789','6541651',NULL,1,NULL,NULL,1,'2020-12-25 09:27:06'),(57,'l22222','12345864646','3213','21321',NULL,1,NULL,NULL,1,'2020-12-25 09:27:50'),(58,'qqq','qqq','qqq','18404075932',NULL,1,NULL,NULL,1,'2020-12-28 08:59:02'),(59,NULL,NULL,NULL,NULL,NULL,1,NULL,NULL,1,'2021-01-04 16:43:10');

/*Table structure for table `user_role` */

DROP TABLE IF EXISTS `user_role`;

CREATE TABLE `user_role` (
  `user_id` INT(11) NOT NULL COMMENT '医生id',
  `role_id` INT(11) NOT NULL COMMENT '角色id',
  PRIMARY KEY (`user_id`,`role_id`),
  KEY `FK_Reference_4` (`role_id`),
  CONSTRAINT `FK_Reference_3` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`),
  CONSTRAINT `FK_Reference_4` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='用户角色';

/*Data for the table `user_role` */

INSERT  INTO `user_role`(`user_id`,`role_id`) VALUES (23,1),(25,1),(23,2),(21,3),(23,3),(25,3);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

15.2.2 添加依赖

  • mybaits
  • mysql-connector-java
xml
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-framework</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.neuedu.ssm</groupId>
    <artifactId>p21-ssm</artifactId>
    <packaging>war</packaging>

    <name>p21-ssm Maven Webapp</name>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <spring.version>5.2.4.RELEASE</spring.version>
        <junit.version>4.13.2</junit.version>
        <jstl.version>1.2</jstl.version>
        <jackson.version>2.9.9.1</jackson.version>
        <lombok.version>1.18.16</lombok.version>
        <servlet.version>4.0.1</servlet.version>
        <jsp.version>2.2</jsp.version>
        <mybatis.version>3.5.5</mybatis.version>
        <mysql.version>8.0.28</mysql.version>
    </properties>

    <dependencies>

<!--        测试框架 start -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
        <!--        测试框架 end -->


        <!--      SpringMVC start -->

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--      SpringMVC start -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</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>${jackson.version}</version>
        </dependency>


<!--        不想写  setter  getter  to.....-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>${jsp.version}</version>
            <scope>provided</scope>
        </dependency>


<!--        使用  mybatis start -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!--        使用  mybatis start -->



    </dependencies>




</project>

15.2.3 创建核心配置文件

创建核心配置文件SqlMapConfig.xml和jdbc.properties

  • jdbc.properties
properties
jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm
jdbc.driver=com.mysql.cj.jdbc.Driver
  • SqlMapConfig.xml
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>



    <properties resource="mybatis/jdbc.properties"/>

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>

        <setting name="cacheEnabled" value="true"/>

    </settings>


    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="UNPOOLED">
                <property name="username"   value="${jdbc.username}"/>
                <property name="password"   value="${jdbc.password}"/>
                <property name="url"        value="${jdbc.url}"/>
                <property name="driver"     value="${jdbc.driver}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <package name="com.neuedu.ssm.mapper"/>
    </mappers>

</configuration>

15.2.4 逆向工程

逆向生成Mapper.xml、Mapper.java、实体(Example)

15.2.5 单元测试

java
package com.neuedu.ssm.mapper;

import com.neuedu.ssm.entity.Menu;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import static org.junit.Assert.*;

/**
 * 项目:      spring-framework
 * 类名:       MenuMapperTest
 * 创建时间:  2024/3/22 12:06
 * 描述 :
 * 作者 :     张金山
 * QQ :     314649444
 * Site:      https://jshand.gitee.io
 */
public class MenuMapperTest {

    @Test
    public void selectByExample() throws IOException {

        InputStream is = Resources.getResourceAsStream("mybatis/SqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = factory.openSession();
        MenuMapper mapper = session.getMapper(MenuMapper.class);


        List<Menu> menus = mapper.selectByExample(null);
        for (Menu menu : menus) {
            System.out.println(menu);
        }

        session.close();

    }
}

15.3 将Mybaits整合到 IOC容器

将Mapper 创建的 过程 交给ioc, 在Ioc 中定义Mapper(Bean),Mapper类本身是抽象,在ioc中声明的是 代理对象。使用Factory模式创建Mapper

SqlSession.getMapper(MenuMapper.class)

使用Mybaits-spring提供的 工厂类用于创建 Mapper

使用Mybatis-spring

  1. 添加依赖
  2. 在IOC容器中定义SqlSessionFactoryBean
  3. 定义Mapper
  4. 在Service中注入Mapper(Dao)

15.3.1添加依赖

添加由mybatis提供的类库,用于整合Spring

  • mybaits-spring
  • 数据源:druid
  • 事务
  • aop
xml
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-framework</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.neuedu.ssm</groupId>
    <artifactId>p21-ssm</artifactId>
    <packaging>war</packaging>

    <name>p21-ssm Maven Webapp</name>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <spring.version>5.2.4.RELEASE</spring.version>
        <junit.version>4.13.2</junit.version>
        <jstl.version>1.2</jstl.version>
        <jackson.version>2.9.9.1</jackson.version>
        <lombok.version>1.18.16</lombok.version>
        <servlet.version>4.0.1</servlet.version>
        <jsp.version>2.2</jsp.version>
        <mybatis.version>3.5.5</mybatis.version>
        <mysql.version>8.0.28</mysql.version>

        <mybatis-spring.version>2.0.6</mybatis-spring.version>
        <druid.version>1.2.21</druid.version>

    </properties>

    <dependencies>

<!--        测试框架 start -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
        <!--        测试框架 end -->


        <!--      SpringMVC start -->

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--      SpringMVC start -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</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>${jackson.version}</version>
        </dependency>


<!--        不想写  setter  getter  to.....-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>${jsp.version}</version>
            <scope>provided</scope>
        </dependency>


<!--        使用  mybatis start -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!--        使用  mybatis start -->


        <!-- 在Springmvc容器中声明  SqlSessionFactory   Mapper  mybatis-spring  https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis-spring.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>




    </dependencies>




</project>

15.3.2 定义SqlSessionFactoryBean

在Spring的IOC容器中SqlSessionFactoryBean,主要在IOC容器中管理 DataSource,在SqlMapConfig.xml中去掉了环境的配置(environments)和Mapper的扫描 mappers

xml
<!-- 声明数据源-->
    <context:property-placeholder location="classpath:mybatis/jdbc.properties"></context:property-placeholder>
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
    </bean>
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
        <property name="dataSource" ref="dataSource"/>
    </bean>

15.3.3 在IOC容器创建Mapper代理对象

xml
<!--    声明单个Mapper xxx -->
<!--    <bean id="menuMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">-->
<!--        <property name="mapperInterface" value="com.neuedu.ssm.mapper.MenuMapper"/>-->
<!--        <property name="sqlSessionFactory" ref="sqlSessionFactoryBean"></property>-->
<!--    </bean>-->


    <!--    使用包扫描的方式批量注册Mapper   basePackage: 扫描那些包的Mapper接口在IOC容器中管理-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property>
        <property name="basePackage" value="com.neuedu.ssm.mapper"></property>
    </bean>

15.3.4 单元测试

java
package com.neuedu.ssm.mapper;

import com.neuedu.ssm.entity.Department;
import com.neuedu.ssm.entity.Menu;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * 项目:      spring-framework
 * 类名:       MenuMapperTest
 * 创建时间:  2024/3/22 12:06
 * 描述 :
 * 作者 :     张金山
 * QQ :     314649444
 * Site:      https://jshand.gitee.io
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/spring-mvc.xml")
public class MenuMapperSpringTest {

    @Autowired
    MenuMapper menuDao;

    @Autowired
    DepartmentMapper departmentDao;


    @Test
    public void selectByExample() throws IOException {


        List<Menu> menus = menuDao.selectByExample(null);
        List<Department> depts = departmentDao.selectByExample(null);
        for (Menu menu : menus) {
            System.out.println(menu);
        }
        for (Department department : depts) {
            System.out.println(department);
        }


    }
}

15.4 添加事务管理器

添加 aspectjweaver

xml
    <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>

15.4.1 xml形式声明事务

xml

<!--    注解驱动,让Service可以直接使用@ @Transactional()注解-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="select*" propagation="SUPPORTS"/>
            <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>


    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.neuedu.ssm..*.*(..))"></aop:advisor>
    </aop:config>

15.4.2 注解驱动声明式事务

在需要加事务的方法上或类上添加 @Transactional注解

java
package com.neuedu.service.impl;

import com.neuedu.mapper.MenuMapper;
import com.neuedu.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class MenuServiceImple implements MenuService {

    @Autowired
    MenuMapper mapper;



    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class )
    @Override
    public List selectAll() {
        return mapper.selectByExample(null);
    }
}

Released under the MIT License.