SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
1、准备
intellij idea
tomcat
jdk
maven
mysql
spring、springmvc、mybatis 了解
现在假设如上条件你都具备,那么通过我这篇博客 你一定可以整合出 ssm 框架,完成如下效果
整个博客共分为三部分:
- 建立 基于 maven 的 web 项目,启动 tomcat ,项目启动
- 整合 mybatis+spring ,进行单元测试 可以完成从数据库查询出数据功能
- 整合 mybaits+spring+springmvc,输入url 完成整个 mvc 的流程
2、步骤
因为说的比较细,所以前面第一部分都了解可以跳过。
2.1 第一部分
1.新建基于 maven 的web工程
2.填写 groupid 和 artifactid,参考
groupid一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupid是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactid是tomcat。
3.填写 maven 配置。
图片中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>
在相应位置填上如上代码即可。
3.这里为了从头开始,我新建了个仓库地址。这里大家随意,也可以和我一样。
4.填写工程名,module名,前者是 workspace 后者代表一个项目
5.建立架构包
新建文件夹,利用sources
resources
两个标签分别转化 java 和 resources 文件夹
6.新建tomcat并且配置
7.启动项目
2.2 第二部分
**1.添加 maven 依赖。**因为 pom.xml 里面 jar 包太多,太占内容,所以从源码中复制吧。
2.因为ssm三者整合全部放在一个 .xml 中太杂。所以这里拆成三个 spring-mybaits.xml
,spring-service
,spring-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--> 下。
对于 *mapper.xml 的位置处理有很多中方式。有的放在 mapper
包下。然后在 mapper
下建立两个包,分别放 dao
和 mapper
还有分别根据功能建包,一个功能建一个包,其中包含一组 功能文件,分别是 *dao *mapper.xml
具体怎样做根据实际项目情况来,如果项目系统功能复杂还是建议后面两种,不然到时候会很痛苦(项目多,文件就多,如果第一种方法,则跨度大,屏幕占满 :) )
<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);
这是整个项目的结构。 在 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 语句,避免太乱。
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 }
好的,到这一步,说明我们的 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-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 文件。
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 数据显示在上面。
首先写 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中的代码已经写好了,直接用就可以了。 我们要测试 要么直接点击这个地址,要么点击查询
ok, 完事儿,写的比较细,所以比较长。希望对你有帮助~