老师,我的删除功能有问题
来源:6-7 实现图书删除功能
慕仰7036876
2020-11-27 11:58:08
# 具体遇到的问题
我的删除功能一切正常,但就是不删除,也显示删除成功,也打了断点,后台确实在运行。但是刷新页面之后就是删不了,数据库还是删不了,不知道为什么
# 报错信息的截图
# 相关课程内容截图
# 尝试过的解决思路和结果
# 粘贴全部相关代码,切记添加代码注释(请勿截图)
在这里输入代码,可通过选择【代码语言】突出显示
package com.hugong.reader.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hugong.reader.entity.Book;
import com.hugong.reader.entity.Evaluation;
import com.hugong.reader.entity.MemberReadState;
import com.hugong.reader.mapper.BookMapper;
import com.hugong.reader.mapper.EvaluationMapper;
import com.hugong.reader.mapper.MemberReadStateMapper;
import com.hugong.reader.service.BookService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@Service("bookService")
@Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
public class BookServiceImpl implements BookService {
@Resource
private BookMapper bookMapper;
@Resource
private BookService bookService;
@Resource
private MemberReadStateMapper memberReadStateMapper;
@Resource
private EvaluationMapper evaluationMapper;
//此为接口实现类
public IPage<Book> paging(Long categoryId, String order, Integer page, Integer rows) {
Page<Book> p = new Page<Book>(page, rows);
QueryWrapper<Book> queryWrapper = new QueryWrapper<Book>();
if(categoryId != null && categoryId != -1){
queryWrapper.eq("category_id", categoryId);
}
if(order != null){
if(order.equals("quantity")){
queryWrapper.orderByDesc("evaluation_quantity");
}else if(order.equals("score")){
queryWrapper.orderByDesc("evaluation_score");
}
}
IPage<Book> pageObject = bookMapper.selectPage(p, queryWrapper);
return pageObject;
}
/**
* 根据图书编号查询图书对象
* @param bookId 图书编号
* @return 图书对象
*/
public Book selectById(Long bookId){
Book book = bookMapper.selectById(bookId);
return book;
}
/**
* 更新图书评价/评价数量
*/
@Transactional
public void updateEvaluation() {
bookMapper.updateEvaluation();
}
/**
*
* @param book
* @return
*/
@Transactional
public Book createBook(Book book) {
bookMapper.insert(book);
return book;
}
/**
* 更新图书
* @param book 新图书数据
* @return 更新后的数据
*/
@Transactional
public Book updateBook(Book book) {
bookMapper.updateById(book);
return book;
}
/**
* 删除图书及相关数据
* @param bookId 图书编号
*/
@Transactional
public void deleteBook(Long bookId) {
Book book = bookMapper.selectById(bookId);
QueryWrapper<MemberReadState> mrsQueryWrapper = new QueryWrapper<MemberReadState>();
mrsQueryWrapper.eq("book_id", bookId);
memberReadStateMapper.delete(mrsQueryWrapper);
QueryWrapper<Evaluation> evaluationQueryWrapper = new QueryWrapper<Evaluation>();
evaluationQueryWrapper.eq("book_id", bookId);
evaluationMapper.delete(evaluationQueryWrapper);
}
}package com.hugong.reader.controller.management;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hugong.reader.entity.Book;
import com.hugong.reader.service.BookService;
import com.hugong.reader.service.exception.BussinessException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/management/book")
public class MBookController {
@Resource
private BookService bookService;
@GetMapping("/index.html")
public ModelAndView showBook() {
return new ModelAndView("/management/book");
}
/**
* wangEditor文件上传
*
* @param file 上传文件
* @param request 原生请求对象
* @return
* @throws IOException
*/
@PostMapping("/upload")
@ResponseBody
public Map upload(@RequestParam("img") MultipartFile file, HttpServletRequest request) throws IOException {
//得到上传目录
String uploadPath = request.getServletContext().getResource("/").getPath() + "/upload/";
uploadPath = URLDecoder.decode(uploadPath, "utf-8");
//文件名
String fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
//扩展名
String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
//保存文件到upload目录
file.transferTo(new File(uploadPath + fileName + suffix));
Map result = new HashMap();
result.put("errno", 0);
result.put("data", new String[]{"/upload/" + fileName + suffix});
return result;
}
@PostMapping("/create")
@ResponseBody
public Map create(Book book) {
Map result = new HashMap();
try {
book.setEvaluationQuantity(0);
book.setEvaluationScore(0f);
Document doc = Jsoup.parse(book.getDescription());
Element img = doc.select("img").first();//获取到图书详情第一图的元素对象
String cover = img.attr("src");
book.setCover(cover);
bookService.createBook(book);
result.put("code", 0);
result.put("mag", "success");
} catch (BussinessException ex) {
ex.printStackTrace();
result.put("code", ex.getCode());
result.put("msg", ex.getMsg());
}
return result;
}
@GetMapping("/list")
@ResponseBody
public Map list(Integer page, Integer limit) {
if (page == null) {
page = 1;
}
if (limit == null) {
limit = 10;
}
IPage<Book> pageObject = bookService.paging(null, null, page, limit);
Map result = new HashMap();
result.put("code", 0);
result.put("msg", "success");
result.put("data", pageObject.getRecords());//当前页面数据
result.put("count", pageObject.getTotal());//未分页时总共有多少行
return result;
}
@GetMapping("/id/{id}")
@ResponseBody
public Map selectById(@PathVariable("id") Long bookId) {
Book book = bookService.selectById(bookId);
Map result = new HashMap();
result.put("code", 0);
result.put("msg", "success");
result.put("data", book);
return result;
}
/**
* 更新图书
* @param book 新图书数据
* @return 以json形式返回的数据
*/
@PostMapping("/update")
@ResponseBody
public Map updateBook(Book book) {
Map result = new HashMap();
try {
Book rawBook = bookService.selectById(book.getBookId());
rawBook.setBookName(book.getBookName());
rawBook.setSubTitle(book.getSubTitle());
rawBook.setAuthor(book.getAuthor());
rawBook.setCategoryId(book.getCategoryId());
rawBook.setDescription(book.getDescription());
Document doc = Jsoup.parse(book.getDescription());
String cover = doc.select("img").first().attr("src");
rawBook.setCover(cover);
bookService.updateBook(rawBook);
result.put("code", 0);
result.put("msg", "success");
} catch (BussinessException ex) {
ex.printStackTrace();
result.put("code", ex.getCode());
result.put("msg", ex.getMsg());
}
return result;
}
@GetMapping("/delete/{id}")
@ResponseBody
public Map deleteBook(@PathVariable("id") Long bookId){
Map result = new HashMap();
try {
bookService.deleteBook(bookId);
result.put("code", 0);
result.put("msg", "success");
}catch(BussinessException ex){
result.put("code", ex.getCode());
result.put("msg", ex.getMsg());
}
return result;
}
}<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书管理功能</title>
<style>
#dlgBook{
padding: 10px
}
</style>
<link rel="stylesheet" href="/resources/layui/css/layui.css">
<script src="/resources/wangEditor.min.js"></script>
<script type="text/html" id="toolbar">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" id="btnAdd" onclick="showCreate()">添加</button>
</div>
</script>
</head>
<body>
<div class="layui-container">
<blockquote class="layui-elem-quote">图书列表</blockquote>
<!-- 数据表格 -->
<table id="grdBook" lay-filter="grdBook"></table>
</div>
<!--表单内容-->
<div id="dialog" style="padding: 10px;display: none">
<form class="layui-form" >
<div class="layui-form-item">
<!-- 图书类别 -->
<select id="categoryId" name="categoryId" lay-verify="required" lay-filter=
"categoryId">
<option value=""></option>
<option value="1">前端</option>
<option value="2">后端</option>
<option value="3">测试</option>
<option value="4">产品</option>
</select>
</div>
<div class="layui-form-item">
<!-- 书名 -->
<input type="text" id="bookName" name="bookName" required lay-verify="required" placeholder="请输入书名"
autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item">
<!-- 子标题 -->
<input type="text" id="subTitle" name="subTitle" required lay-verify="required" placeholder="请输入子标题"
autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item">
<!-- 作者 -->
<input type="text" id="author" name="author" required lay-verify="required" placeholder="请输入作者信息"
autocomplete="off" class="layui-input">
</div>
<div style="margin-top: 30px;font-size: 130%">图书介绍(默认第一图将作为图书封面)</div>
<div class="layui-form-item" >
<!-- wangEditor编辑器 -->
<div id="editor" style="width: 100%">
</div>
</div>
<!-- 图书编号 -->
<input id="bookId" type="hidden">
<!-- 当前表单操作类型,create代表新增 update代表修改 -->
<input id="optype" type="hidden">
<div class="layui-form-item" style="text-align: center">
<!-- 提交按钮 -->
<button class="layui-btn" lay-submit="" lay-filter="btnSubmit">立即提交</button>
</div>
</form>
</div>
<script src="/resources/layui/layui.all.js"></script>
<script>
var table = layui.table; //table数据表格对象
var $ = layui.$; //jQuery
var editor = null; //wangEditor富文本编辑器对象
//初始化图书列表
table.render({
elem: '#grdBook' //指定div
, id : "bookList" //数据表格id
, toolbar: "#toolbar" //指定工具栏,包含新增添加
, url: "/management/book/list" //数据接口
, page: true //开启分页
, cols: [[ //表头
{field: 'bookName', title: '书名', width: '300'}
, {field: 'subTitle', title: '子标题', width: '200'}
, {field: 'author', title: '作者', width: '200'}
, {type: 'space', title: '操作', width: '200' , templet : function(d){
//为每一行表格数据生成"修改"与"删除"按钮,并附加data-id属性代表图书编号
return "<button class='layui-btn layui-btn-sm btn-update' data-id='" + d.bookId + "' data-type='update' onclick='showUpdate(this)'>修改</button>" +
"<button class='layui-btn layui-btn-sm btn-delete' data-id='" + d.bookId + "' onclick='showDelete(this)'>删除</button>";
}
}
]]
});
//显示更新图书对话框
//obj对应点击的"修改"按钮对象
function showUpdate(obj){
//弹出"编辑图书"对话框
layui.layer.open({
id: "dlgBook", //指定div
title: "编辑图书", //标题
type: 1,
content: $('#dialog').html(), //设置对话框内容,复制自dialog DIV
area: ['820px', '730px'], //设置对话框宽度高度
resize: false //是否允许调整尺寸
})
var bookId = $(obj).data("id"); //获取"修改"按钮附带的图书编号
$("#dlgBook #bookId").val(bookId); //为表单隐藏域赋值,提交表单时用到
editor = new wangEditor('#dlgBook #editor'); //初始化富文本编辑器
editor.customConfig.uploadImgServer = '/management/book/upload' //设置图片上传路径
editor.customConfig.uploadFileName = 'img'; //图片上传时的参数名
editor.create(); //创建wangEditor
$("#dlgBook #optype").val("update"); //设置当前表单提交时提交至"update"更新地址
//发送ajax请求,获取对应图书信息
$.get("/management/book/id/" + bookId , {} , function(json){
//文本框回填已有数据
$("#dlgBook #bookName").val(json.data.bookName);//书名
$("#dlgBook #subTitle").val(json.data.subTitle); //子标题
$("#dlgBook #author").val(json.data.author);//作者
$("#dlgBook #categoryId").val(json.data.categoryId); //分类选项
editor.txt.html(json.data.description); //设置图文内容
layui.form.render();//重新渲染LayUI表单
} , "json")
}
//显示新增图书对话框
function showCreate(){
//弹出"新增图书"对话框
layui.layer.open({
id: "dlgBook",
title: "新增图书",
type: 1,
content: $('#dialog').html(),
area: ['820px', '730px'],
resize: false
})
//初始化wangEditor
editor = new wangEditor('#dlgBook #editor');
editor.customConfig.uploadImgServer = '/management/book/upload';//设置图片上传地址
editor.customConfig.uploadFileName = 'img';//设置图片上传参数
editor.create();//创建wangEditor
layui.form.render(); //LayUI表单重新
$("#dlgBook #optype").val("create");//设置当前表单提交时提交至"create"新增地址
};
//对话框表单提交
layui.form.on('submit(btnSubmit)', function(data){
//获取表单数据
var formData = data.field;
//判断是否包含至少一副图片,默认第一图作为封面显示
var description = editor.txt.html();
if(description.indexOf("img") == -1){
layui.layer.msg('请放置一副图片作为封面');
return false;
}
//获取当前表单要提交的地址
//如果是新增数据则提交至create
//如果是更新数据则提交至update
var optype = $("#dlgBook #optype").val();
if(optype == "update"){
//更新数据时,提交时需要附加图书编号
formData.bookId=$("#dlgBook #bookId").val();
}
//附加图书详细描述的图文html
formData.description = description;
//向服务器发送请求
$.post("/management/book/" + optype , formData , function(json){
if(json.code=="0"){
//处理成功,关闭对话框,刷新列表,提示操作成功
layui.layer.closeAll();
table.reload('bookList');
layui.layer.msg('数据操作成功,图书列表已刷新');
}else{
//处理失败,提示错误信息
layui.layer.msg(json.msg);
}
} ,"json")
return false;
});
//删除图书
function showDelete(obj){
//获取当前点击的删除按钮中包含的图书编号
var bookId = $(obj).data("id");
//利用layui的询问对话框进行确认
layui.layer.confirm('确定要执行删除操作吗?', {icon: 3, title:'提示'}, function(index){
//确认按钮后发送ajax请求,包含图书编号
$.get("/management/book/delete/" + bookId, {}, function (json) {
if(json.code=="0"){
//删除成功刷新表格
table.reload('bookList');
//提示操作成功
layui.layer.msg('数据操作成功,图书列表已刷新');
//关闭对话框
layui.layer.close(index);
}else{
//处理失败,提示错误信息
layui.layer.msg(json.msg);
}
}, "json");
});
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>慕课书评网数据管理系统</title>
<link rel="stylesheet" href="/resources/layui/css/layui.css">
</head>
<body class="layui-layout-body">
<!-- Layui后台布局CSS -->
<div class="layui-layout layui-layout-admin">
<!--头部导航栏-->
<div class="layui-header">
<!--系统标题-->
<div class="layui-logo" style="font-size:18px">慕课书评网数据管理系统</div>
<!--右侧当前用户信息-->
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item">
<a href="javascript:void(0)">
<!--图标-->
<span class="layui-icon layui-icon-user" style="font-size: 20px">
</span>
<!--用户信息-->
admin
</a>
</li>
<!--注销按钮-->
<li class="layui-nav-item"><a href="/management/logout">注销</a></li>
</ul>
</div>
<!--左侧菜单栏-->
<div class="layui-side layui-bg-black">
<!--可滚动菜单-->
<div class="layui-side-scroll">
<!--可折叠导航栏-->
<ul class="layui-nav layui-nav-tree">
<li class="layui-nav-item layui-nav-itemed">
<a href="javascript:void(0)">数据管理</a>
<dl class="layui-nav-child module" data-node-id="xxx">
<dd><a href="/management/book/index.html" target="ifmMain">图书管理</a></dd>
</dl>
</li>
</ul>
</div>
</div>
<!--主体部分采用iframe嵌入其他页面-->
<div class="layui-body" style="overflow-y: hidden">
<iframe name="ifmMain" style="border: 0px;width: 100%;height: 100%" src="/management/book/index.html"></iframe>
</div>
<!--版权信息-->
<div class="layui-footer">
Copyright © imooc. All Rights Reserved.
</div>
</div>
<!--LayUI JS文件-->
<script src="/resources/layui/layui.all.js"></script>
<script>
//将所有功能根据parent_id移动到指定模块下
layui.$(".function").each(function () {
var func = layui.$(this);
var parentId = func.data("parent-id");
layui.$("dl[data-node-id=" + parentId + "]").append(func);
});
//刷新折叠菜单
layui.element.render('nav');
</script>
</body>
</html>
3回答
同学你好,在BookServiceImpl类中的deleteBook()方法中,应该是bookMapper.deleteById(bookId);而同学写成了查询语句,如:
建议同学修改一下再试试。
祝学习愉快!
慕仰7036876
提问者
2020-11-27
12:06:39 DEBUG {http-nio-8080-exec-5} o.m.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6e38235a]
12:06:39 DEBUG {http-nio-8080-exec-5} o.m.spring.SqlSessionUtils - Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6e38235a] from current transaction
12:06:39 DEBUG {http-nio-8080-exec-5} c.h.r.m.E.delete - ==> Preparing: DELETE FROM evaluation WHERE (book_id = ?)
12:06:39 DEBUG {http-nio-8080-exec-5} c.h.r.m.E.delete - ==> Parameters: 46(Long)
12:06:39 DEBUG {http-nio-8080-exec-5} c.h.r.m.E.delete - <== Updates: 0
12:06:39 DEBUG {http-nio-8080-exec-5} o.m.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6e38235a]
12:06:39 DEBUG {http-nio-8080-exec-5} o.m.spring.SqlSessionUtils - Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6e38235a]
12:06:39 DEBUG {http-nio-8080-exec-5} o.m.spring.SqlSessionUtils - Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6e38235a]
12:06:39 DEBUG {http-nio-8080-exec-5} o.m.spring.SqlSessionUtils - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6e38235a]
12:06:39 DEBUG {http-nio-8080-exec-5} o.s.j.d.DataSourceTransactionManager - Initiating transaction commit
12:06:39 DEBUG {http-nio-8080-exec-5} o.s.j.d.DataSourceTransactionManager - Committing JDBC transaction on Connection [com.mysql.jdbc.JDBC4Connection@1218fe9d]
12:06:39 DEBUG {http-nio-8080-exec-5} o.s.j.d.DataSourceTransactionManager - Releasing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1218fe9d] after transaction
12:06:39 DEBUG {http-nio-8080-exec-5} o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Using 'application/json', given [application/json, text/javascript, */*;q=0.01] and supported [application/json, application/*+json]
12:06:39 DEBUG {http-nio-8080-exec-5} o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Writing [{msg=success, code=0}]
12:06:39 DEBUG {http-nio-8080-exec-5} o.s.w.s.DispatcherServlet - Completed 200 OK
12:06:39 DEBUG {http-nio-8080-exec-6} o.s.w.s.DispatcherServlet - GET "/management/book/list?page=5&limit=10", parameters={masked}
12:06:39 DEBUG {http-nio-8080-exec-6} o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to com.hugong.reader.controller.management.MBookController#list(Integer, Integer)
12:06:39 DEBUG {http-nio-8080-exec-6} o.m.spring.SqlSessionUtils - Creating a new SqlSession
12:06:39 DEBUG {http-nio-8080-exec-6} o.m.spring.SqlSessionUtils - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@8f96bab]
12:06:39 DEBUG {http-nio-8080-exec-6} o.s.j.d.DataSourceUtils - Fetching JDBC Connection from DataSource
12:06:39 DEBUG {http-nio-8080-exec-6} o.m.s.t.SpringManagedTransaction - JDBC Connection [com.mysql.jdbc.JDBC4Connection@1218fe9d] will be managed by Spring
12:06:39 DEBUG {http-nio-8080-exec-6} c.b.m.e.p.p.o.JsqlParserCountOptimize - JsqlParserCountOptimize sql=SELECT book_id,book_name,sub_title,author,cover,description,category_id,evaluation_score,evaluation_quantity FROM book
12:06:39 DEBUG {http-nio-8080-exec-6} c.h.r.m.BookMapper.selectPage - ==> Preparing: SELECT COUNT(1) FROM book
12:06:39 DEBUG {http-nio-8080-exec-6} c.h.r.m.BookMapper.selectPage - ==> Parameters:
12:06:39 DEBUG {http-nio-8080-exec-6} c.h.r.m.BookMapper.selectPage - ==> Preparing: SELECT book_id,book_name,sub_title,author,cover,description,category_id,evaluation_score,evaluation_quantity FROM book LIMIT ?,?
12:06:39 DEBUG {http-nio-8080-exec-6} c.h.r.m.BookMapper.selectPage - ==> Parameters: 40(Long), 10(Long)
12:06:39 DEBUG {http-nio-8080-exec-6} c.h.r.m.BookMapper.selectPage - <== Total: 5
12:06:39 DEBUG {http-nio-8080-exec-6} o.m.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@8f96bab]
12:06:39 DEBUG {http-nio-8080-exec-6} o.m.spring.SqlSessionUtils - Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@8f96bab]
12:06:39 DEBUG {http-nio-8080-exec-6} o.m.spring.SqlSessionUtils - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@8f96bab]
12:06:39 DEBUG {http-nio-8080-exec-6} o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Using 'application/json', given [application/json, text/javascript, */*;q=0.01] and supported [application/json, application/*+json]
12:06:39 DEBUG {http-nio-8080-exec-6} o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Writing [{msg=success, code=0, data=[Book{bookId=41, bookName='鏋舵瀯鎬濈淮鎴愰暱涔嬪井鏈嶅姟', subTitle='杞婚噺绾ч」鐩紝绯荤粺鍖栫粡楠�', author='鏇� (truncated)...]
12:06:39 DEBUG {http-nio-8080-exec-6} o.s.w.s.DispatcherServlet - Completed 200 OK
慕仰7036876
提问者
2020-11-27
控制台在我使用删除的时候,只出现了删除之后的查找语句,没有删除的sql语句
相似问题
回答 1
回答 2