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修改本地ip
写在前面, 1 对于个人公司需要固定ip,而回家需要用到家里的ip, 2对于公司it人员,每台电脑都需要设置ip,,尤其批量的时候,这个作为it的自己知道 3运维人员,可以通过ip测试哪些ip可以用, ...
- 系统建模之UML状态图[转载]
1 状态图的简介(Instrduction) 状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event) ...
- Java设计模式 —— 工厂模式
3 简单工厂模式 3.1 创建型模式 Creational Pattern 关注对象的创建过程,对类的实例化过程进行了抽象,将软件模块中对象的创建和对象的使用分离,对用户隐藏了类的实例的创建细节.创建 ...
- day134:2RenMJ:TypeScript的抽象类&装饰器&命名空间&模块&编译配置文件&python中的类型注解
目录 1.抽象类 2.装饰器 3.命名空间 4.模块 5.编译配置文件 6.python的类型注解 1.抽象类 抽象类(abstract class)做为其它派生类的基类使用. 它们一般不会直接被实例 ...
- devops-5:从0开始构建一条完成的CI CD流水线
从0开始构建一条完成的CI CD流水线 前文中已经讲述了静态.动态增加agent节点,以动态的k8s cloud为例,下面就以Maven构建Java程序为例,开始构建出一条完整的CI CD流水线. 实 ...
- RTSP Server(LIVE555)源码分析(五)-PLAY信令
主要分析RTSPServer::RTSPClientSession针对客户端PLAY事件处理 一. PLAY信令,handleCmd_withinSession源码解析 1)步骤1.03,当RTSP客 ...
- 解决ffmpeg源码不能编译ffplay问题
虽然不是很大问题,还是记录一下,避免以后忘记!!! 总共两个原因影响了源码编译不能生成ffplay可执行文件,如下: 1.系统中没有安装SDL,直接去官网下载SDL源码编译安装http://www.l ...
- 基于create-react-app构建静态博客
前言: 用过hexo后,我被其强大的功能惊艳到了,于是便想自己也写一个静态博客生成器,并且可以发布到GitHub托管. 首先我们来看下效果图: 具体是怎么实现的呢? 我们通过create-react- ...
- 如何通过C#/VB.NET代码将PowerPoint转换为HTML
利用PowerPoint可以很方便的呈现多媒体信息,且信息形式多媒体化,表现力强.但难免在某些情况下我们会需要将PowerPoint转换为HTML格式.因为HTML文档能独立于各种操作系统平台(如Un ...
- SpringBoot配置与打包基础
本篇主要记录SpringBoot使用的基础配置 SpringBoot Maven配置 SpringBoot maven依赖关系 我们创建springboot项目后,会发现项目的pom文件都会继承自sp ...