SSM项目整合思路以及代码

发布时间 2023-07-02 18:04:00作者: 一只爱阅读的程序员

  当前真实的企业开发中,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项目整合完成,有其他建议的小伙伴欢迎留言讨论。