当前真实的企业开发中,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获取本地ip地址1

    import socket def get_host_ip(): """ 查询本机ip地址 return: ip """ try: s = ...

  2. SpringBoot项目中使用缓存Cache的正确姿势!!!

    前言 缓存可以通过将经常访问的数据存储在内存中,减少底层数据源如数据库的压力,从而有效提高系统的性能和稳定性.我想大家的项目中或多或少都有使用过,我们项目也不例外,但是最近在review公司的代码的时 ...

  3. Redis读书笔记(二)

    Redis对象系统 Redis对象 字符串(String)的底层实现方式 直接保存整数值:字符串对象保存的是整数值,且可以用long类型来表示. embstr编码的SDS:字符串对象保存的是一个长度小 ...

  4. 运行项目报错Cannot read property 'styles' of undefined

    原因是安装依赖版本不对,以下是我的解决办法: 1.先删除项目中package-lock.json 文件 及node_modules文件(可使用rimraf指令删除node_modules,直接删文件很 ...

  5. 搞懂Python正则表达式,这一篇就够了

    本文代码基于Python3.11解释器,除了第一次示例,代码将省略 import re 这个语句 所有示例代码均可以在我的github仓库中的 code.py文件内查看 [我的仓库](PythonLe ...

  6. 2020-09-10:java里Object类有哪些方法?

    福哥答案2020-09-10: registerNatives:private+static.getClass:返回此 Object 的运行时类. hashCode:返回该对象的哈希码值.equals ...

  7. 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 ...

  8. 2021-08-31:去除重复字母。给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。力扣316。

    2021-08-31:去除重复字母.给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置).力扣316. 福大大 答案 ...

  9. Netty(1)——NIO基础

    本篇主要介绍Java NIO的基本原理和主要组件 Netty是由JBOSS提供的Java开源网络应用程序框架,其底层是基于Java提供的NIO能力实现的.因此为了掌握Netty的底层原理,需要首先了解 ...

  10. ArcGIS如何自动获得随机采样点?

      本文介绍基于ArcMap软件,实现在指定区域自动生成随机点的方法.   在GIS应用中,我们时常需要在研究区域内进行地理数据的随机采样:而采样点的位置往往需要在结合实际情况的前提下,用计算机随机生 ...