当前真实的企业开发中,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. [Linux]Linux执行sh脚本时,出现$‘\r‘: command not found(未找到命令)"错误的解决方案[转载]

    1 文由 为什么要把这么一个看似很简单的问题,还要以[转载]的方式专门用博客写出来? 主要是在编写crontab的自动化定时脚本的过程中,发现是这个错导致的自动化脚本频繁执行异常时,已经花了好几个小时 ...

  2. [数据库]MySQL解决:MySQLNonTransientConnectionException: Could not create connection to database server.【待完善】

    场景复现 mysql数据库 5.7.24 jdbc driver: mysql-connector-java: 5.1.33 jdbc 配置: + jdbc.url + driverName: Tom ...

  3. 和 chatgpt 聊了一会儿分布式锁 redis/zookeeper distributed lock

    前言 最近的 chatGPT 很火爆,听说取代程序员指日可待. 于是和 TA 聊了一会儿分布式锁,我的感受是,超过大部分程序员的水平. Q1: 谈一谈 java 通过 redis 实现分布式 锁 ch ...

  4. Java设计模式 —— 建造者模式

    8 建造者模式 8.1 建造者模式概述 Builder Pattern:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式可以将部件本身和它们的组装过程分开,关注如 ...

  5. golang 必会之 pprof 监控系列(5) —— cpu 占用率 统计原理

    golang pprof 监控系列(5) -- cpu 占用率 统计原理 大家好,我是蓝胖子. 经过前面的几节对pprof的介绍,对pprof统计的原理算是掌握了七八十了,我们对memory,bloc ...

  6. spring boot过滤器实现项目内接口过滤

    spring boot过滤器实现项目内接口过滤 业务 由于业务需求,存在两套项目,一套是路由中心,一套是业务系统. 现在存在问题是,路由中心集成了微信公众号与小程序模块功能,业务系统部署了多套服务. ...

  7. RateLimiter使用

    1.maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava ...

  8. 快速上手Linux核心命令(五):文本处理三剑客

    @ 目录 前言 正则表达式 第一剑客 grep 第二剑客 sed 第三 剑客 awk 小结 剑仙镇楼~ O(∩_∩)O 前言 上一篇中已经预告,我们这篇主要说Linux文本处理三剑客.他们分别是gre ...

  9. python 快速替换csv数据集字符串列表中的表情符号为空,asyncio,re,pandas

    传统的字符串列表替换字符串使用遍历非常慢 比如下面这段代码,如果处理几十万或上百万的数据集时,会非常的慢,几小时几天都可能 import re p = re.compile(u'['u'\U0001F ...

  10. 云原生时代崛起的编程语言Go基础实战

    @ 目录 概述 定义 使用场景 Go 安全 使用须知 搜索工具 Go基础命令 标准库 基础语法 Effective Go 概览 命名规范 注释 变量 常量(const) 控制结构 数据类型 迭代(ra ...