当前真实的企业开发中,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. python入门教程之九日期时间常用操作

    Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示. Py ...

  2. AVL树的构建

    package com.xd.leetcode.shu; /** * created by lianzhen on 2020-03-10 10:27. describe:平衡二叉树的构建 * * LL ...

  3. 【Spring注解驱动】(三)Servlet 3.0

    前言 今天是7.21日,终于是看完了..暑假在家学习是真的差点意思 1 Servlet 3.0简介 Servlet 2.0是在web.xml中配置servlet filter.listener.Dis ...

  4. Vuex刷新页面数据会丢失吗?咋解决的?

    1.问题描述:页面刷新的时候vuex里的数据会重新初始化,导致数据丢失.因为vuex里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,vuex里面的数据就会被重新赋值. 2.解决思 ...

  5. 宝塔ftp无法连接的解决方案

    宝塔面板现在使用率非常的高.今天把自己的踩坑处理方法记录一下. 在配置号宝塔面板ftp后,使用vscode的sftp插件,发现一直链接不上.一度以为自己配置文件,配置的参数有问题.各种度娘后,花了好长 ...

  6. ArcGIS Pro创建、发布、调用GP服务全过程示例(等高线分析)

    在之前的文章介绍过使用ArcMap发布GP分析服务,由于ArcGIS后续不在更新ArcMap,改用ArcGIS Pro,本文对ArcGIS Pro发布GP分析服务进行说明. 本文以等高线分析为例,使用 ...

  7. java封装和关键字

    一.封装 封装:告诉我们如何正确设计对象的属性和方法 对象代表什么,就得封装对应的数据,并提供数据对应的行为 封装的好处: 让编程变得很简单,有什么事,找对象,调方法 降低学习成本,可以少学,少记,或 ...

  8. #PowerBi 10分钟学会,以X为结尾的聚合函数

    前言 在Power BI中,我们经常需要对数据进行聚合计算,比如求和.求平均.求最大值等. Power BI提供了一系列的聚合函数,可以用来对表中列的值进行聚合然后返回一个值.这些函数通常只需要一个参 ...

  9. 2023-02-13:力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号 它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集群 其中连接 connections 是

    2023-02-13:力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号 它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集群 其中连接 connections 是 ...

  10. 分库分表的 21 条法则,hold 住!

    大家好,我是小富- (一)好好的系统,为什么要分库分表? 本文是<分库分表ShardingSphere5.x原理与实战>系列的第二篇文章,距离上一篇文章已经过去好久了,惭愧惭愧- 还是不着 ...