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
import socket def get_host_ip(): """ 查询本机ip地址 return: ip """ try: s = ...
- SpringBoot项目中使用缓存Cache的正确姿势!!!
前言 缓存可以通过将经常访问的数据存储在内存中,减少底层数据源如数据库的压力,从而有效提高系统的性能和稳定性.我想大家的项目中或多或少都有使用过,我们项目也不例外,但是最近在review公司的代码的时 ...
- Redis读书笔记(二)
Redis对象系统 Redis对象 字符串(String)的底层实现方式 直接保存整数值:字符串对象保存的是整数值,且可以用long类型来表示. embstr编码的SDS:字符串对象保存的是一个长度小 ...
- 运行项目报错Cannot read property 'styles' of undefined
原因是安装依赖版本不对,以下是我的解决办法: 1.先删除项目中package-lock.json 文件 及node_modules文件(可使用rimraf指令删除node_modules,直接删文件很 ...
- 搞懂Python正则表达式,这一篇就够了
本文代码基于Python3.11解释器,除了第一次示例,代码将省略 import re 这个语句 所有示例代码均可以在我的github仓库中的 code.py文件内查看 [我的仓库](PythonLe ...
- 2020-09-10:java里Object类有哪些方法?
福哥答案2020-09-10: registerNatives:private+static.getClass:返回此 Object 的运行时类. hashCode:返回该对象的哈希码值.equals ...
- 2022-07-28:以下go语言代码输出什么?A:AA;B:AB;C:BA;D:BB。 package main import ( “fmt“ ) func main() { f
2022-07-28:以下go语言代码输出什么?A:AA:B:AB:C:BA:D:BB. package main import ( "fmt" ) func main() { f ...
- 2021-08-31:去除重复字母。给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。力扣316。
2021-08-31:去除重复字母.给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置).力扣316. 福大大 答案 ...
- Netty(1)——NIO基础
本篇主要介绍Java NIO的基本原理和主要组件 Netty是由JBOSS提供的Java开源网络应用程序框架,其底层是基于Java提供的NIO能力实现的.因此为了掌握Netty的底层原理,需要首先了解 ...
- ArcGIS如何自动获得随机采样点?
本文介绍基于ArcMap软件,实现在指定区域自动生成随机点的方法. 在GIS应用中,我们时常需要在研究区域内进行地理数据的随机采样:而采样点的位置往往需要在结合实际情况的前提下,用计算机随机生 ...