SSM框架搭建教程(从零开始,图文结合) 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, 完事儿,写的比较细,所以比较长。希望对你有帮助~
参考: