一,前提
把Spring+SpringMVC+Mybatis框架整合成一套,在后期企业级开发中,可以实现重复使用
Mybatis:操作数据库的框架,特点:只需要写出Dao层接口和接口中方法对应的SQL语句
SpringMVC:实现对外的接口,特点:代替Servlet,接受请求(键值对,字符串(json或者xml),路径传参),给出相应(页面路径,数据)
Spring:实现其他框架的整合,特点:提供IOC,同意进行对象的创建和管理,还提供AOP,可以在不改变的源码的情况下,对某些方法的增强。
二,准备
2.1数据库
CREATE TABLE `t_work` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`company` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`money` double(255, 0) NULL DEFAULT NULL,
`city` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
2.2复习
各个框架的所需要的包,配置,核心代码
三,SSM整合
3.1依赖jar包
数据库
mybatis
spring
SpringMVC
其他相关
<dependencies>
<!-- 数据库 驱动和连接池-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
<!-- Mybatis相关 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- SpringMVC相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
<!-- Spring相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.9</version>
</dependency>
<!-- 其他jar-->
<!-- 文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- 简化类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<!-- 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- 日志log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- Servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
3.2实现配置
1.数据库连接配置
2.日志配置
3.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">
<!-- 1.加载外部的配置,一般都是数据库连接信息 -->
<!-- <context:property-placeholder location="classpath*:dbconfig.properties"></context:property-placeholder>-->
<!-- 2.配置数据库连接信息,创建数据库连接池的对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="jdbc:mysql://39.105.189.141:3307/db_j218?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF8"></property>
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="username" value="root"></property>
<property name="password" value="zzjava"></property>
</bean>
<!-- 3.配置Mybatis的连接工厂信息-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 设置数据库连接池-->
<property name="dataSource" ref="dataSource"></property>
<!-- 配置映射文件所在的路径-->
<property name="mapperLocations">
<array>
<value>classpath:mapper/*Mapper.xml</value>
</array>
</property>
</bean>
<!-- 4.Mybatis的扫描的对象 指定持久层的包-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
<property name="basePackage" value="com.feri.ssm.dao"></property>
</bean>
<!-- 5.配置需要IOC创建的额对象-->
<bean id="workServiceImpl" class="com.feri.ssm.service.impl.WorkServiceImpl">
<property name="dao" ref="workDao"></property>
</bean>
</beans>
4.springmvc的配置
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 1.扫描控制层所在包,创建对应的类的对象,存储到IOC-->
<context:component-scan base-package="com.feri.ssm.controller"></context:component-scan>
<!-- 2.配置MVC相关信息-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 放行静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
</beans>
5.web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>ssm</display-name>
<!-- 1.配置Spring的上下文对象 -->
<!-- 1.1初始化参数加载Spring的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<!-- 1.2.Spring的核心 监听器 监听ServletContext的生命周期,并创建上下文-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--2.Springmvc的前端控制器的配置 Servlet -->
<!-- 2.1.注册SpringMVC的前端控制器 就是Servlet的注册-->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 2.2 局部参数:声明配置文件位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
</servlet>
<!-- 2.3 配置Servlet的触发路径-->
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
3.3代码编写
3.3.1项目分包
entity—-实体包:对应数据库表
dao——-持久层:实现表的常用方法(CRUD)
mapper—映射文件夹:实现对应持久层的映射文件,定义接口中方法的sql语句
service—
intf —-业务接口层,实现业务逻辑功能的方法定义
impl—业务实现层,重写接口层的方法,实现业务逻辑
manager—
intf—-业务通用接口层,非数据库相关的业务逻辑的方法定义
impl—业务通用实现层,非数据库相关的业务逻辑的方法定义
contreller—控制层,实现对外的接口,接受请求和给出相应
fonfig———配置层,存储一些通用配置信息
util————-工具层,封装的一些工具类
dto————-数据转换层,实现实体类的转化操作
bo—————业务对象层,封装业务层的类
vo—————视图对象层,封装终端(网站,app,小程序,快应用,物联网等)
exception—异常层,封装自定义异常
filter———-过滤器层
listerner—-监听器层
……
3.3.2搭架子
@Data
public class Work {
private Integer id;
private String name;
private String company;
private double money;
private String city;
}
<?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.qfedu.ssm.dao.WorkDao">
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into t_work(name,company,city,money) values (#{name},#{company},#{city},#{money});
</insert>
<select id="selectAll" resultType="com.qfedu.ssm.entity.Work">
select * from t_work order by id desc
</select>
</mapper>
业务层:
public interface WorkService {
//新增
int save(Work work);
//查询
List<Work> queryAll();
}
@Data
@Service
public class WorkServiceImpl implements WorkService {
@Autowired
private WorkDao dao;
public int add(Work work) {
return dao.add(work);
}
public List<Work> selectAll() {
return dao.selectAll();
}
}@Data
public class WorkServiceImpl implements WorkService {
//依赖
private WorkDao dao;
@Override
public int save(Work work) {
return dao.save(work);
}
@Override
public List<Work> queryAll() {
return dao.selectAll();
}
}
控制层:
@Controller
@RequestMapping("/api/work")
public class WorkController {
@Autowired
private WorkService service;
//新增
@ResponseBody
@RequestMapping(value = "add",method = {RequestMethod.POST})
public int add(Work work){
return service.add(work);
}
//查询所有
@ResponseBody
@RequestMapping(value = "selectAll",method = {RequestMethod.GET})
public List<Work> selectAll(){
return service.selectAll();
}
}
页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SSM整合</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<!-- <script src="js/jquery-3.2.1.min.js"></script>-->
<style>
#fm1{
font-size: 20px;
text-align: center;
}
#fm1 div{
margin: 10px;
}
label,input{
font-size: 25px;
padding: 10px;
}
button{
margin-top: 10px;
font-size: 20px;
padding: 10px;
color: white;
border-radius: 10px;
background-color: red;
}
fieldset{
border: 5px solid green;
}
table{
width: 80%;
margin-top: 20px;
border: 1px solid aqua;
}
.dv2{
text-align: center;
align-items: center;
width: 100%;
}
</style>
</head>
<body>
<div>
<!-- 新增-->
<div>
<form id="fm1">
<fieldset>
<legend>录入你的入职信息:</legend>
<div>
<label>姓名:</label><input name="name" placeholder="请输入姓名">
</div>
<div>
<label>公司:</label><input name="company" placeholder="请输入公司">
</div>
<div>
<label>城市:</label><input name="city" placeholder="请输入城市">
</div>
<div>
<label>薪水:</label><input name="money" placeholder="请输入薪水">
</div>
<div id="dv1">
<button type="button" onclick="add()">新增入职信息</button>
</div>
</fieldset>
</form>
</div>
<!-- 列表-->
<div class="dv2">
<div><button id="btn2" onclick="refushData()">刷新数据</button></div>
<table>
<tr>
<th>序号</th>
<th>姓名</th>
<th>公司</th>
<th>城市</th>
<th>薪水</th>
</tr>
<tbody id="tbdata">
<tr>
<td>1</td>
<td>大龙</td>
<td>神州数码</td>
<td>北京</td>
<td>18888</td>
</tr>
</tbody>
</table>
</div>
</div>
<script type="text/javascript">
function add(){
//获取新增的参数信息
var data=$("#fm1").serialize();
//请求后端接口,传递数据
$.post("api/work/add",data,function(res){
console.log(res);
if(res==1){
// alert("新增成功!");
refushData();
}
})
}
function refushData(){
alert("查询成功")
$("#tbdata").html("");
$.get("api/work/selectAll",function(res){
console.log(res);
for(i in res){
var w=res[i];
$("#tbdata").append("<tr><td>"+w.id+"</td><td>"+w.name+"</td><td>"+w.company+"</td><td>"+w.city+"</td><td>"+w.money+"</td></tr>")
}
})
}
</script>
</body>
</html>
https://www.runoob.com/
Ajax网页请求后端接口的技术,只要在网页上,想要调用后端的接口,就可以用Ajax
后端接口的请求方式不一样,页面选择方法也不一样:
post:
$.post(”后端接口地址”,后端接口需要的参数,function(res){
res就是后端接口的返回值
})
get:
$.get(“后端接口地址?需要传递的参数”,function(res){
res就是后端接口的返回值
})