欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

程序员文章站 2024-01-30 12:02:58
1、准备 IntelliJ IDEA Tomcat JDK Maven mysql spring、springmvc、mybatis 了解 现在假设如上条件你都具备,那么通过我这篇博客 你一定可以整合出 SSM 框架,完成如下效果 整个博客共分为三部分: 建立 基于 Maven 的 WEB 项目,启 ......

1、准备

intellij idea
tomcat
jdk
maven
mysql
spring、springmvc、mybatis 了解

现在假设如上条件你都具备,那么通过我这篇博客 你一定可以整合出 ssm 框架,完成如下效果

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

 整个博客共分为三部分:

  • 建立 基于 maven 的 web 项目,启动 tomcat ,项目启动
  • 整合 mybatis+spring ,进行单元测试 可以完成从数据库查询出数据功能
  • 整合 mybaits+spring+springmvc,输入url 完成整个 mvc 的流程

2、步骤

因为说的比较细,所以前面第一部分都了解可以跳过。

2.1 第一部分

1.新建基于 maven 的web工程

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

2.填写 groupid 和 artifactid,参考

 groupid一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupid是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactid是tomcat。

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

3.填写 maven 配置。

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

图片中1、2、3分别: 1:首先你要先配置好 maven,如果配置好了,去 cmd doss 界面下输入mvn --version 命令,如果有显示,则代表已经配置好了,如果没,下载maven,配置环境变量。 maven下载地址

2:选择我们的 maven 文件夹下的 setting,这里特别要注意,可能因为 “墙”的原因,下载 maven jar 包 很容易卡住,所以建议在 setting.xml 配置国内镜像,比如阿里云。

1      <!-- 复制如上一段镜像代码配置,添加阿里云镜像 -->
2      <mirror>
3       <id>alimaven</id>
4       <mirrorof>central</mirrorof>
5       <name>aliyun maven</name>
6       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
7     </mirror>
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

在相应位置填上如上代码即可。

3.这里为了从头开始,我新建了个仓库地址。这里大家随意,也可以和我一样。

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

4.填写工程名,module名,前者是 workspace 后者代表一个项目

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

5.建立架构包

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
 
如果这里弹出此对话框,记得点击 auto。

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

新建文件夹,利用sources resources 两个标签分别转化 java 和 resources 文件夹

6.新建tomcat并且配置

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

7.启动项目

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

2.2 第二部分

**1.添加 maven 依赖。**因为 pom.xml 里面 jar 包太多,太占内容,所以从源码中复制吧。

2.因为ssm三者整合全部放在一个 .xml 中太杂。所以这里拆成三个 spring-mybaits.xmlspring-servicespring-web 配置 spring-mybatis.xml ,包含如下内容:

  • 数据库配置文件 jdbc.properties。包含数据库地址 密码 库名等等。
1     <!-- 1.配置数据库相关参数properties的属性:${url} -->
2     <context:property-placeholder location="classpath:jdbc.properties" />
  • 连接池。这里使用 c3p0。
 1    <!-- 2.数据库连接池 -->
 2     <bean id="datasource" class="com.mchange.v2.c3p0.combopooleddatasource">
 3         <!-- 配置连接池属性 -->
 4         <property name="driverclass" value="${jdbc.driver}" />
 5         <property name="jdbcurl" value="${jdbc.url}" />
 6         <property name="user" value="${jdbc.username}" />
 7         <property name="password" value="${jdbc.password}" />
 8 
 9         <!-- c3p0连接池的私有属性 -->
10         <property name="maxpoolsize" value="30" />
11         <property name="minpoolsize" value="10" />
12         <!-- 关闭连接后不自动commit -->
13         <property name="autocommitonclose" value="false" />
14         <!-- 获取连接超时时间 -->
15         <property name="checkouttimeout" value="10000" />
16         <!-- 当获取连接失败重试次数 -->
17         <property name="acquireretryattempts" value="2" />
18     </bean>
  • 配置sqlsessionfactory对象。专用来获取 sqlsession。
 1     <!-- 3.配置sqlsessionfactory对象 -->
 2     <bean id="sqlsessionfactory" class="org.mybatis.spring.sqlsessionfactorybean">
 3         <!-- 注入数据库连接池 -->
 4         <property name="datasource" ref="datasource" />
 5         <!-- 配置mybaties全局配置文件:mybatis-config.xml -->
 6         <property name="configlocation" value="classpath:mybatis-config.xml" />
 7         <!-- 扫描entity包 使用别名 -->
 8         <property name="typealiasespackage" value="ssm.entity" />
 9         <!-- 扫描sql配置文件:mapper需要的xml文件 -->
10         <property name="mapperlocations" value="classpath*:mapper/*.xml" />
11     </bean>

在 resources 下新建 mybatis-config.xml ,此文件也称作 mybatis 的核心配置文件。里面内容为空 暂时

1 <?xml version="1.0" encoding="utf-8" ?>
2 <!doctype configuration
3         public "-//mybatis.org//dtd config 3.0//en"
4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 
7 </configuration>

新建 entity 包,用来放实体类,也就是 pojo。同时在 sqlsession 工厂中扫描整个实体类包。这样在 mapper 中就可以用 类名做别名,不用写整个类的相对位置路径了。

1   <select id="queryuserlistbyusername" parametertype="string" resulttype="user">
2       select
3             *
4       from
5             user
6       where
7             username = #{username}
8   </select>

比如其中的 user。不然就要写成

1 ssm.entity.user

对于 sql 配置文件,我这里放在 resources-->mapper--> 下。

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

对于 *mapper.xml 的位置处理有很多中方式。有的放在 mapper 包下。然后在 mapper 下建立两个包,分别放 daomapper

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

还有分别根据功能建包,一个功能建一个包,其中包含一组 功能文件,分别是 *dao *mapper.xml

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

具体怎样做根据实际项目情况来,如果项目系统功能复杂还是建议后面两种,不然到时候会很痛苦(项目多,文件就多,如果第一种方法,则跨度大,屏幕占满 :) )

<property name="mapperlocations" value="classpath*:mapper/*.xml" /> <property name="configlocation" value="classpath:mybatis-config.xml" /> 根据自己实际情况填写

  • mapper 动态代理开发,扫描 dao 接口。
1    <!-- 4.配置扫描dao接口包,动态实现dao接口,注入到spring容器中 -->
2     <bean class="org.mybatis.spring.mapper.mapperscannerconfigurer">
3         <!-- 注入sqlsessionfactory -->
4         <property name="sqlsessionfactorybeanname" value="sqlsessionfactory" />
5         <!-- 给出需要扫描dao接口包 -->
6         <property name="basepackage" value="ssm.dao" />
7     </bean>

<property name="basepackage" value="ssm.dao" /> 根据自己实际情况填写

ok!到这里位置,我们的 spring-mybatis 就配置好了。已经可以通过 mybatis 操作数据库了,现在我们来测试下 这一步出问题没。 先往数据库插入一些数据。这里我提供一份我的 sql 文件,如果各位有需要, 直接运行就可以了。

 1 drop table if exists `items`;
 2 create table `items` (
 3   `id` int(11) not null auto_increment,
 4   `name` varchar(32) not null comment '商品名称',
 5   `price` float(10,1) not null comment '商品定价',
 6   `detail` text comment '商品描述',
 7   `pic` varchar(64) default null comment '商品图片',
 8   `createtime` datetime not null comment '生产日期',
 9   primary key (`id`)
10 ) engine=innodb auto_increment=4 default charset=utf8;
11 
12 -- ----------------------------
13 -- records of items
14 -- ----------------------------
15 insert into `items` values ('1', '台式机', '3000.0', '该电脑质量非常好!!!!', null, '2016-02-03 13:22:53');
16 insert into `items` values ('2', '笔记本', '6000.0', '笔记本性能好,质量好!!!!!', null, '2015-02-09 13:22:57');
17 insert into `items` values ('3', '背包', '200.0', '名牌背包,容量大质量好!!!!', null, '2015-02-06 13:23:02');
18 
19 -- ----------------------------
20 -- table structure for user
21 -- ----------------------------
22 drop table if exists `user`;
23 create table `user` (
24   `id` int(11) not null auto_increment,
25   `username` varchar(32) not null comment '用户名称',
26   `birthday` date default null comment '生日',
27   `sex` char(1) default null comment '性别',
28   `address` varchar(256) default null comment '地址',
29   primary key (`id`)
30 ) engine=innodb auto_increment=27 default charset=utf8;
31 
32 -- ----------------------------
33 -- records of user
34 -- ----------------------------
35 insert into `user` values ('1', '王五', null, '2', null);
36 insert into `user` values ('10', '张三', '2014-07-10', '1', '北京市');
37 insert into `user` values ('16', '张小明', null, '1', '河南郑州');
38 insert into `user` values ('22', '陈小明', null, '1', '河南郑州');
39 insert into `user` values ('24', '张三丰', null, '1', '河南郑州');
40 insert into `user` values ('25', '陈小明', null, '1', '河南郑州');
41 insert into `user` values ('26', '王五', null, null, null);

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

 

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

这是整个项目的结构。 在 entity 下建立 user 实体类,注意字段对齐。 在 dao 下建立 userdao

 1 import org.apache.ibatis.annotations.param;
 2 import ssm.entity.user;
 3 import java.util.list;
 4 
 5 /**
 6  * created by guozhaohui628@gmail.com on 2018/5/7
 7  * description:
 8  */
 9 public interface userdao {
10 
11     public list<user> queryuserlistbyusername(string username);
12 
13     public list<user> queryuserlistbyusername2sex(@param("username")string username, @param("sex") int sex);
14 
15 }

在 mapper 下新建 usermappper.xml 用来写 sql 语句。因为测试,所以这里写一个简单的 sql 查询。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!doctype mapper
 3         public "-//mybatis.org//dtd mapper 3.0//en"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="ssm.mapper.userdao">
 6     <!-- 目的:为dao接口方法提供sql语句配置 -->
 7   <select id="queryuserlistbyusername" parametertype="string" resulttype="user">
 8       select
 9             *
10       from
11             user
12       where
13             username = #{username}
14   </select>
15 
16     <select id="queryuserlistbyusername2sex" resulttype="user">
17         select
18             *
19         from
20             user
21         where
22             username = #{username}
23         and sex = #{sex}
24     </select>
25 </mapper>

其中有一个地方要注意 <mapper namespace="ssm.mapper.userdao"> 映射位置 换成自己的,可能我们两不一样。

这里有个小技巧特别要注意,一般开发中,我们都是先在把 sql 写完运行正确才放到这里面来,比如下图中,并且为了美观,复制 sql 语句前都会规范下 sql 语句,避免太乱。

 

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

 

ok! 写一个测试类 测试下。

 1 import org.junit.test;
 2 import org.springframework.context.applicationcontext;
 3 import org.springframework.context.support.classpathxmlapplicationcontext;
 4 import ssm.dao.userdao;
 5 import ssm.entity.user;
 6 
 7 import java.util.list;
 8 
 9 /**
10  * created by guozhaohui628@gmail.com on 2018/5/7
11  * description:
12  */
13 public class testpratice {
14     @test
15     public void a(){
16         applicationcontext ac = new classpathxmlapplicationcontext("spring-mybatis.xml");
17         userdao userdao = ac.getbean(userdao.class);
18         list<user> userlist = userdao.queryuserlistbyusername2sex("王五",1);
19 //        list<user> userlist = userdao.queryuserlistbyusername("王五");
20         system.out.println(userlist.tostring());
21     }
22 }

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

好的,到这一步,说明我们的 mybatis 和 spring 整合没问题。

2.3 第三部分

现在来写 spring-service.xml ,比较简单,就是扫描下 service 类包和配置事务。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:tx="http://www.springframework.org/schema/tx"
 6        xsi:schemalocation="http://www.springframework.org/schema/beans
 7     http://www.springframework.org/schema/beans/spring-beans.xsd
 8     http://www.springframework.org/schema/context
 9     http://www.springframework.org/schema/context/spring-context.xsd
10     http://www.springframework.org/schema/tx
11     http://www.springframework.org/schema/tx/spring-tx.xsd">
12     <!-- 扫描service包下所有使用注解的类型 -->
13     <context:component-scan base-package="ssm.service" />
14 
15     <!-- 配置事务管理器 -->
16     <bean id="transactionmanager"
17           class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
18         <!-- 注入数据库连接池 -->
19         <property name="datasource" ref="datasource" />
20     </bean>
21 
22     <!-- 配置基于注解的声明式事务 -->
23     <tx:annotation-driven transaction-manager="transactionmanager" />
24 </beans>
spring + springmvc 整合 建立 spring-web ,里面内容比较少,只是扫描了 controller 用来保证前端控制器 dispatcherservlet 能够找到并进入相关方法中。 同时还配置了试图解析器 viewresolve, 这样我们跳转视图时直接写 视图名称即可,不用写相对地址路径了。
1     <!-- 3.配置jsp 显示viewresolver -->
2     <bean class="org.springframework.web.servlet.view.internalresourceviewresolver">
3         <property name="viewclass" value="org.springframework.web.servlet.view.jstlview" />
4         <property name="prefix" value="/jsp/" />
5         <property name="suffix" value=".jsp" />
6     </bean>
7 
8     <!-- 4.扫描web相关的 controller -->
9     <context:component-scan base-package="ssm.controller" />

最后就是配置 web.xml。主要作用是 配置 前端控制器 dispatcherservlet 重点是拦截规则处理。这里我们是所有都拦截。其次是 刚才我们 书写的 三个 spring-*.xml 文件在这里配置启动。

 1  <!-- spring mvc servlet-->
 2   <servlet>
 3     <servlet-name>springmvc</servlet-name>
 4     <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
 5     <init-param>
 6       <param-name>contextconfiglocation</param-name>
 7       <param-value>classpath:/spring-*.xml</param-value>
 8     </init-param>
 9   </servlet>
10   <servlet-mapping>
11     <servlet-name>springmvc</servlet-name>
12     <!-- 此处也可以配置成 *.do *.action形式 -->
13     <url-pattern>/</url-pattern>
14   </servlet-mapping>

然后就是日志和编码,对于当前的测试没啥作用,但是还是配置好吧

 1 <context-param>
 2     <param-name>log4jconfiglocation</param-name>
 3     <param-value>classpath:log4j.properties</param-value>
 4   </context-param>
 5 
 6   <!-- 编码过滤器 -->
 7   <filter>
 8     <filter-name>encodingfilter</filter-name>
 9     <filter-class>org.springframework.web.filter.characterencodingfilter</filter-class>
10     <init-param>
11       <param-name>encoding</param-name>
12       <param-value>utf-8</param-value>
13     </init-param>
14   </filter>
15   <filter-mapping>
16     <filter-name>encodingfilter</filter-name>
17     <url-pattern>/*</url-pattern>
18   </filter-mapping>

好的 终于搞完了,现在可以安心的写代码了。现在准备一个这样的 jsp 文件。

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

 1 <%@ page language="java" contenttype="text/html; charset=utf-8"
 2     pageencoding="utf-8"%>
 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
 5 <%@ page iselignored="false" %>
 6 <!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
 7 <html>
 8 <head>
 9 <meta http-equiv="content-type" content="text/html; charset=utf-8">
10 <title>查询商品列表</title>
11 </head>
12 <body> 
13 <form action="${pagecontext.request.contextpath}/items/queryitem.action" method="post">
14 查询条件:
15 <table width="100%" border=1>
16 <tr>
17 <td><input type="submit" value="查询"/></td>
18 </tr>
19 </table>
20 商品列表:
21 <table width="100%" border=1>
22 <tr>
23     <td>商品名称</td>
24     <td>商品价格</td>
25     <td>生产日期</td>
26     <td>商品描述</td>
27     <td>操作</td>
28 </tr>
29 <c:foreach items="${itemlist }" var="item">
30 <tr>
31     <td>${item.name }</td>
32     <td>${item.price }</td>
33     <td>${item.createtime}</td>
34     <td>${item.detail }</td>
35     <td><a href="${pagecontext.request.contextpath }/itemedit.action?id=${item.id}">修改</a></td>
36 </tr>
37 </c:foreach>
38 </table>
39 </form>
40 </body>
41 
42 </html>

我们需要查询所有的 item 数据显示在上面。

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

首先写 itemsdao

 1 import org.springframework.stereotype.repository;
 2 import ssm.entity.items;
 3 
 4 import java.util.list;
 5 
 6 /**
 7  * created by guozhaohui628@gmail.com on 2018/5/8
 8  * description:
 9  */
10 @repository
11 public interface itemsdao {
12     public list<items> queryallitemslist();
13 }

对应的 imtesmapper.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!doctype mapper
 3         public "-//mybatis.org//dtd mapper 3.0//en"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="ssm.dao.itemsdao">
 6     <!-- 目的:为dao接口方法提供sql语句配置 -->
 7     <select id="queryallitemslist" resulttype="items">
 8          select
 9             *
10         from
11             items;
12     </select>
13 </mapper>

书写 itemsservice 接口和 其实现类

 1 import ssm.entity.items;
 2 
 3 import java.util.list;
 4 
 5 /**
 6  * created by guozhaohui628@gmail.com on 2018/5/8
 7  * description:
 8  */
 9 public interface itemsservice {
10 
11     list<items> queryallitemslist();
12 
13 }

 

 1 package ssm.service;
 2 
 3 import org.springframework.beans.factory.annotation.autowired;
 4 import org.springframework.stereotype.service;
 5 import ssm.dao.itemsdao;
 6 import ssm.entity.items;
 7 
 8 import java.util.list;
 9 
10 /**
11  * created by guozhaohui628@gmail.com on 2018/5/8
12  * description:
13  */
14 @service
15 public class itemsserviceimpl implements itemsservice {
16 
17     // 注入service依赖
18     @autowired
19     private itemsdao itemsdao;
20 
21     @override
22     public list<items> queryallitemslist() {
23         return itemsdao.queryallitemslist();
24     }
25 }

最后写 itemscontroller

 1 import org.springframework.beans.factory.annotation.autowired;
 2 import org.springframework.stereotype.controller;
 3 import org.springframework.web.bind.annotation.requestmapping;
 4 import org.springframework.web.servlet.modelandview;
 5 import ssm.entity.items;
 6 import ssm.service.itemsserviceimpl;
 7 
 8 import java.util.list;
 9 
10 
11 /**
12  * created by guozhaohui628@gmail.com on 2018/5/8
13  * description:
14  */
15 @controller
16 public class itemscontroller {
17 
18 
19     // 注入service依赖
20     @autowired
21     private itemsserviceimpl itemsservice;
22 
23     @requestmapping(value = "items/queryitem.action")
24     public modelandview itemslist(){
25         modelandview mav = new modelandview();
26         list<items> itemslist = itemsservice.queryallitemslist();
27         system.out.println(itemslist.tostring());
28         mav.addobject("itemlist", itemslist);
29         mav.setviewname("itemlist");
30         return mav;
31     }
32 }

.jsp中的代码已经写好了,直接用就可以了。 我们要测试 要么直接点击这个地址,要么点击查询

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

 

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

ok, 完事儿,写的比较细,所以比较长。希望对你有帮助~

参考: