SSM(springmvc + spring + MyBatis)整合开发
1、SSM编程的基本介绍
SSM 编程,即 springmvc + spring + MyBatis 整合,是当前最为流行的 javaEE 开发技术架构。
- springmvc:视图层、界面层,负责接收请求,返回处理结果
- spring:业务层,管理 service、dao、工具类对象
- MyBatis:持久层,负责操作数据库
SSM框架是spring MVC ,Spring和Mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层(web),controller层,service层,dao层四层,使用spring MVC负责请求的转发和视图管理。Spring实现业务对象管理,Mybatis作为数据对象的持久化引擎。
- 表现层(web):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
- 业务逻辑层(service):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
- 数据访问层(dao):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。
2、SSM整合示例
首先,先在 idea 中通过 maven 创建一个 web 项目,手动添加 src/main/java 和 src/main/resources 目录。初始目录结构如下:
2.1、建表语句
下面会用到student表,建表语句如下:
DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(80) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.2、pom.xml 文件配置
在 pom.xml 配置文件中添加依赖,并且配置一些 build 选项:
<?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>org.example</groupId> <artifactId>mybatis_spring</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>mybatis_spring Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--jsp--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> <!--springmvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.5.RELEASE</version> </dependency> <!--事务相关--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.5.RELEASE</version> </dependency> <!--jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> <!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> </dependencies> <build> <!--将src下以及resources目录下的properties、xml文件编译后写出到target目录--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </project>
2.3、web.xml 文件配置
在 web.xml 文件中配置 springmvc 和 spring:
<?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"> <!-- SpringMVC的前端控制器 --> <servlet> <servlet-name>springmvcTest</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 自定义springmvc的配置文件的位置--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:conf/dispatcherServlet.xml</param-value> <!--指定配置文件的位置--> </init-param> <!-- 指定该servlet对象在tomcat启动时即创建--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvcTest</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!--注册spring监听器--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:conf/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--注册字符集过滤器 强制utf-8编码--> <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>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>forceResponseEncoding</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>
2.4、新建包、目录、配置文件
在 src/main/resouces 目录下新建文件夹 conf,用来存放一系列的配置文件。如在上面 web.xml 配置中所指定的 springmvc 的配置文件 dispatcherServlet.xml、spring 的配置文件 applicationContext.xml、jdbc.properties 和 mybatis.xml 。
在 src/main/java 目录下新建包如 mypackage,在该包新建一系列包,如 service、dao、domain、controller。
最后目录结构如下:
2.5、spring 的配置文件 applicationContext.xml
主要是配置service和dao
<?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" 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"> <!-- spring的配置文件:声明service、dao、工具类等对象--> <!--获取数据库连接信息--> <context:property-placeholder location="classpath:conf/jdbc.properties" /> <!--使用druid数据源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!--创建SqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:conf/mybatis.xml" /> </bean> <!--声明mybatis扫描器,创建dao对象--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> <property name="basePackage" value="mypackage.dao" /> </bean> <!--声明 service的注解@Service所在包的位置--> <context:component-scan base-package="mypackage.service" /> <!--事务配置(注解或aspectj)--> </beans>
2.6、springmvc 的配置文件 dispatcherServlet.xml
配置spirngMVC,主要是组件controller、视图view的配置
<?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"> <!-- springmvc的配置文件,声明controller和其它web相关的对象--> <!--组件扫描器--> <context:component-scan base-package="mypackage.domain,mypackage.dao,mypackage.service,mypackage.controller" /> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <!--注解驱动--> <mvc:annotation-driven /> </beans>
2.7、数据库配置文件 jdbc.properties
数据库配置文件配置数据库连接的基本信息,示例:
jdbc.url=jdbc:mysql://localhost:3306/userDB jdbc.username=root jdbc.password=123456
上面的 userDB 为数据库名称。
2.8、mybatis 的配置文件mybatis.xml
<?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日志--> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <!--配置别名--> <typeAliases> <!-- 实体类所在的包名--> <package name="mypackage.domain"/> </typeAliases> <!--sql mapper文件的位置--> <mappers> <package name="mypackage.dao"/> </mappers> </configuration>
2.9、编写java代码
最终的 java 代码目录结构如下:
2.9.1、先建立实体类(domain、model层)
实体层用于存放我们的实体类,与数据库中的属性值基本保持一致,实现set和get的方法。
Student 类:
package mypackage.domain; public class Student { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
2.9.2、controller 层
负责具体模块的业务流程控制(获取参数(前端传过来)返回响应(前端或数据库或一个指定路径)),需要调用service逻辑设计层的接口来控制业务流程(导入service层)。
StudentController 类:
package mypackage.controller; import mypackage.domain.Student; import mypackage.service.StudentService; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import java.util.List; @Controller @RequestMapping("/student") public class StudentController { @Resource private StudentService service; //添加学生 @RequestMapping("/addStudent.do") public ModelAndView addStudent(Student student){ ModelAndView mv =new ModelAndView(); String tips = "注册失败"; //调用service处理 int nums = service.addStudent(student); if(nums > 0){ tips = "学生【"+student.getName()+"】注册成功"; } //添加数据 mv.addObject("tips", tips); //指定结果页面(逻辑名称) mv.setViewName("result"); return mv; } //查询 返回json @RequestMapping("/queryStudent.do") @ResponseBody public List<Student> queryStudent(Student student){ //省略参数检查以及数据处理 List<Student> students = service.findStudents(); return students; } }
2.9.3、service 层
service层(接口类)为controller层的类提供接口进行调用,一般就是自己写的方法封装起来,具体实现在serviceImpl中。servicedmpl(实现service层,整合service和dao)(导入dao层)(接口实现类)
StudentService 接口:
package mypackage.service; import mypackage.domain.Student; import java.util.List; public interface StudentService { int addStudent(Student student); List<Student> findStudents(); }
实现类 StudentServiceImpl :
package mypackage.service.impl; import mypackage.dao.StudentDao; import mypackage.domain.Student; import mypackage.service.StudentService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; @Service public class StudentServiceImpl implements StudentService { @Resource private StudentDao studentDao; @Override public int addStudent(Student student) { int nums = studentDao.insertStudent(student); return nums; } @Override public List<Student> findStudents() { return studentDao.selectStudents(); } }
2.9.4、dao 层(可以理解为mapper层)
dao层(接口类)对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的,主要实现一些增删改查操作,在Mybatis中方法主要与与xxxMapper.xml内相互一一映射。
StudentDao 接口:
package mypackage.dao; import mypackage.domain.Student; import java.util.List; public interface StudentDao { int insertStudent(Student student); List<Student> selectStudents(); }
mybatis 对应的SQL 文件,文件名跟上面的 dao 类一样,即名为:StudentDao.xml:
<?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="mypackage.dao.StudentDao"> <select id="selectStudents" resultType="Student"> select id,name,age from student order by id desc </select> <insert id="insertStudent"> insert into student(name,age) values(#{name},#{age}) </insert> </mapper>
2.10、编写 jsp 验证
jsp 文件最终目录结构如下:
index.jsp :
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String basePath = request.getScheme()+"://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %> <html> <head> <title>Title</title> <base href="<%=basePath%>"> </head> <body> <table align="center"> <tr> <td><a href="addStudent.jsp">注册学生</a></td> </tr> <tr> <td><a href="listStudent.jsp">浏览学生</a></td> </tr> </table> </body> </html>
listStudent.jsp :
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String basePath = request.getScheme()+"://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %> <html> <head> <title>查询学生 使用ajax</title> <base href="<%=basePath%>"> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $.ajax({ url:"student/queryStudent.do", dataType:"json", success:function(data){ $.each(data, function(i,n){ $("#info").append("<tr>") .append("<td>"+n.id+"</td>") .append("<td>"+n.name+"</td>") .append("<td>"+n.age+"</td>") .append("</tr>") }) } }) }) </script> </head> <body> <table align="center"> <thead> <tr> <td>学号</td> <td>姓名</td> <td>年龄</td> </tr> </thead> <tbody id="info"> </tbody> </table> </body> </html>
addStudent.jsp :
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String basePath = request.getScheme()+"://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %> <html> <head> <title>Title</title> <base href="<%=basePath%>"> </head> <body> <div align="center"> <form action="student/addStudent.do" method="post"> <table> <tr> <td>姓名</td> <td><input type="text" name="name"></td> </tr> <tr> <td>年龄</td> <td><input type="text" name="age"></td> </tr> <tr> <td> </td> <td><input type="submit" value="提交"></td> </tr> </table> </form> </div> </body> </html>
jsp/result.jsp :
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 结果:${tips} </body> </html>