本教程作为一个学习的记录过程,让大家快速学会在IDEA中利用maven搭建一个SSM框架。
1.准备工作
首先打开IDEA创建一个maven项目,如下所示。
点击下一步
点击下一步
最后一步
项目创建好了之后的结构是这样的:
打开这个项目的pom.xml文件,删除<build>这个标签里面的所有内容,同时也删除这个标签,然后修改
<properties>标签里面的内容,修改的内容如下所示:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--指定jdk的编译环境-->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!--指定所用spring系列jar包的版本-->
<spring.version>4.1.4.RELEASE</spring.version>
</properties>
在main下面新建两个文件夹java(用来编写java代码)和resources(用来存放配置文件)
然后把这连个文件夹变成资源文件夹
接下来看图
接下来,在src目录下新建一个test文件夹(用来测试的),然后再test文件夹下面新建一个java和resources文件夹,按照和上面同样的方法把这两个文件夹变成资源文件夹,不过和上面不同的是,这里要把这两个文件夹变成测试环境的资源文件夹,而不是正式编码的环境,如下图所示:
测试文件夹下的东西在发布项目的时候不会被发布出去
在弄好资源文件夹后和我的对比一下看是否和我一样,如果不一样说明大家弄错了哦!
在做好这些准备工作后,我们开始来正式搭建SSM的开发环境
1.搭建spring开发环境
1.1:在pom.xml文件中添加spring所依赖jar包以及在test文件夹下的resources文件夹下创建spring配置文件
<!-- spring start -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc-portlet</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument-tomcat</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring end-->
再添加junit测试所依赖的jar包
<!--junit测试所需jar包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
1.2:在Spring配置文件中添加bean,java.util.Date
在test文件夹下的java文件夹中创建一个类TestSSM用于测试
1.3:使用Junit4进行测试,正确输出日期则Spring环境搭建成功
运行这个方法,看看控制台是否能够正确的输出日期时间
如果控制台正确输出日期,说明我们能够从spring容器中获取到bean,即spring环境搭建成功。
接下来进行下一步
2.搭建mybatis开发环境
2.1:准备好要用到的数据库和表(自己创建好自己测试需要用到的数据库和表)
2.2:创建实体bean ItripHotelRoom(根据自己的实际情况而定,每个人所用的数据库和表都不一样)
2.3:在pom.xml文件添加mybatis所依赖的jar包以及创建mybatis的配置文件mybatis-config.xml,
添加mysql驱动包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.0.5</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
2.4:创建mybatis的dao层接口ItripHotelRoomMapper以及创建ItripHotelRoomMapper.xml配置文件
package com.haijian.mapper;
import com.haijian.model.ItripHotelRoom;
import java.util.List;
/**
* Created by MrXi on 2018/5/6.
*/
public interface ItripHotelRoomMapper {
//查询所有酒店房间
public List<ItripHotelRoom> queryAll();
}
<?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.haijian.mapper.ItripHotelRoomMapper">
<select id="queryAll" resultType="com.haijian.model.ItripHotelRoom">
select
id as id,
hotelId as hotelId,
roomTitle as roomTitle,
roomPrice as roomPrice,
roomBedTypeId as roomBedTypeId,
isHavingBreakfast as isHavingBreakfast,
payType as payType,
satisfaction as satisfaction,
isBook as isBook,
isCancel as isCancel,
isTimelyResponse as isTimelyResponse,
creationDate as creationDate,
createdBy as createdBy,
modifyDate as modifyDate,
modifiedBy as modifiedBy
from itrip_hotel_room
</select>
</mapper>
2.5:将mapper.xml文件注册到mybatis配置文件中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置mybatis数据源 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/itripdb" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper-xml/ItripHotelRoomMapper.xml"/>
</mappers>
</configuration>
2.6:使用Junit4进行测试,在测试类TestSSM中编写测试方法testMyBatis()查询信息,
正常输出数据则mybatis环境搭建成功
@Test
public void testMyBatis() throws IOException {
//加载mybatis配置文件获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().
build(Resources.getResourceAsStream("mybatis-config.xml"));
//通过sqlSessionFactory获取sqlSession(sqlSession表示与数据库的一次会话)
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取mapper(dao层接口的代理对象)
ItripHotelRoomMapper itripHotelRoomMapper =
sqlSession.getMapper(ItripHotelRoomMapper.class);
//调用方法进行查询数据
List<ItripHotelRoom> itripHotelRooms = itripHotelRoomMapper.queryAll();
//遍历输出结果
for (ItripHotelRoom itripHotelRoom : itripHotelRooms) {
System.out.println("%%%%%%"+itripHotelRoom.getRoomTitle());
}
//关闭sqlSession
sqlSession.close();
}
3.集成spring和mybatis
在pom.xml文件中添加spring整合mybatis所依赖的jar包 <!--spring整合mybatis所依赖的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.0.1</version>
</dependency>
3.1:编写spring配置文件 3.1.0:配置注解扫描 3.1.2:配置c3p0数据源 3.1.2:配置sessionFactory 3.1.3:配置事务管理器 3.1.4:配置通知和切面表达式 3.1.5:MapperScannerConfigurer 生成mybatis接口动态代理对象 3.2:使用junit4从spring容器中获取bean,查询用户信息,正常输出则spring和mybatis整合成功。现在我们不在test文件夹下面创建spring配置文件了,我们在src/main/resources文件夹下面创建spring配置文件
applicationContext-public.xml(spring配置文件命名可以自己定义,并不一定要写applicationContext.xml
只不过官方推荐我们取这个名字) 接着我们创建db.propertites配置文件,用于编写连接数据库的信息
#db config
mysql.dirverClass=com.mysql.jdbc.Driver
mysql.jdbcUrl=jdbc:mysql://localhost:3306/itripdb?useUnicode=true&characterEncoding=UTF-8
mysql.user=root
mysql.password=123
mysql.minPoolSize=5
mysql.maxPoolSize=500
mysql.initialPoolSize=10
mysql.maxIdleTime=60
mysql.acquireIncrement=5
mysql.maxStatements=0
mysql.idleConnectionTestPeriod=60
mysql.acquireRetryAttempts=30
mysql.breakAfterAcquireFailure=false
mysql.testConnectionOnCheckout=false
由于我们需要用到c3p0数据库连接池,所以我们需要在pom.xml文件中添加c3p0的依赖<!-- c3p0 数据库连接池 start -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.0</version>
</dependency>
<!-- c3p0 数据库连接池 end -->
在web.xml文件中配置spring的核心监听器 <!--配置spring的核心监听器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
spring配置文件<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置注解扫描-->
<context:component-scan base-package="com.haijian"/>
<!--引入外部配置文件-->
<context:property-placeholder location="classpath*:db.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${mysql.jdbcUrl}"/>
<property name="driverClass" value="${mysql.dirverClass}"/>
<property name="user" value="${mysql.user}"/>
<property name="password" value="${mysql.password}"/>
<!--连接池中保留的最小连接数-->
<property name="minPoolSize" value="${mysql.minPoolSize}"/>
<!--连接池中保留的最大连接数 默认为15-->
<property name="maxPoolSize" value="${mysql.maxPoolSize}"/>
<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="${mysql.initialPoolSize}"/>
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="${mysql.maxIdleTime}"/>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement" value="${mysql.acquireIncrement}"/>
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
<property name="maxStatements" value="${mysql.maxStatements}"/>
<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="${mysql.idleConnectionTestPeriod}"/>
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts" value="${mysql.acquireRetryAttempts}"/>
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效
保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->
<property name="breakAfterAcquireFailure" value="${mysql.breakAfterAcquireFailure}"/>
<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的
时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。Default: false -->
<property name="testConnectionOnCheckout" value="${mysql.testConnectionOnCheckout}"/>
</bean>
<!--配置sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
<!--配置别名-->
<property name="typeAliasesPackage" value="com.haijian.model"/>
<!--指定mapper.xml文件的位置-->
<property name="mapperLocations" value="classpath*:mapper-xml/*Mapper.xml"/>
</bean>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--指定数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save" propagation="REQUIRED"/>
<tx:method name="modify" propagation="REQUIRED"/>
<tx:method name="remove" propagation="REQUIRED"/>
<tx:method name="*" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
<!--通知切面表达式-->
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.haijian.service.*.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
</aop:config>
<!--MapperScannerConfigurer 生成mybatis接口动态代理对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.haijian.mapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
</beans>
在src/java文件夹下创建com.haijian.service和com.haijian.service.impl两个包,然后创建service接口ItripHotelRoomService和他的实现类ItripHotelRoomServiceImpl,在接口中编写queryAll查询全部的方法
package com.haijian.service;
import com.haijian.model.ItripHotelRoom;
import java.util.List;
/**
* Created by MrXi on 2018/5/6.
*/
public interface ItripHotelRoomService {
public List<ItripHotelRoom> queryAll();
}
在实现类中,编写它的实现方法
package com.haijian.service.impl;
import com.haijian.mapper.ItripHotelRoomMapper;
import com.haijian.model.ItripHotelRoom;
import com.haijian.service.ItripHotelRoomService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by MrXi on 2018/5/6.
*/
@Service("itripHotelRoomService")
public class ItripHotelRoomServiceImpl implements ItripHotelRoomService {
@Resource
private ItripHotelRoomMapper itripHotelRoomMapper;
@Override
public List<ItripHotelRoom> queryAll() {
return itripHotelRoomMapper.queryAll();
}
}
在测试类TestSSM中编写测试方法
3.2:使用junit4从spring容器中获取bean,查询酒店房间信息,正常输出则spring和mybatis整合成功。
@Resource
private ItripHotelRoomService itripHotelRoomService;
//测试spring和mybatis是否整合成功
@Test
public void testIOCAndMyBatis(){
List<ItripHotelRoom> itripHotelRooms = itripHotelRoomService.queryAll();
for (ItripHotelRoom itripHotelRoom : itripHotelRooms) {
System.out.println("%%%%%%%%"+itripHotelRoom.getRoomTitle());
}
}
4:搭建springMVC开发环境
4.1:添加pom.xml文件中添加springMVC依赖的jar包并创建springMVC配置文件 4.2:编写web.xml文件 配置springMVC前端控制器,配置字符编码过滤器防止中文乱码 4.3:添加controller并编写/query方法返回所有用户信息 4.4:编写springMVC配置文件 4.4.1:注解扫描 4.4.2:mvc注解驱动-->配置全局消息转换器编码为UTF-8 4.4.3:配置视图解析器在之前我们就把所有spring的依赖都加到pom.xml文件中了,这里就不需要重复加入了,我们需要添加fastJson的依赖,因为我们需要返回json数据到页面
<!--添加fastjson依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!--配置spring的核心监听器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置springMVC前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置字符编码过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
配置springMVC配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置注解扫描-->
<context:component-scan base-package="com.haijian.controller"/>
<!--配置注解驱动-->
<mvc:annotation-driven>
<!--配置消息转换器-->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<!--把实体类转换为Json对象-->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<!--数据转换类型-->
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--配置对静态资源文件的处理-->
<mvc:default-servlet-handler/>
<!--配置视图解析器-->
<bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/html/"/>
<property name="suffix" value=".html"/>
</bean>
</beans>
编写controller
package com.haijian.controller;
import com.haijian.model.ItripHotelRoom;
import com.haijian.service.ItripHotelRoomService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by MrXi on 2018/5/6.
*/
@RequestMapping("/api")
public class ItripHotelRoomController {
@Resource
private ItripHotelRoomService itripHotelRoomService;
@RequestMapping("/queryall")
//添加这个注解返回给页面的就是json字符串
@ResponseBody
public List<ItripHotelRoom> queryAll(){
return itripHotelRoomService.queryAll();
}
}
整个项目结构
开始发布项目,把项目跑起来看页面是否能够返回json数据
项目跑起来后在页面输入地址访问控制器里面的方法
页面返回了json数据,说明我们的SSM框架搭建成功
好了到此我们的SSM框架就搭建完成了,大家可以自己扩展它的内容哦!谢谢大家点赞支持一下,创作不易,欢迎大家转载
请转载的童鞋标明原文出处,谢谢。如果大家发现了错误还请大家留言相告,谢谢!