springboot+springm vc+mybatis实现增删改查案例!

大家好,我是雄雄,欢迎关注微信公众号【雄雄的小课堂】。

前言

最近这几天都在看关于springboot的内容,每天新会获得点新收获,并且都总结发在公众号中;最后经过不懈努力,不断查找相关网页,解决各种各样的问题,终于搭建出来了个新版的“S(springboot)S(springmvc)M(mybatis)框架”,下面是搭建步骤。

01

在idea中创建springboot项目

在idea编辑器中,点击File->New->Project->Spring Initializr->选择jdk版本为1.8,然后点击Next

然后按照下图修改各个输入框的值,然后点击Next

选择web,勾上spring web

接下来选择sql,勾上对应的jdbc,mybaits和mysql driver,然后点击Next

然后点击Finish,新建完的项目结构如下:

到现在为止,一个崭新的springboot+Maven项目就搭建好了,接下来我们来配置一下pom.xml文件。

02

配置pom.xml文件

由于我们前端需要使用jsp来展示数据,所以pom.xml文件里面需要配置一个编译解析jsp页面的依赖,代码如下:

<!--用于解析jsp页面--><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId></dependency><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-jsp-api</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency>

在首页我这边需要用到jstl来展示数据,所以还需要导入jstl的相关依赖,如下所示:

<!--jstl相关依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId></dependency>

03

编写application.properties文件

虽然springboot对配置文件简化了很多,但是必要的配置还是要有的, 那么这些配置就都放在了application.properties文件中,也有的项目中是application.yml文件,在这里我们以application.properties文件为例:

首先需要配置一下服务器的端口号,默认为8080,也可以改,代码如下:

#服务器端口号
server.port=8080

配置数据池:

#配置数据池
spring.datasource.url=jdbc:mysql://localhost:3306/schooldb
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root

配置mybatis的别名:

#起别名
mybatis.type-aliases-package=com.xiongxiong.entity

配置日志信息:

#配置日志
logging.level.com.xiongxiong.dao = debug
logging.file.path=log/
logging.file.name=book.log

配置springmvc的内容

#配置springmvc的内容
#页面默认前缀配置
spring.mvc.view.prefix=/
#页面默认后缀配置
spring.mvc.view.suffix=.jsp

这是些基础的配置,如果还有其他扩展,可以自行添加配置信息。

04

搭建底层的三层架构(数据库脚本和结构在文末)

BookManage

在com.xiongxiong下面新建包entity,存放实体类BookManage,按照数据库表中的字段,对应写实体类的属性,最后getter和setter,代码如下:

package com.xiongxiong.entity;import org.springframework.format.annotation.DateTimeFormat;import java.util.Date;public class BookManage {private int bid;private String bname;private String bauthor;@DateTimeFormat(pattern = "yyyy-MM-dd")private Date btime;private int btype;public int getBid() {return bid;}public void setBid(int bid) {this.bid = bid;}public String getBname() {return bname;}public void setBname(String bname) {this.bname = bname;}public String getBauthor() {return bauthor;}public void setBauthor(String bauthor) {this.bauthor = bauthor;}public Date getBtime() {return btime;}public void setBtime(Date btime) {this.btime = btime;}public int getBtype() {return btype;}public void setBtype(int btype) {this.btype = btype;}
}

BookManageMapper

在com.xiongxiong中新建包dao,在该包中创建接口BookManageMapper,分别编写增删改以及查询全部和根据编号查询的接口。

package com.xiongxiong.dao;import com.xiongxiong.entity.BookManage;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.List;@Mapper //证明是mybatis的mapper文件
@Repository     //证明这是dao层
public interface BookManageMapper {@Select("select * from BookManage;")//查询全部List<BookManage> findBookAll();@Insert("insert into bookmanage (bname,bauthor,btime,btype) value(#{bname},#{bauthor},#{btime},#{btype});")//添加int addBook(BookManage bookManage);@Delete("delete from BookManage where bid = #{bid};")//删除int delBook(int bid);@Update("update bookmanage set bname=#{bname},bauthor=#{bauthor},btime=#{btime},btype=#{btype} where bid = #{bid}")//修改int updateBook(BookManage bookManage);@Select("select * from bookmanage where bid = #{bid}")//根据编号查询编号BookManage findBookById(int bid);
}

需要注意的是,由于我们统一都使用注解的方式,所以不用在编写SQL映射文件(mapper),所有的sql语句通过注解方式实现,详情请看代码,各个功能都有相应的注释。

IBookManageService和BookManageServiceImpl

同样,在com.xiongxiong包下面创建service包存放业务的接口,在service包下面新建impl包,存放的是业务接口的实现类,代码如下:

IBookManageService

package com.xiongxiong.service;import com.xiongxiong.entity.BookManage;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import java.util.List;public interface IBookManageService {//查询全部List<BookManage> findBookAll();//添加int addBook(BookManage bookManage);//删除int delBook(int bid);//修改int updateBook(BookManage bookManage);//根据编号查询编号BookManage findBookById(int bid);}

BookManageServiceImpl

package com.xiongxiong.service.impl;import com.xiongxiong.dao.BookManageMapper;
import com.xiongxiong.entity.BookManage;
import com.xiongxiong.service.IBookManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@EnableTransactionManagement    //开启事务管理器
@Transactional                  //配置事务
@Service                        //证明这是一个service层
public class BookManageServiceImpl implements IBookManageService {//Dao层的接口@AutowiredBookManageMapper bookManageMapper;@Overridepublic List<BookManage> findBookAll() {return bookManageMapper.findBookAll();}@Overridepublic int addBook(BookManage bookManage) {return bookManageMapper.addBook(bookManage);}@Overridepublic int delBook(int bid) {return bookManageMapper.delBook(bid);}@Overridepublic int updateBook(BookManage bookManage) {return bookManageMapper.updateBook(bookManage);}@Overridepublic BookManage findBookById(int bid) {return bookManageMapper.findBookById(bid);}}

需要注意的是,在实现类中,需要添加开启事务@EnableTransactionManagement和配置事务@Transactional的注解。

在com.xiongxiong下面创建包web,该包中放控制器,在控制器中实现增删改查的功能以及页面之间的跳转,代码如下:

package com.xiongxiong.web;import com.xiongxiong.entity.BookManage;
import com.xiongxiong.service.IBookManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.List;@Controller
public class IndexController {//创建Service的对象@Autowiredprivate IBookManageService bookManageService;//默认进入首页@RequestMapping("default")public String index(Model model) {List<BookManage> bookManageList =bookManageService.findBookAll();model.addAttribute("bookManageList",bookManageList);return "index";}//删除@RequestMapping("delBook")public String delBook(Model model, int bid) {bookManageService.delBook(bid);index(model);return "index";}//添加@RequestMapping("addBook")public String addBook(BookManage bookManage, Model model) {bookManageService.addBook(bookManage);index(model);return "index";}//跳转到添加的页面@RequestMapping("add")public String add() {return "addBook";}}

05

创建jsp页面

在main下面新建文件夹webapp,在该文件夹中新建jsp页面就可以,其中我还用到了jquery(下面有下载链接)的环境,放在js目录下面,目录结构如下所示:

jquery-1.12.4.js:点此下载

bootstrap.js:点此下载

创建index.jsp,用来展示查询展示所有数据,查询的功能在控制器IndexController中实现的,下面是代码:

<%--Created by IntelliJ IDEA.User: 24519Date: 2021/1/20Time: 10:38To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head><title>首页</title>
</head>
<body>
<h1>图书信息</h1>
<table border="1"><tr><td>图书名称</td><td>图书作者</td><td>购买时间</td><td>图书分类</td><td>操作</td></tr><c:forEach items="${bookManageList}" var="book"><tr><td>${book.bname}</td><td>${book.bauthor}</td><td><f:formatDate value="${book.btime}" pattern="yyyy-MM-dd"></f:formatDate></td><td><c:if test="${book.btype==1}">计算机/软件</c:if><c:if test="${book.btype==2}">小说/文摘</c:if><c:if test="${book.btype==3}">杂项</c:if></td><td><a href="delBook?bid=${book.bid}">删除</a></td></tr></c:forEach></table>
<a href="addBook.jsp" style="color:red">新增图书信息</a>
<script src="js/jquery-1.12.4.js" type="text/javascript"></script>
<script type="text/javascript">$(function () {$("tr:even").css("background", "green");$("tr:first").css("background", "blue");});
</script>
</body>
</html>

创建添加信息的jsp页面addBook.jsp,主要用来添加信息,添加的功能在控制器IndexController中实现,还实现了必要的表单验证,下面是代码:

<%--Created by IntelliJ IDEA.User: 24519Date: 2021/1/20Time: 11:35To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>新增图书信息</h1>
<form action="addBook" method="post">图书名称:<input type="text" name="bname"/><br/>图书作者:<input type="text" name="bauthor"/><br/>购买日期:<input type="text" name="btime"/><br/>图书类别:<select name="btype"><option value="0">选择所属分类</option><option value="1">计算机/软件</option><option value="2">小说/文摘</option><option value="3">杂项</option></select><br/><input type="submit" value="增加图书"/>
</form>
<script src="js/jquery-1.12.4.js" type="text/javascript"></script>
<script type="text/javascript">$(function () {$("input[type='submit']").click(function () {var bname = $("input[name='bname']").val();var bauthor = $("input[name='bauthor']").val();var btime = $("input[name='btime']").val();var btype = $("input[name='btype']").val();if (bname == "") {alert("图书名称不能为空");return false;}if (bauthor == "") {alert("图书作者不能为空");return false;}var dateinfo = /^[0-9]{4}-[0-1]{1}[0-9]{1}-[0-3]{1}[0-9]{1}/;if (!dateinfo.test(btime)) {alert("日期格式不正确");return false;}if (btype == 0) {alert("图书分类需要选择");return false;}});});
</script>
</body>
</html>

然后启动,运行,运行结果如下:

控制台日志如下:

日志文件book.log:

数据库脚本:

/*
SQLyog Professional v12.08 (32 bit)
MySQL - 5.5.27 : Database - schooldb
*********************************************************************
*//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`schooldb` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `schooldb`;/*Table structure for table `bookmanage` */DROP TABLE IF EXISTS `bookmanage`;CREATE TABLE `bookmanage` (`bid` int(11) NOT NULL AUTO_INCREMENT,`bname` varchar(40) NOT NULL,`bauthor` varchar(40) NOT NULL,`btime` datetime NOT NULL,`btype` int(11) NOT NULL,PRIMARY KEY (`bid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;/*Data for the table `bookmanage` */insert  into `bookmanage`(`bid`,`bname`,`bauthor`,`btime`,`btype`) values (1,'三国演义','罗贯中','2021-09-08 00:00:00',2),(2,'水浒传','施耐庵','2021-09-08 00:00:00',2),(3,'狂人日记','魯迅','2021-09-08 00:00:00',3),(5,'永乐大典','鲁迅','2020-09-08 00:00:00',2);/*Table structure for table `dept` */DROP TABLE IF EXISTS `dept`;CREATE TABLE `dept` (`did` int(11) NOT NULL AUTO_INCREMENT,`dname` varchar(50) DEFAULT NULL,PRIMARY KEY (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;/*Data for the table `dept` */insert  into `dept`(`did`,`dname`) values (1,'测试部'),(2,'销售部'),(3,'服务部'),(4,'开发部'),(5,'运营部');/*Table structure for table `dog` */DROP TABLE IF EXISTS `dog`;CREATE TABLE `dog` (`did` int(11) NOT NULL AUTO_INCREMENT,`dname` varchar(50) DEFAULT NULL,`dpass` varchar(50) DEFAULT NULL,PRIMARY KEY (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=1785770044 DEFAULT CHARSET=utf8;/*Data for the table `dog` */insert  into `dog`(`did`,`dname`,`dpass`) values (1,'111','111'),(2,'旺财','123'),(3,'幸福','111'),(4,'财旺','123'),(5,'进钱','111'),(6,'富贵','123'),(1785770043,'黑虎','123');/*Table structure for table `emp` */DROP TABLE IF EXISTS `emp`;CREATE TABLE `emp` (`eid` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',`ename` varchar(50) DEFAULT NULL COMMENT '姓名',`epass` varchar(50) DEFAULT NULL COMMENT '密码',`edid` int(11) DEFAULT NULL COMMENT '所在部门编号',PRIMARY KEY (`eid`),KEY `fk_deptid` (`edid`),CONSTRAINT `fk_deptid` FOREIGN KEY (`edid`) REFERENCES `dept` (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;/*Data for the table `emp` */insert  into `emp`(`eid`,`ename`,`epass`,`edid`) values (1,'王伟','111',1),(2,'张王','111',1),(4,'张三','111',4),(6,'张方仪','111',1),(7,'张坤鹏','111',1),(9,'翟选浩','123',1),(10,'季淑琦','111',1),(11,'袁康凯','111',1),(12,'丁长琨','111',1),(33,'老赵','123',1),(34,'老王','123',1),(35,'老李','123',1),(36,'小贼','123',1),(37,'老8','123',1);/*Table structure for table `financingproduct` */DROP TABLE IF EXISTS `financingproduct`;CREATE TABLE `financingproduct` (`id` varchar(10) NOT NULL,`Risk` int(11) NOT NULL,`Income` varchar(10) NOT NULL,`SaleStarting` datetime NOT NULL,`SaleEnd` datetime DEFAULT NULL,`End` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*Data for the table `financingproduct` */insert  into `financingproduct`(`id`,`Risk`,`Income`,`SaleStarting`,`SaleEnd`,`End`) values ('1',1,'5.68%','2020-04-09 00:00:00','2021-05-09 00:00:00','2029-09-08 00:00:00'),('2',3,'5.68%','2020-04-09 00:00:00','2021-05-09 00:00:00','2029-09-08 00:00:00'),('3',2,'5.3%','2020-04-09 00:00:00','2021-05-09 00:00:00','2029-09-08 00:00:00'),('4',2,'6.8%','2020-04-09 00:00:00','2021-05-09 00:00:00','2029-09-08 00:00:00'),('5',1,'4.98%','2020-04-09 00:00:00','2021-05-09 00:00:00','2029-09-08 00:00:00');/*Table structure for table `student` */DROP TABLE IF EXISTS `student`;CREATE TABLE `student` (`sid` int(11) NOT NULL AUTO_INCREMENT,`sname` varchar(50) DEFAULT NULL,`sphone` varchar(50) DEFAULT NULL,`spass` varchar(50) DEFAULT NULL,`saddress` varchar(50) DEFAULT NULL,`sage` int(11) DEFAULT NULL,PRIMARY KEY (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;/*Data for the table `student` */insert  into `student`(`sid`,`sname`,`sphone`,`spass`,`saddress`,`sage`) values (1,'张三','15066675713','111','普通',11),(2,'李四','15066675713','222','普通',20),(3,'admin','15066675713','333','管理员',66),(4,'test','15066675713','111','普通',20),(5,'张先生','150','111','普通',12),(6,'张先生','150','111','普通',12),(7,'张先生','150','111','普通',12),(8,'张先生','150','111','普通',12),(9,'张先生','150','111','普通',12),(10,'张先生','150','111','普通',12),(11,'张先生','150','111','普通',12),(12,'张先生','150','111','普通',12),(13,'张先生','150','111','济南',12),(14,'张先生','150','111','普通',12),(15,'张先生','150','111','普通',12),(16,'张先生','150','111','普通',12),(17,'张先生','150','111','普通',12),(18,'张先生','150','111','普通',12),(19,'张先生','150','111','普通',12),(20,'李先生','160','111','普通',13);/*Table structure for table `teacher` */DROP TABLE IF EXISTS `teacher`;CREATE TABLE `teacher` (`tid` int(11) NOT NULL AUTO_INCREMENT,`tname` varchar(50) DEFAULT NULL,`tpass` varchar(50) DEFAULT NULL,`tage` int(11) DEFAULT NULL,`tjob` varchar(50) DEFAULT NULL,PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=805760409 DEFAULT CHARSET=utf8;/*Data for the table `teacher` */insert  into `teacher`(`tid`,`tname`,`tpass`,`tage`,`tjob`) values (1,'张老师','123',25,'数学'),(2,'王老师','123',36,'语文'),(3,'马老师','123',90,'武术'),(4,'高老师','123',32,'外语'),(5,'赵老师','123',24,'体育'),(6,'钱老师','123',36,'未安排'),(7,'钱老师','123',36,'未安排'),(8,'钱老师','123',36,'未安排'),(9,'钱老师','123',36,'未安排'),(10,'钱老师','123',36,'未安排'),(11,'钱老师','123',36,'未安排'),(12,'钱老师','123',36,'未安排'),(13,'钱老师','123',36,'未安排'),(14,'钱老师','123',36,'未安排'),(15,'钱老师','123',36,'未安排'),(16,'钱老师','123',36,'未安排'),(17,'钱老师','123',36,'未安排'),(805760404,'路老师','123',56,'忽悠学'),(805760405,'路老师','123',56,'忽悠学'),(805760406,'翟老师','123456',56,'化学'),(805760407,'贾老师','123456',56,'物理'),(805760408,'潘老师','123456',56,'金融学');/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

点分享

点点赞

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<table/>默认适应内容宽度造成滚动条不显示的解决方法

一、现象重现 <html><head></head><body> <table style"width: 100%;"> <tbody> <tr> <td style"width: 50%;overflow-x:auto"> <pre> 瞎子打灯笼一个盲人到亲戚家做客&#xff0c;天黑后&#xf…

java中,如何实现输入一个正整数,并将这个数字反转输出,比如输入123,输出321

如题所示&#xff0c;在java中如何实现输入一个正整数&#xff0c;然后将这个正整数反着输出来&#xff0c;代码如下&#xff1a; public static void test7(){System.out.println("请输入一个正整数&#xff1a;");Scanner sc new Scanner(System.in);int num sc…

asp.net core 1.1 项目升级至 asp.net core 2.0 preview 2

这两天把一个 asp.net core 1.1 的项目迁移到了 asp.net core 2.0 preview 2 &#xff0c;在这篇随笔中记录一下。 如果项目在有 global.json 文件&#xff0c;需要删除或修改为 .net 2.0 preview 2 的 sdk 版本号。 对于类库项目的 .csproj&#xff0c;需要把 TagetFramewo…

JSP的<c:foreach/>标签只输出一次标签体内容的坑

一、场景复现 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String[] arr{"a","b","c","d"}; request.setAttribute("arr", arr); %><!DOCTYPE HT…

springboot访问jsp页面变成直接下载?

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。前言大家在写springboot的时候不知道你们遇没遇到过这样的问题&#xff0c;当我们满怀信心的在浏览器中输入&#xff1a;localhost://8080/default&#xff0c;然后回车的时候&#xff0c;期待的页…

ASP.NET WebAPI 中的参数绑定

当 WebAPI 调用 Controller 上的方法时&#xff0c; 必须为其参数赋值&#xff0c; 这个过程就是参数绑定。 本文介绍 WebAPI 如何绑定参数&#xff0c; 以及如何进行自定义。 WebAPI 默认使用下面的规则进行参数绑定&#xff1a; 简单类型&#xff0c; WebAPI 尝试从 URL 中…

<table/>设置列宽度无效的问题

一、场景重现 <html> <head><title>测试</title><style type"text/css">.table {table-layout: fixed;}</style> </head> <body> <div style"width: 100%"><table class"table" styl…

公众号一年能有多少收入?

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。前言由于坚持日更公众号也有一年左右了&#xff0c;好多人问我你这公众号一年到底能收入多少啊&#xff1f;值得你花那么多的时间去摆弄吗&#xff1f;今天我就来说说我这公众号&#xff0c;一年到…

SpringBootAdmin客户端接入

只有网关微服务有方框中的内容&#xff0c;其他微服务没有

ssl初一组周六模拟赛【2018.5.12】(期中)

前言 这周竟然没有奶死自己&#xff0c;成为模拟赛第一个AK的&#xff08;然而第一题数据错了所以这次放加上第一题的分&#xff09; 先说一下成绩&#xff1a; 姓名成绩wyc400xjq290xxy255lrz225hzb205zyc190hjq180lw140 期中总结 正题 题目1&#xff1a;ssl2413 排名【…

Java自动化邮件中发送图表(一)

一、邮件需求 邮件中需要展示柱状图、折线图和饼图等图表数据。如图&#xff1a; 二、解决方案 将图表转成图片&#xff0c;采用html邮件文本&#xff0c;使用base64编码图片发送邮件。 将图表导出成图片有三种方式&#xff1a; &#xff08;1&#xff09;JFreeChart 优点…

springboot+mybatis-plus实例demo

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。前言故事还得从一次微信通话说起……一个夜深人静的晚上&#xff0c;正在电脑前看书&#xff0c;突然&#xff0c;放在旁边的手机响了起来&#xff0c;原来是一个朋友打的微信电话。“你在干嘛呢&a…

分布式事务,EventBus 解决方案:CAP【中文文档】

前言 很多同学想对CAP的机制以及用法等想有一个详细的了解&#xff0c;所以花了将近两周时间写了这份中文的CAP文档&#xff0c;对 CAP 还不知道的同学可以先看一下 .NET Core 事件总线,分布式事务解决方案&#xff1a;CAP。 本文档为 CAP 文献&#xff08;Wiki&#xff09;&…

POJ1330-Nearest Common Ancestors【tarjan,LCA】

正题 题目链接&#xff1a; http://poj.org/problem?id1330 题目大意 就是给出一棵树&#xff0c;求LCA&#xff08;最近公共祖先&#xff09; 解题思路 用tarjan求LCA&#xff0c;这里给出tarjan算法 代码 #include<cstdio> #include<iostream> using nam…

Java自动化邮件中发送图表(二)之JFreeChart

一、JFreeChart库 JFreeChart是JAVA平台上的一个开放的图表绘制类库。 JFreeChart可生成饼图&#xff08;pie charts&#xff09;、柱状图&#xff08;bar charts&#xff09;、散点图&#xff08;scatter plots&#xff09;、时序图&#xff08;time series&#xff09;、甘…

springboot点击运行没反应,什么都不显示的解决方式

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。最近这段时间一直在看开源框架&#xff0c;自己慢慢的琢磨&#xff0c;终于将jeecgboot环境搭建起来&#xff0c;并且成功的跑起来了demo&#xff0c;在此过程中&#xff0c;很明显的能感觉到自己进…