当前真实的企业开发中,SpringBoot已经统一Java企业应用开发,很少有在使用SSM项目来进行项目开发的。

可是在教学阶段,还是很有必要给学生讲解Java开发中一套很经典的框架,SSM框架。作为一个过渡阶段讲解的

项目比较合适,之后在讲解SpringBoot项目,相对来说要好理解一些。如果以开始就直接讲解SpringBoot框架,

那新的学生不一定能够理解底层的一些东西,例如SpringBoot是如何封装所需要的项目依赖。

接下来就简单讲解一下整合的思路,步骤,最后使用一个简单的新增方法来测试整合是否正确实现。

开发环境:Mysql-5.7 + JDK-1.8 + Maven-3.6 + Tomcat-8.5.5

如果有不具备这些环境,则使用工具的版本微调即可。

第一步,需要依赖的maven 坐标

<dependencies>

<!--spring核心包-context-SSM三大框架之一-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>5.3.27</version>

</dependency>

<!--spring核心包-连接数据库使用-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jdbc</artifactId>

<version>5.3.27</version>

</dependency>

<!--druid-数据库连接池-->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>1.2.18</version>

</dependency>

<!--mybatis-操作数据库-SSM三大框架之一-->

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>3.5.6</version>

</dependency>

<!--spring整合mybatis的依赖包-->

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis-spring</artifactId>

<version>1.3.3</version>

</dependency>

<!--spring核心包web开发会使用到-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>5.3.27</version>

</dependency>

<!--springMVC-SSM三大框架之一-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>5.3.27</version>

</dependency>

<!--连接mysql数据库会使用到的包-->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>8.0.33</version>

</dependency>

</dependencies>

总结: 需要引入的包,Spring框架的核心包,SpringMvc框架的包,还有Mybatis相关的包,Spring整合mybatis的包。

第一步就是配置文件.

SpringMvc的配置文件

application-mvc.xml 需要保留,配置信息如下

<!-- 注解驱动-->

<mvc:annotation-driven/>

<!--开起扫描包-->

<context:component-scan base-package="com.ssm.controller"/>

<!--配置 页面前缀和后缀-->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/page/"/>

<property name="suffix" value=".jsp"/>

</bean>

Spring的配置文件

applicationContext.xml 需要保留,配置信息如下

<!--开起事务注解-->

<tx:annotation-driven/>

<!--开起扫描包-->

<context:component-scan base-package="com.ssm"/>

<!--导入资源文件-->

<context:property-placeholder location="classpath*:jdbc.properties"/>

<!--数据源-->

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">

<property name="driverClassName" value="${jdbc.driver}"/>

<property name="url" value="${jdbc.url}"/>

<property name="username" value="${jdbc.username}"/>

<property name="password" value="${jdbc.password}"/>

</bean>

<!--创建 sqlSessionFactoryBean-->

<bean class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"/>

<property name="typeAliasesPackage" value="com.ssm.pojo"/>

</bean>

<!--创建映射 mapper-->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="basePackage" value="com.ssm.dao"/>

</bean>

数据库配置信息

jdbc.properties 文件,配置信息如下

jdbc.driver=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://127.0.0.1:3306/test

jdbc.username=root

jdbc.password=root

创建的表语句如下

CREATE TABLE `user_info` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`user_name` varchar(20) DEFAULT NULL COMMENT '用户名字',

`user_age` int(11)  COMMENT '用户名字',

`is_delete` int(11) DEFAULT '0' COMMENT '是否删除',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

如果搭建项目这些步骤就直接省略。自己测试时使用的是IDEA,整个项目的结构如下

页面跳转Controller里面的代码如下

/**

* @Author 一只爱阅读的程序员

* @Description 首页跳转 控制器

* @Date 2023/7/2 16:04

* @Version 1.0

*/

@Controller

public class HtmlController {

@RequestMapping("/")

public String getIndex(){

System.out.println("首页页面跳转控制");

return "index";

}

}

新增用户Controller里面的代码如下

/**

* @Author 一只爱阅读的程序员

* @Description 用户信息 控制器

* @Date 2023/7/2 16:05

* @Version 1.0

*/

@RestController

@RequestMapping("/user_info")

public class UserInfoController {

@Resource

UserInfoService userInfoService;

/* @Description: 添加用户信息

* @author: yilang

* @date: 2023/7/2 16:43

* @param: userinfo

* @return: String

*/

@RequestMapping(value = "/add", method = RequestMethod.POST)

public String addUserInfo(UserInfo userinfo){

boolean result = this.userInfoService.addUserInfo(userinfo);

if(result){

System.out.println("新增用户信息成功!");

}

return "success";

}

}

Service实现类里面的代码如下

@Service

public class UserInfoServiceImpl implements UserInfoService {

@Resource

UserInfoDao userInfoDao;

/* @Description: 新增用户信息

* @author: yilang

* @date: 2023/7/2 16:14

* @param: userInfo

* @return: int

*/

public boolean addUserInfo(UserInfo userInfo) {

int result = userInfoDao.addUserInfo(userInfo);

return result == 1;

}

}

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.ssm.dao.UserInfoDao">

<insert id="addUserInfo" parameterType="com.ssm.pojo.UserInfo">

insert into user_info(user_name, user_age)

values

(#{userName, jdbcType = VARCHAR},

#{userAge, jdbcType = INTEGER})

</insert>

</mapper>

JSP新增页面里面的代码如下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

<title>首页测试</title>

</head>

<body>

<h1>测试首页</h1><hr/>

<form action="user_info/add" method="post">

用户姓名:<input type="text" name="userName"><br/>

用户年龄:<input type="text" name="userAge"><br/>

<input type="submit" value="新增">

</form>

</body>

</html>

测试结果如下,项目正常启动。

首页信息如下

输入数据,点击新增按钮,新增成功如下,

然后查看数据库信息如下,

整合过程中遇到的问题,

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ssm.dao.UserInfoDao.addUserInfo

org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)

org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53)

org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:115)

java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)

org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:102)

org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)

com.sun.proxy.$Proxy24.addUserInfo(Unknown Source)

com.ssm.service.impl.UserInfoServiceImpl.addUserInfo(UserInfoServiceImpl.java:31)

com.ssm.controller.UserInfoController.addUserInfo(UserInfoController.java:33)

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

java.lang.reflect.Method.invoke(Method.java:498)

org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)

org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)

org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)

org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)

org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)

org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)

org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)

org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)

javax.servlet.http.HttpServlet.service(HttpServlet.java:652)

org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)

javax.servlet.http.HttpServlet.service(HttpServlet.java:733)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)

org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

):注意 主要问题的全部 stack 信息可以在 server logs 里查看

分析导致问题的原因,创建的dao接口类和对应的xml文件名称不一致才导致这个问题。

解决办法修改xml名称和dao接口类的名称一样即可。

拓展:如果想返回json数据信息,则需要添加一个新的依赖,

<!-- 返回JSON 数据的jar 包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>

在用户Controller中在新增一个方法,如下
@RequestMapping(value = "/test", method = RequestMethod.GET)
public Map test(){
Map<String, String> map = new HashMap();
map.put("userAge", "10");
map.put("userName", "萧炎");
return map;
}
测试结果如下

到此SSM项目整合完成,有其他建议的小伙伴欢迎留言讨论。

SSM项目整合思路以及代码的更多相关文章

  1. SSM项目整合基本步骤

    SSM项目整合 1.基本概念 1.1.Spring Spring 是一个开源框架, Spring 是于 2003  年兴起的一个轻量级的 Java  开发框架,由 Rod Johnson  在其著作  ...

  2. SSM框架整合思路

    SSM框架整合思路 Spring在整合中起到的作用(面试时常问到) Spring管理持久层的mapper. Spring管理业务层的service,service可以调用mapper接口.Spring ...

  3. SSM项目整合第一步 注册登陆实现

    SSM项目整合第一步  注册: 项目目录: 一.数据库建表: 源码: ; -- ---------------------------- -- Table structure for t_user - ...

  4. SSM项目整合Quartz

    一.背景 SSM项目中要用到定时器,初期使用Timer,后来用spring 的schedule,都比较简单,所以功能比较单一而且他们不能动态的配置时间.后来就研究quartz,准备整合到项目中.Qua ...

  5. 三:SSM框架整合思路

    一:jar包 1.spring(包括springmvc) 2.mybatis 3.mybatis-spring整合包 4.数据库驱动 5.第三方连接池 6.json依赖包jackson 二:整合思路 ...

  6. SSM项目整合纪实

    一 前 言 本来是为了探究一些功能性问题,需要一套完整的项目架构,本以为SSM用过那么多了,轻松搭建不在话下,但是过程中还是遇到一些问题,踩到一些未曾料想的坑.博文以搭建极简架构为目的,附带一些关键阐 ...

  7. SSM 项目整合

    SSM整合:spring + springmvc + mybatis 1.1 生成Maven项目:ar_ssm 1.2 添加jar包 <dependencies> <!-- 单元测试 ...

  8. ssm项目整合shiro

    pom.xml <properties> <shiro.version>1.2.2</shiro.version> </properties> < ...

  9. Solr专题(三)SSM项目整合Solr

    一.环境配置 所需要的jar包: org.apache.solr.solr-solrj maven依赖: <!-- https://mvnrepository.com/artifact/org. ...

  10. SpringMVC详解及SSM框架整合项目

    SpringMVC ssm : mybatis + Spring + SpringMVC MVC三层架构 JavaSE:认真学习,老师带,入门快 JavaWeb:认真学习,老师带,入门快 SSM框架: ...

随机推荐

  1. [软件工程/数据工程] 软件工程&数据工程知识体系

    1 概述 本篇是为了重新总结.重新编写5年前(2018-12-31 00:06),临近毕业时的一篇文章软件工程专业知识体系[求职/就业]而作,至此篇文章发布时,原文文章应已被删除.但第1章节中仍会存在 ...

  2. json解析异常显示

    解决方案 1.取消FastJson的循环引用的检查:JSONObject.toJSONString(guardVoList,SerializerFeature.DisableCircularRefer ...

  3. Claude:除ChatGPT外的另一种选择

    前言 Claude 是 Anthropic 开发的人工智能产品.Anthropic 是由 11 名前 OpenAI 员工于 2022 年创立的人工智能公司,旨在构建安全.可解释和有益于人类的人工智能系 ...

  4. Godot 4.0 文件系统特性的总结

    关于文件系统,官方文档犹抱琵琶半遮面,有一些很独特的特性并没有集中地摆出来,导致用的时候晕头转向. 这里总结了目前我发现的Godot文件系统的一些特性. 这是专门针对导出后的,因为一些操作在编辑器里面 ...

  5. VS 输入快捷键propfull

    大家都知道prop.propg输入快捷键. 当前我们需要生成一段包含属性和字段的代码时,可以propfull. propfull在安装了reshaper后,会被隐藏掉.没关系,直接敲propfull, ...

  6. [Pytorch框架] 5.2 Pytorch处理结构化数据

    文章目录 5.2 Pytorch处理结构化数据 简介 数据预处理 定义数据集 定义模型 训练 import numpy as np import pandas as pd import torch f ...

  7. 【解决方法】ASP.NET web 提示错误:CS0103 当前上下文中不存在名称“******”

    问题描述 操作环境与场景: 在 Windows 10 中 Visual Studio 2017 编写网页时,提示报错: 错误 CS0103 当前上下文中不存在名称"******" ...

  8. AutoGPT:有手就会的安装教程

    AutoGPT 是什么 Auto-GPT 是一个实验性开源应用程序,展示了 GPT-4 语言模型的功能.该程序由 GPT-4 驱动,将 LLM 的"思想"链接在一起,以自主实现您设 ...

  9. IPS 和 IDS

    IPS/IDS 什么是IPS和IDS IDS/IPS是检测和防止对网络服务器进行未授权的访问的系统.有许多产品同时有IDS和IPS的作用,作为加强企业信息安全所必须的系统 什么是IDS(Intrusi ...

  10. OData WebAPI实践-OData与EDM

    本文属于 OData 系列 引言 在 OData 中,EDM(Entity Data Model) 代表"实体数据模型",它是一种用于表示 Web API 中的结构化数据的格式.E ...