写在前面
本文介绍最基础的 Spring+Spring MVC+MyBatis 项目框架的搭建, 演示项目->码云地址
【适合人群】:初学小白
【IDE】:Intellij IDEA 2017
开始搭建
1. 创建 web 项目
使用 idea 创建项目,直接选择从原型创建,目录结构如图
各个目录的内容这里不再赘述
要注意的是,可能 idea 自动创建「web.xml」的文件头是 2.3 的协议. 要更换文件头
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
</web-app>
2. 添加依赖
添加 SSM 的 pom 依赖
打开「pom」文件,先在根目录添加下面的内容,对项目添加的 jar 包的版本进行统一管理
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<org.mybatis.version>3.2.3</org.mybatis.version>
<org.springframework.version>4.0.0.RELEASE</org.springframework.version>
</properties>
然后添加需要的 jar 包, dependencies
标签下添加
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${org.mybatis.version}</version>
</dependency>
<!-- mybatis和spring集成包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<!-- druid -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.16</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
<scope>provided</scope>
</dependency>
<!-- common-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!--fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- aspectj -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
<!-- cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<!-- 引入javamail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.4</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.12</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-lgpl</artifactId>
<version>1.9.12</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.6</version>
</dependency>
<!-- servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!--freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5</version>
</dependency>
上文中的依赖除了添加了 SSM 所需要的必须的依赖之外, 还有 web 开发常用的组件的依赖, 作用如下
框架 | 作用 |
---|---|
Spring | 强大的基于 JavaBean 的采用控制反转(IoC)原则的配置管理,使得应用程序的组件更加快捷简易。 |
Spring MVC | 前段框架, 和 Spring 完美融合 |
MyBatis | 持久层框架, 用于数据库连接 |
Druid | 数据库连接池, 用于管理数据库连接 |
lombok | 提供便捷的 getter/setter 等 |
fileupload | 二进制文件上传支持 |
aspectJ | 是一个面向切面的框架,它扩展了Java语言。定义了AOP语法 |
cglib | 动态代理 |
javamail | 提供给开发者处理电子邮件相关的编程接口 |
fastjson | json对象的转换 |
freemarker | 使用模板文件生成指定文件 |
dubbo | 分布式框架 |
zookeeper | 注册中心 |
2. 整合 Spring
创建配置文件「applicationContext.xml」放在「resources」文件夹下, 内容为
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
因为项目使用注解的方式进行配置, 所以开启注解扫描, 先在文件头添加 xsd 引用
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/context.xsd
效果如图
然后在 <beans>
标签下添加内容
<context:annotation-config/>
<context:component-scan base-package="org.nyy.ssmdemo"/>
3. 整合 MyBatis
在「resources」文件夹中创建 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>
<settings>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 禁止访问主对象中的所有的属性都会去触发延迟加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 指定哪些Object中的方法可以触发延迟加载 -->
<setting name="lazyLoadTriggerMethods" value="clone"/>
</settings>
</configuration>
新建数据库并且创建「user」表, 字段如下
字段名 | 属性 | 含义 |
---|---|---|
id | bigint | 主键 |
name | varchar(50) | 姓名 |
sn | varchar(50) | 编号 |
根据表, 新建实体类「User.java」
package org.nyy.ssmdemo.domain;
/**
* 用户实体类
*/
@Setter@Getter@ToString
public class User {
private Long id;
private String name;
private String sn;
}
新建「UserMapper.java」和「UserMapper.xml」, 这两个文件是可以使用 MyBatis-generator 自动生成的, 效果是一样的, 文件内容如下
public interface UserMapper {
int deleteByPrimaryKey(Long id);
int insert(User record);
User selectByPrimaryKey(Long id);
List<User> selectAll();
int updateByPrimaryKey(User record);
}
<?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="org.nyy.ssmdemo.mapper.UserMapper">
<resultMap id="BaseResultMap" type="org.nyy.ssmdemo.domain.User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="sn" property="sn"/>
</resultMap>
<delete id="deleteByPrimaryKey">
DELETE FROM user
WHERE id = #{id}
</delete>
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user
(name, sn)
VALUES
(#{name}, #{sn})
</insert>
<update id="updateByPrimaryKey">
UPDATE user
SET
name = #{name},
sn = #{sn}
WHERE id = #{id}
</update>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="long">
SELECT *
FROM user
WHERE id = #{id}
</select>
<select id="selectAll" resultMap="BaseResultMap">
SELECT *
FROM user
</select>
</mapper>
xml 的 namespace 要和接口的全限定类名一致, xml 中 sql 语句的 id 要和接口中的方法名一致
进行数据库的连接, 和事务的配置, 新建「db.properties」,同样在「resources」文件夹下
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql:///ssmdemo
db.username=[你的数据库账户名]
db.password=[你的数据库密码]
在「applicationContext.xml」中添加数据库的连接配置和事务
<!-- 引入数据库配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 创建连接池对象 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</bean>
<!-- 创建sqlsession -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:myBatis-config.xml"/>
<property name="typeAliasesPackage" value="org.nyy.ssmdemo"/>
<property name="mapperLocations" value="classpath:org/nyy/ssmdemo/mapper/*Mapper.xml"/>
</bean>
<!-- 创建事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务 -->
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="list*" read-only="true"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置aop -->
<aop:config>
<aop:pointcut expression="execution(* org.nyy.ssmdemo.service.*Service.*(..))" id="pointCut"/>
<aop:advisor advice-ref="advice" pointcut-ref="pointCut"/>
</aop:config>
<!-- 配置扫描mapper接口的位置 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.nyy.ssmdemo.mapper" />
</bean>
新建测试类, 测试集成结果
/**
* 测试mapper的集成
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestMapper {
@Autowired
private UserMapper userMapper;
@Test
public void testMapper() throws Exception {
User user = new User();
user.setName("nyy");
user.setSn("NYY");
userMapper.insert(user);
System.out.println(user.getId());
}
}
输出有 id, 集成成功
4 .整合 Spring MVC
配置「web.xml」处理 .do
请求和静态资源
<!-- 配置字符编码过滤器 -->
<filter>
<filter-name>characterEncoding</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>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!-- 将.do请求交给Spring MVC处理 -->
<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:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
在「applicationContext.xml」中添加 mvc 的注解支持和视图解析器, 同时要引入 mvc 的约束文件, 方法和 context 约束文件的引入相同, 不在赘述
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置逻辑视图自动添加的后缀名 -->
<property name="suffix" value=".jsp"/>
<!-- 配置逻辑视图自动添加的前缀 -->
<property name="prefix" value="/WEB-INF/views/"/>
</bean>
新建 Controller
/**
* User控制器
*/
@Controller
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("user")
public Object userList(Model model) {
model.addAttribute("user",userService.selectByPrimaryKey(1L));
return "user";
}
}
其中 service 是服务层的方法, 还需要在创建「WEB-INF/views/user.jsp」文件, body
标签内容为
<body>
${user}
</body>
给项目配置一个 Tomcat 启动之后 访问「localhost/user.do」,效果如下
总结
本文只是介绍了怎么搭建一个最基础的项目, 搭建可能遇到的问题, 以及其他整合部分都没有介绍, 之后有机会会继续写的, 也会多探讨原理的东西