Spring Boot 整合Spring MVC 过程
关系图:
这种关系图的程序代码的书写代码的程序是从左边往左边写!
要了解Spring MVC 的操作了解:
做这些用到了mybatis 的整合,这样简化了jdbc连贯数据库的操作
上面是书写的代码:
-- Application.properties
close banner
spring.main.banner-mode=off
Spring DateSource
spring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring mybatis
mybatis.mapper-locations=classpath:/mapper/goods/GoodsMapper.xml
spring log
logging.level.com.cy=debug
server
server.port=80
server.servlet.context-path=/binbin
spring thymleaf
spring.thymeleaf.prefix=classpath:/templates/pages/
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false
--GoodsMapper.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="com.cy.pj.goods.dao.GoodsDao">
<delete id="deleteObjects">
delete from tb_goods where id in <!-- (1,2,3,4,5) --> <foreach collection="ids" open="(" close=")" separator="," item="id"> #{id} </foreach>
</delete>
</mapper>
Goods.java
package com.cy.pj.goods.pojo;
import java.util.Date;
public class Goods {
private Long id;//id bigint primary key auto_increment private String name;//name varchar(100) not null private String remark;//remark text private Date createdTime;//createdTime datetimepublic Long getId() { return id;}public void setId(Long id) { this.id = id;}public String getName() { return name;}public void setName(String name) { this.name = name;}public String getRemark() { return remark;}public void setRemark(String remark) { this.remark = remark;}public Date getCreatedTime() { return createdTime;}public void setCreatedTime(Date createdTime) { this.createdTime = createdTime;}@Overridepublic String toString() { return "Goods [id=" + id + ", name=" + name + ", remark=" + remark + ", createdTime=" + createdTime + "]";}
}
GoodsDao(interface)
package com.cy.pj.goods.dao;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
/*
- @Mapper 用于形容(做标记)数据层拜访接口,用于通知mybatis框架,
应用此注解形容的接口为底层创立实现类,在实现类中基于mybatis API 实现与数据库的交互
这个类的对象最初 交给spring来治理
*/
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.cy.pj.goods.pojo.Goods;
@Mapper
public interface GoodsDao {
@Select("select * from tb_goods")List<Goods>findGoods();/** * 基于id执行商品信息的删除, 在mybatis中如果sql映射比较简单 * 能够间接以注解办法进行定义 * @param id * @return *//** * 基于id去查找商品信息 * @param id * @return */@Select("select * from tb_goods where id=#{id}")Goods findById(Integer id);@Update("update tb_goods set name=#{name},remark=#{remark} where id=#{id}")int UpdateGoods(Goods goods);@Delete("delete from tb_goods where id=#{id}")int deleteById(Integer id);/** * 基于多个id执行商品删除业务操作 * ids可变参数,用于承受传入的商品id值 */int deleteObjects(@Param("ids")Integer...ids);@Insert("insert into tb_goods(name,remark,createdTime) values (#{name},#{remark},now())" )int insertGoods(Goods goods);
}
GoodsService(interface)
package com.cy.pj.goods.service;
import java.util.List;
import com.cy.pj.goods.pojo.Goods;
/**
- 商品模块的业务层接口,负责具体业务规范定义
- @author Bin and Legend
*
*/
public interface GoodsService {
Goods findById(Integer id); List<Goods>findGoods(); int deleteById(Integer id); int saveGoods(Goods goods); int UpdateGoods(Goods goods);
}
GoodsServiceImpl
package com.cy.pj.goods.service.impl;
import java.util.Date;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
- 业务层对象,后续会在此对象中执行
- 1)外围业务(例如 : 点击购买商品信息,要生成点单项信息,扣减库存 ...)
- 2)扩大业务 (例如 :事务管制,权限管制,日志记录)
*/
import org.springframework.stereotype.Service;
import com.cy.pj.goods.dao.GoodsDao;
import com.cy.pj.goods.pojo.Goods;
import com.cy.pj.goods.service.GoodsService;
//@Deprecated
@Service//是一个非凡的@Component 也能够用@Component
public class GoodsServiceImpl implements GoodsService{
private static final Logger log = LoggerFactory.getLogger(GoodsServiceImpl.class);@Autowiredprivate GoodsDao goodsdao;@Overridepublic List<Goods> findGoods() { return goodsdao.findGoods();}@Overridepublic int saveGoods(Goods goods) { // TODO Auto-generated method stub goods.setCreatedTime(new Date()); return goodsdao.insertGoods(goods);}@Overridepublic int deleteById(Integer id) { long t1 = System.currentTimeMillis(); int rows = goodsdao.deleteById(id); long t2 = System.currentTimeMillis(); log.info("deleteById execute time : {}",(t2-t1)); System.out.println(log.getClass().getName()); return rows;}@Overridepublic Goods findById(Integer id) { return goodsdao.findById(id);} @Overridepublic int UpdateGoods(Goods goods) { // TODO Auto-generated method stub return goodsdao.UpdateGoods(goods);}
}
GoodsController
/**
*/
package com.cy.pj.goods.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import com.cy.pj.goods.pojo.Goods;
import com.cy.pj.goods.service.GoodsService;
/**
- @author Bin and Legend
*
*/
@Controller
@RequestMapping("/goods/")
public class GoodsController {
//http://localhost/goods/doDeleteById?id=12@Autowiredprivate GoodsService goodsService;//执行删除操作@RequestMapping("doDeleteById/{id}")public String doDeleteById(@PathVariable Integer id) { goodsService.deleteById(id); return "redirect:/goods/doGoodsUI";}@RequestMapping("doGoodsAddUI")public String doGoodsAddUI() { return "goods-add";}@RequestMapping("doGoodsUI")public String doGoodsUI(Model model) { List<Goods> list = goodsService.findGoods(); model.addAttribute("goods", list); return "goods";//view name}@RequestMapping("doSaveGoods")public String doSaveGoods(Goods goods){ goodsService.saveGoods(goods); return "redirect:/goods/doGoodsUI" ;}@RequestMapping("doUpdateGoods")public String doUpdateGoods(Goods goods){ goodsService.UpdateGoods(goods); return "redirect:/goods/doGoodsUI" ;}@RequestMapping("doFindById/{id}")public String doFindById(@PathVariable Integer id,Model model) { Goods goods = goodsService.findById(id); model.addAttribute("goods", goods); return "goods-update";} //FAQ? //返回的viewname会给谁?谁调用doGoodsController就给谁(DispatcherServelt) //谁负责解析viewname V //解析到的后果会响应到哪里}
goods.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>The Goods Page</h1>
增加商品
id | name | remark | createdTime | operation | |
---|---|---|---|---|---|
1 | AAAAAAA | AA.... | 2020/08/31 | delete | update |
</body>
</html>
goods-add.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
ul li {list-style-type: none}
</style>
</head>
<body>
<h1>The Goods Add page</h1><form th:action="@{/goods/doSaveGoods}" method="p"> <ul> <li>name: <li><input type="text" name="name"> <li>remark: <li><textarea rows="3" cols="30" name="remark"></textarea> <li><input type="submit" value="Save Goods"> </ul></form>
</body>
</html>
goods-update.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
ul li {list-style-type: none}
</style>
</head>
<body>
<h1>The Goods Add page</h1><form th:action="@{/goods/doUpdateGoods}" method="p"> <input type="hidden" name="id" th:value="${goods.id}"> <ul> <li>name: <li><input type="text" name="name" th:value="${goods.name}"> <li>remark: <li><textarea rows="3" cols="30" name="remark" th:text="${goods.remark}"></textarea> <li><input type="submit" value="Save Goods"> </ul></form>
</body>
</html>
前面的是测试类的后果:
DateSourceTests.java
package com.cy.pj.common.datasource;
import java.sql.Connection;
import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class DataSourceTests {
/* * FAQ? * 请问dataSource对象在运行时指向的具体对象类型是什么 两种: * 一:对象。getclass()。getname();通过反射来找到指向的具体对象 二:通过debug测试来,将鼠标指向该连贯就能够看到具体对象 * 请问dataSource对象是有谁帮你创立的?spring框架(基于底层的根本配置)DataSourceAutoConfiguration */ @Autowired private DataSource datasource; //测试通过数据源DataSource对象获取一个连贯 @Test public void testConnection() throws Exception {
// //输入datasource变量指向的对象的类型
// System.out.println(datasource.getClass().getName());//com.zaxxer.hikari.HikariDataSource
//请问获取连贯的过程你理解吗 //第一次获取连贯时会检测连接池是否存在,如果不存在则创立并初始化池 //基于Driver对象创立与数据库的连贯,并将连贯放在池中 //最初从池中返回用户的须要的连贯 Connection conn = datasource.getConnection(); System.out.println(conn); }
}
GoodsDaoTests.java
package com.cy.pj.goods.dao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.cy.pj.goods.dao.GoodsDao;
@SpringBootTest
public class GoodsDaoTests {
/** 关联数据层接口,并由spring为其进行值的注入 * FAQ? * 1)GoodsDao指向的对象是谁,由谁创立?由谁治理 * 2)GoodsDao指向的外部对象会做什么事件? 基于mybatis API进行会话操作 */ @Autowired private GoodsDao goodsdao; @Test void testDeleteId() { int rows = goodsdao.deleteById(1); System.out.println("rows=" + rows); } @Test void testDeleteObject() { int rows = goodsdao.deleteObjects(2,3); System.out.println("rows=" + rows); }
}
GoodsServiceTests.java
package com.cy.pj.goods.service;
import java.util.List;
/**
- FAQ?
- 什么是耦合? 耦合性(Coupling),也叫耦合度,是对模块间关联水平的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的形式以及通过界面传送数据的多少。
*/
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.cy.pj.goods.pojo.Goods;
@SpringBootTest
public class GoodsServiceTests {
@Autowired//has aprivate GoodsService goodsService; @Test void testFindGoods() { List<Goods> list = goodsService.findGoods(); for(Goods g:list) { System.out.println(g); } } @Testvoid testDeleteById() { int rows = goodsService.deleteById(10); System.out.println("rows=" +rows );}
}
这一次的所须要的依赖注入,来自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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --></parent><groupId>com.cy</groupId><artifactId>CGB-SBOOT-04</artifactId><version>0.0.1-SNAPSHOT</version><name>CGB-SBOOT-04</name><description>Demo project for Spring Boot</description><properties> <java.version>1.8</java.version></properties><dependencies><!-- 此依赖提供了HikariCP连接池 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- 负责数据库的的驱动程序 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <!-- 增加mybatis starter 依赖(SpringBoot 在这个依赖下提供mybatis的主动配置 --><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency></dependencies><build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins></build>
</project>