SSM项目整合思路以及代码
当前真实的企业开发中,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项目整合思路以及代码的更多相关文章
- SSM项目整合基本步骤
SSM项目整合 1.基本概念 1.1.Spring Spring 是一个开源框架, Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作 ...
- SSM框架整合思路
SSM框架整合思路 Spring在整合中起到的作用(面试时常问到) Spring管理持久层的mapper. Spring管理业务层的service,service可以调用mapper接口.Spring ...
- SSM项目整合第一步 注册登陆实现
SSM项目整合第一步 注册: 项目目录: 一.数据库建表: 源码: ; -- ---------------------------- -- Table structure for t_user - ...
- SSM项目整合Quartz
一.背景 SSM项目中要用到定时器,初期使用Timer,后来用spring 的schedule,都比较简单,所以功能比较单一而且他们不能动态的配置时间.后来就研究quartz,准备整合到项目中.Qua ...
- 三:SSM框架整合思路
一:jar包 1.spring(包括springmvc) 2.mybatis 3.mybatis-spring整合包 4.数据库驱动 5.第三方连接池 6.json依赖包jackson 二:整合思路 ...
- SSM项目整合纪实
一 前 言 本来是为了探究一些功能性问题,需要一套完整的项目架构,本以为SSM用过那么多了,轻松搭建不在话下,但是过程中还是遇到一些问题,踩到一些未曾料想的坑.博文以搭建极简架构为目的,附带一些关键阐 ...
- SSM 项目整合
SSM整合:spring + springmvc + mybatis 1.1 生成Maven项目:ar_ssm 1.2 添加jar包 <dependencies> <!-- 单元测试 ...
- ssm项目整合shiro
pom.xml <properties> <shiro.version>1.2.2</shiro.version> </properties> < ...
- Solr专题(三)SSM项目整合Solr
一.环境配置 所需要的jar包: org.apache.solr.solr-solrj maven依赖: <!-- https://mvnrepository.com/artifact/org. ...
- SpringMVC详解及SSM框架整合项目
SpringMVC ssm : mybatis + Spring + SpringMVC MVC三层架构 JavaSE:认真学习,老师带,入门快 JavaWeb:认真学习,老师带,入门快 SSM框架: ...
随机推荐
- python移动同名文件
import os import shutil def split_name(file): file_name, _ = file.split('.') return file_name def mo ...
- 实时分布式低延迟OLAP数据库Apache Pinot探索实操
@ 目录 概述 定义 特性 何时使用 部署 Local安装 快速启动 手动设置集群 Docker安装 快速启动 手动启动集群 Docker Compose 实操 批导入数据 流式导入数据 概述 定义 ...
- win10 双开微信 微信双开
方法1:鼠标连续点击实现Windows微信双开在桌面上找到微信图标,鼠标左键连续点击2次为打开一个微信,连续点击8次就打开了4个微信. 注意:不要连续点开太多防止卡顿. 方法2:回车键双击微信图标实现 ...
- ASP.NET Core设置URLs的几种方法,完美解决.NET 6项目局域网IP地址远程无法访问的问题
近期在dotnet项目中遇到这样的问题:.net6 运行以后无法通过局域网IP地址远程访问.后查阅官方文档.整理出解决问题的五种方式方法,通过新建一个新的WebApi项目演示如下: 说明 操作系统:U ...
- Swift Codable协议实战:快速、简单、高效地完成JSON和Model转换!
前言 Codable 是 Swift 4.0 引入的一种协议,它是一个组合协议,由 Decodable 和 Encodable 两个协议组成.它的作用是将模型对象转换为 JSON 或者是其它的数据格式 ...
- Linux redhat7.2 制作u盘问题总结
Linux redhat7.2 制作u盘问题总结 其实呢,觉得本来没必要写一篇关于装系统的文章,毕竟我觉得大多数搞it的人都会,比如win10.ubuntu做个启动盘啥的应该都会,但是说实在的今天 ...
- 数据分析06-五个pandas可视化项目
数据分析-06 数据分析-06 pandas可视化 基本绘图 Series数据可视化 DataFrame数据可视化 高级绘图 代码总结 pandas可视化 基本绘图 pandas高级绘图 pandas ...
- Python tkinter的简单使用,在绘布上播放GIF和图片
Python tkinter的简单使用,在绘布上播放GIF和图片 文章目录 Python tkinter的简单使用,在绘布上播放GIF和图片 前言 一.tkinter 的简单组件以及pack(),gr ...
- Java 网络编程 —— 创建多线程服务器
一个典型的单线程服务器示例如下: while (true) { Socket socket = null; try { // 接收客户连接 socket = serverSocket.accept() ...
- 2021-05-15:数组为{3, 2, 2, 3, 1},查询为(0, 3, 2),意思是在数组里下标0~3这个范围上,有几个2?答案返回2。假设给你一个数组arr, 对这个数组的查询非常频繁,都给
2021-05-15:数组为{3, 2, 2, 3, 1},查询为(0, 3, 2),意思是在数组里下标0~3这个范围上,有几个2?答案返回2.假设给你一个数组arr, 对这个数组的查询非常频繁,都给 ...