java简单ssm(spring+springmvc+mybatis)框架结构demo
1. 项目结构整理
项目采用标准的SSM(Spring + SpringMVC + MyBatis)框架结构,具体如下:
\ssm\
├── pom.xml # Maven项目依赖管理文件
├── src\ # 源代码目录
│ └── main\ # 主要源码
│ ├── java\ # Java源代码
│ │ └── com\
│ │ └── demo\
│ │ ├── bean\ # 实体类
│ │ │ ├── Dept.java # 部门实体
│ │ │ └── Emp.java # 员工实体
│ │ ├── controller\ # 控制器
│ │ │ └── SSMController.java # 测试控制器
│ │ └── dao\ # 数据访问接口
│ │ ├── DeptDao.java # 部门DAO接口
│ │ └── EmpDao.java # 员工DAO接口
│ └── resources\ # 资源文件
│ ├── com\ # MyBatis映射文件
│ │ └── demo\
│ │ └── dao\
│ │ ├── DeptDao.xml # 部门映射文件
│ │ └── EmpDao.xml # 员工映射文件
│ ├── db.properties # 数据库配置文件
│ ├── mybatis-config.xml # MyBatis核心配置
│ ├── spring.xml # Spring配置文件
│ └── springmvc.xml # SpringMVC配置文件
├── ssm.iml # IDEA项目文件
└── web\ # Web资源├── WEB-INF\ # Web应用配置│ ├── page\ # JSP页面│ │ └── success.jsp # 成功页面│ └── web.xml # Web应用部署描述符└── index.jsp # 首页
2. SSM框架知识点练习分析
此项目主要练习了以下SSM框架的核心知识点:
Spring知识点:
- Spring IOC容器的配置与使用
- 注解扫描配置(
@Controller
、@Service
等) - 依赖注入(DI)实现(通过
@Autowired
注解) - 数据源配置(Druid连接池)
- 事务管理配置(声明式事务)
SpringMVC知识点:
- SpringMVC前端控制器配置
- 请求映射配置(
@RequestMapping
) - 控制器开发(Controller)
- 视图解析器配置(InternalResourceViewResolver)
- 静态资源处理
- 编码过滤器配置
- REST风格支持配置
MyBatis知识点:
- MyBatis核心配置文件
- 映射文件(Mapper XML)的编写
- SQL语句与Java方法的映射
- 实体类与数据表的映射
- MyBatis与Spring的整合配置
- Mapper接口扫描配置
其他综合知识点:
- Maven项目管理与依赖配置
- Web项目目录结构
- JSP视图开发
- 数据库连接配置
3. 项目文件功能分析
Java源代码文件:
-
实体类(Bean):
Dept.java
:部门实体类,包含部门编号(deptno)、部门名称(dname)、部门位置(loc)以及部门下的员工列表(emps),实现了Serializable接口支持序列化。Emp.java
:员工实体类,包含员工编号(empno)、姓名(ename)、职位(job)、上级(mgr)、入职日期(hiredate)、薪资(sal)、奖金(comm)和部门编号(deptno)。
-
控制器(Controller):
SSMController.java
:处理/test
请求,注入EmpDao并调用其方法查询员工信息,将结果添加到Model中传递给视图。
-
数据访问层(DAO):
DeptDao.java
:部门数据访问接口,定义了查询部门信息的方法。EmpDao.java
:员工数据访问接口,定义了根据员工编号查询员工的方法。
配置文件:
-
数据库配置:
db.properties
:配置数据库连接信息,包括驱动类、URL、用户名和密码。
-
Spring配置:
spring.xml
:Spring核心配置文件,配置了组件扫描、数据源、事务管理器以及与MyBatis的整合。
-
SpringMVC配置:
springmvc.xml
:SpringMVC配置文件,配置了控制器扫描、静态资源处理、注解驱动以及视图解析器。
-
MyBatis配置:
mybatis-config.xml
:MyBatis核心配置文件,配置了数据库环境和映射器扫描。DeptDao.xml
:部门DAO的MyBatis映射文件(目前为空)。EmpDao.xml
:员工DAO的MyBatis映射文件,实现了根据员工编号查询员工的SQL语句。
Web配置和页面:
web.xml
:Web应用部署描述符,配置了Spring监听器、SpringMVC前端控制器、字符编码过滤器和REST风格支持过滤器。success.jsp
:成功页面,显示SSM框架测试信息和从控制器传递过来的员工姓名。
项目整体功能总结
这是一个简单的SSM框架练习项目,主要实现了以下功能流程:
- 用户访问
/test
请求 - SpringMVC的DispatcherServlet接收请求并交由SSMController处理
- SSMController注入EmpDao并调用其selectEmpByEmpno方法查询员工信息
- EmpDao通过MyBatis执行SQL查询数据库
- 查询结果返回给控制器,控制器将员工姓名添加到Model中
- 控制器返回"success"视图名,由SpringMVC视图解析器解析为对应的JSP页面
- JSP页面显示查询结果
这个项目虽然简单,但完整展示了SSM框架的核心工作流程和各组件之间的协作关系,是学习SSM框架的基础入门示例。
代码
实体类
public class Emp implements Serializable {private Integer empno;private String ename;private String job;private Integer mgr;private Date hiredate;private Double sal;private Double comm;private Integer deptno;
}public class Dept implements Serializable {private Integer deptno;private String dname;private String loc;private List<Emp> emps;
}
dao.java
import com.demo.bean.Emp;public interface EmpDao {public Emp selectEmpByEmpno(Integer empno);
}import com.demo.bean.Dept;public interface DeptDao {public Dept selectDeptByDeptno(Integer deptno);public Dept selectDeptByStep(Integer deptno);public Dept selectDeptByStemp2(Integer deptno);
}
dao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.dao.EmpDao"><select id="selectEmpByEmpno" resultType="com.demo.bean.Emp">select * from emp where empno = #{empno}</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.dao.DeptDao"></mapper>
controller 层
package com.demo.controller;import com.demo.bean.Emp;
import com.demo.dao.EmpDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class SSMController {@AutowiredEmpDao empDao;@RequestMapping("/test")public String test(Model model){System.out.println("test");Emp emp = empDao.selectEmpByEmpno(1111);System.out.println(emp);model.addAttribute("emp",emp.getEname());return "success";}
}
前端页面
<!-- index.jsp -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body>$END$</body>
</html><!-- WEB-INF/page/success.jsp --><%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
ssm 6666
<br>
${emp}
</body>
</html>
配置文件
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--spring相关配置-->
<!-- 监听器--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
<!-- 属性,用来配置spring--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></context-param><!--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>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><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncoding</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--配置REST过滤器--><filter><filter-name>rest</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping><filter-name>rest</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.demo</groupId><artifactId>ssm</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/cglib/cglib --><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.5</version></dependency><!-- https://mvnrepository.com/artifact/aopalliance/aopalliance --><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.3.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.21</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-web --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.3.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.3.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><!-- <!– https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api –><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency>--><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.10.3</version></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.10.3</version></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.10.3</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/jstl --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version></dependency><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.2.0</version></dependency><!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.0-alpha1</version></dependency><!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>2.0.0-alpha1</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.4</version></dependency></dependencies>
</project>
db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
username=root
password=1234
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="db.properties" ></properties><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><package name="com.demo.dao"/></mappers>
</configuration>
spring.xml
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--定义扫描的包--><context:component-scan base-package="com.demo" use-default-filters="false"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!--定义外部配置文件--><context:property-placeholder location="classpath:db.properties"></context:property-placeholder><!--配置数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${driver}"></property><property name="url" value="${url}"></property><property name="username" value="${username}"></property><property name="password" value="${password}"></property></bean><!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--开启事务控制--><tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven><!--整合mybatis--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath:com/demo/dao/*.xml"></property></bean><!--定义mybatis扫描器,扫描映射文件--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.demo.dao"></property><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
</beans>
springmvc.xml
<?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:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--定义扫描的包use-default-filters:默认的扫描会包含@Controller,@Service,@Component,@Repository,我们再进行配置的时候需要扫描这么多组件只扫描@Controller这个注解--><context:component-scan base-package="com.demo" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!--请求静态资源--><mvc:default-servlet-handler></mvc:default-servlet-handler><!--请求动态资源--><mvc:annotation-driven></mvc:annotation-driven><!--设置视图管理器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/page/"></property><property name="suffix" value=".jsp"></property></bean>
</beans>