基本增删改查

Posted lyle-liu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基本增删改查相关的知识,希望对你有一定的参考价值。

基本表的增删改查:
    
    1.表结构:
        CREATE TABLE `t_checkitem` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `code` varchar(16) DEFAULT NULL,
          `name` varchar(32) DEFAULT NULL,
          `sex` char(1) DEFAULT NULL,
          `age` varchar(32) DEFAULT NULL,
          `price` float DEFAULT NULL,
          `type` char(1) DEFAULT NULL COMMENT ‘查检项类型,分为检查和检验两种‘,
          `attention` varchar(128) DEFAULT NULL,
          `remark` varchar(128) DEFAULT NULL,
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8 COMMENT=‘体检检查项‘;
        
    2.前端:
         //钩子函数,VUE对象初始化完成后自动执行
            created() {
                this.findPage();
            },
            methods: {
                //编辑
                handleEdit() {
                    //表单校验
                    this.$refs[‘dataEditForm‘].validate((valid)=>{
                        if(valid){
                            //表单校验通过,发送请求
                            axios.post("/checkitem/edit.do",this.formData).then((response)=> {
                                //隐藏编辑窗口
                                this.dialogFormVisible4Edit = false;
                                if(response.data.flag){
                                    //编辑成功,弹出成功提示信息
                                    this.$message({
                                        message: response.data.message,
                                        type: ‘success‘
                                    });
                                }else{
                                    //编辑失败,弹出错误提示信息
                                    this.$message.error(response.data.message);
                                }
                            }).finally(()=> {
                                //重新发送请求查询分页数据
                                this.findPage();
                            });
                        }else{
                            //表单校验失败
                            this.$message.error("表单数据校验失败");
                            return false;
                        }
                    });
                },
                //添加
                handleAdd () {
                    //校验表单是否合法
                    this.$refs[‘dataAddForm‘].validate((valid)=>{
                        if (valid){
                            axios.post("/checkitem/add.do",this.formData).then((response)=>{
                                //隐藏新增窗口
                                this.dialogFormVisible = false;
                                if (response.data.flag){
                                    this.$message({
                                        message: response.data.message,
                                        type: ‘success‘
                                    });
                                }else {
                                    this.$message.error(response.data.message);
                                }
                            }).finally(()=>{
                                this.findPage();
                            });
                        }else {
                            this.$message.error("表单数据校验失败");
                            return false;
                        }
                    });


                },
                //分页查询
                findPage() {
                    //分页参数
                    var param = {
                        currentPage:this.pagination.currentPage,//页码
                        pageSize:this.pagination.pageSize,//每页显示的记录数
                        queryString:this.pagination.queryString//查询条件
                    };
                    //请求后台
                    axios.post("/checkitem/findPage.do",param).then((response)=> {
                        //为模型数据赋值,基于VUE的双向绑定展示到页面
                        this.dataList = response.data.rows;
                        this.pagination.total = response.data.total;
                    });

                    // axios.post("/checkitem/findAll.do").then((response)=>{
                    //     // 返回Result(flag,message,data),vue调用的时候,需要在response的后面添加一个data,然后再调用对象属性
                    //     this.dataList = response.data.data
                    //     // 提示
                    //     if(response.data.flag){
                    //         this.$message({
                    //             type:"success",
                    //             message:response.data.message
                    //         })
                    //     }else{
                    //         this.$message({
                    //             type:"error",
                    //             message:response.data.message
                    //         })
                    //     }
                    // }).catch((error)=>{
                    //
                    // })


                },
                // 重置表单
                resetForm() {
                    this.formData = {};
                },
                // 弹出添加窗口
                handleCreate() {
                    // 弹出el-dialog的对话框,即新增窗口
                    this.resetForm();
                    this.dialogFormVisible = true;
                },
                // 弹出编辑窗口
                handleUpdate(row) {
                    //alert(row.id)
                    axios.get("/checkitem/findById.do?id="+ row.id).then((response)=>{
                        if(response.data.flag){
                            //设置编辑窗口属性,dialogFormVisible4Edit为true表示显示
                            this.dialogFormVisible4Edit = true;
                            //为模型数据设置值,基于VUE双向数据绑定回显到页面
                            this.formData = response.data.data;
                        }else{
                            this.$message.error(response.data.message);
                        }
                    });
                },
                //切换页码
                handleCurrentChange(currentPage) {
                    this.pagination.currentPage=currentPage;
                    this.findPage();
                },
                // 删除
                handleDelete(row) {
                    // alert(row.id);
                    this.$confirm(‘此操作将永久删除该数据, 是否继续?‘, ‘提示‘, {
                        confirmButtonText: ‘确定‘,
                        cancelButtonText: ‘取消‘,
                        type: ‘warning‘,
                        center: true
                    }).then(() => {
                        // 选择“确定”
                        axios.get("/checkitem/delete.do?id="+row.id).then((response)=>{
                            // 定义返回Result(flag,message,data)
                            if(response.data.flag){
                                this.$message({
                                    type: ‘success‘,
                                    message: response.data.message
                                });
                            }else{
                                this.$message({
                                    type: ‘error‘,
                                    message: response.data.message
                                });
                            }
                        }).catch((error)=>{
                            this.showError(error);
                        }).finally(()=>{
                            // 刷新页面
                            this.findPage();
                        })

                    }).catch(() => {
                        // 选择“取消”
                        this.$message({
                            type: ‘info‘,
                            message: ‘已取消删除‘
                        });
                    });

                },
                showError(e){
                    // console.log(e);
                    if(e == ‘Error: Request failed with status code 403‘){
                        this.$message.error("权限不足,拒绝访问!");
                        return;
                    }else{
                        this.$message.error("未知错误!");
                        return;
                    }
                }

            }

        })
    </script>
                
    3.后端:
    
        package com.itheima.health.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.health.constant.MessageConstant;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.entity.Result;
import com.itheima.health.pojo.CheckItem;
import com.itheima.health.service.CheckItemService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @ClassName CheckItemContoller
 * @Description TODO
 * @Author ly
 * @Company 深圳黑马程序员
 * @Date 2020/2/13 16:04
 * @Version V1.0
 */
@RestController
@RequestMapping(value = "/checkitem")
public class CheckItemContoller {

    @Reference// 订阅 dubbo注解
    CheckItemService checkItemService;

    // 查询所有
    @RequestMapping(value = "/findAll")
    public Result findAll(){
        List<CheckItem> list = checkItemService.findAll();
        if(list!=null && list.size()>0){
            return new Result(true, MessageConstant.QUERY_CHECKITEM_SUCCESS,list);
        }else{
            return new Result(false, MessageConstant.QUERY_CHECKGROUP_FAIL);
        }
    }

    //新增检查项
    @RequestMapping("/add")
    @PreAuthorize(value = "hasAuthority(‘CHECKITEM_ADD‘)")
    public Result add(@RequestBody CheckItem checkItem){

        try {
            checkItemService.add(checkItem);
            return new Result(true,MessageConstant.ADD_CHECKITEM_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.ADD_CHECKITEM_FAIL);
        }


    }

    //分页查询
    @RequestMapping("/findPage")
    @PreAuthorize(value = "hasAuthority(‘CHECKITEM_QUERY‘)")
    public PageResult findPage(@RequestBody QueryPageBean queryPageBean){
        PageResult pageResult = checkItemService.pageQuery(
                queryPageBean.getCurrentPage(),
                queryPageBean.getPageSize(),
                queryPageBean.getQueryString());
        return pageResult;
    }

    //删除
    @RequestMapping("/delete")
    @PreAuthorize(value = "hasAuthority(‘CHECKITEM_DELETE123‘)")
    public Result delete(Integer id){
        try {
            checkItemService.delete(id);
            return new Result(true,MessageConstant.DELETE_CHECKITEM_SUCCESS);
        }catch (RuntimeException e){
            return new Result(false,e.getMessage());
        }catch (Exception e){
            return new Result(false, MessageConstant.DELETE_CHECKITEM_FAIL);
        }

    }
    //编辑(先根据id查询数据再编辑修改)
    // 跳转到检查项编辑页面
    @RequestMapping("/findById")
    public Result findById(Integer id){
        CheckItem checkItem = checkItemService.findById(id);
        if(checkItem!=null){
            return new Result(true,MessageConstant.QUERY_CHECKITEM_SUCCESS,checkItem);
        }
        else{
            return new Result(false,MessageConstant.QUERY_CHECKITEM_FAIL);
        }
    }

    //编辑保存
    @RequestMapping("/edit")
    @PreAuthorize(value = "hasAuthority(‘CHECKITEM_EDIT‘)")
    public Result edit(@RequestBody CheckItem checkItem){
        try {
            checkItemService.edit(checkItem);
            return new Result(true,MessageConstant.EDIT_CHECKITEM_SUCCESS);
        }catch (Exception e){
            return new Result(false,MessageConstant.EDIT_CHECKITEM_FAIL);
        }

    }





}


Service:

    package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.dao.CheckItemDao;
import com.itheima.health.entity.PageResult;
import com.itheima.health.pojo.CheckItem;
import com.itheima.health.service.CheckItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @ClassName CheckItemServiceImpl
 * @Description TODO
 * @Author ly
 * @Company 深圳黑马程序员
 * @Date 2020/2/13 16:03
 * @Version V1.0
 */
@Service // dubbo提供
@Transactional
public class CheckItemServiceImpl implements CheckItemService {

    @Autowired
    CheckItemDao checkItemDao;

    @Override
    public List<CheckItem> findAll() {
        List<CheckItem> list = checkItemDao.findAll();
        return list;
    }

    @Override
    public void add(CheckItem checkItem) {
        checkItemDao.add(checkItem);
    }

    @Override
    public PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString) {
        //初始化数据
        PageHelper.startPage(currentPage,pageSize);
        //查询返回page
        Page<CheckItem> page = checkItemDao.selectByCondition(queryString);
        //封装成PageResult
        return new PageResult(page.getTotal(),page.getResult());
    }

    @Override
    public void delete(Integer id) {
        //查询当前检查项是否和检查组关联
        long count = checkItemDao.findCountByCheckItemId(id);
        if(count > 0){
            //当前检查项被引用,不能删除
            throw new RuntimeException("当前检查项被检查组引用,不能删除");
        }
        checkItemDao.deleteById(id);
    }

    @Override
    public CheckItem findById(Integer id) {
        CheckItem checkItem = checkItemDao.findCheckItemById(id);
        return checkItem;
    }

    @Override
    public void edit(CheckItem checkItem) {
        checkItemDao.edit(checkItem);
    }
}


SQL:

    <?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.itheima.health.dao.CheckItemDao">
    <!--查询所有-->
    <select id="findAll" resultType="checkitem">
        select * from t_checkitem
    </select>

    <!--新增检查项-->
    <insert id="add" parameterType="com.itheima.health.pojo.CheckItem">
        insert into t_checkitem(code,name,sex,age,price,type,remark,attention)
        values
        (#{code},#{name},#{sex},#{age},#{price},#{type},#{remark},#{attention})
    </insert>
    <!--分页查询-->
    <select id="selectByCondition" parameterType="String" resultType="com.itheima.health.pojo.CheckItem">
        select * from t_checkitem
        <where>
            <if test="value != null and value.length > 0">
                AND code = #{value} or name = #{value}
            </if>
        </where>

    </select>

    <!--根据检查项id查询中间关系表-->
    <select id="findCountByCheckItemId" resultType="long" parameterType="int">
        select count(*) from t_checkgroup_checkitem where checkitem_id = #{checkitem_id}
    </select>
    <!--删除-->
    <delete id="deleteById" parameterType="int">
        delete from t_checkitem where id = #{id}
    </delete>

    <!--修改-->
    <!--根据检查项id查询检查项信息-->
    <select id="findCheckItemById" resultType="com.itheima.health.pojo.CheckItem" parameterType="int">
      select * from t_checkitem where id = #{id}
    </select>

    <!--编辑,如果表单中传递空值,则不更新该字段的值,仍然保留数据库表之前的值-->
    <update id="edit" parameterType="com.itheima.health.pojo.CheckItem">
        update t_checkitem
        <set>
            <if test="code!=null and code.length>0">
                code=#{code},
            </if>
            <if test="name!=null and name.length>0">
                name=#{name},
            </if>
            <if test="sex!=null and sex.length>0">
                sex=#{sex},
            </if>
            <if test="age!=null and age.length>0">
                age=#{age},
            </if>
            <if test="price!=null">
                price=#{price},
            </if>
            <if test="type!=null and type.length>0">
                type=#{type},
            </if>
            <if test="remark!=null and remark.length>0">
                remark=#{remark},
            </if>
            <if test="attention!=null and attention.length>0">
                attention=#{attention},
            </if>
        </set>
        where id = #{id}
    </update>
    <!--使用检查组id,查询检查项的集合-->
    <select id="findCheckItemListByCheckGroupId" parameterType="int" resultType="checkitem">
        SELECT * FROM t_checkitem WHERE id IN (SELECT checkitem_id FROM t_checkgroup_checkitem WHERE checkgroup_id = #{checkGroupId})
    </select>





</mapper>


多表:

  
CREATE TABLE `t_setmeal` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) DEFAULT NULL,
  `code` varchar(8) DEFAULT NULL,
  `helpCode` varchar(16) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `age` varchar(32) DEFAULT NULL,
  `price` float DEFAULT NULL,
  `remark` varchar(128) DEFAULT NULL,
  `attention` varchar(128) DEFAULT NULL,
  `img` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COMMENT=‘体检套餐‘;



CREATE TABLE `t_checkgroup` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(32) DEFAULT NULL,
  `name` varchar(32) DEFAULT NULL,
  `helpCode` varchar(32) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `remark` varchar(128) DEFAULT NULL,
  `attention` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT=‘体检检查组‘;


中间表:

    CREATE TABLE `t_setmeal_checkgroup` (
  `setmeal_id` int(11) NOT NULL DEFAULT ‘0‘,
  `checkgroup_id` int(11) NOT NULL DEFAULT ‘0‘,
  PRIMARY KEY (`setmeal_id`,`checkgroup_id`),
  KEY `checkgroup_key` (`checkgroup_id`),
  CONSTRAINT `checkgroup_key` FOREIGN KEY (`checkgroup_id`) REFERENCES `t_checkgroup` (`id`),
  CONSTRAINT `setmeal_key` FOREIGN KEY (`setmeal_id`) REFERENCES `t_setmeal` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

1.前端:
    
        <script>
        var vue = new Vue({
            el: ‘#app‘,
            data:{
                autoUpload:true,//自动上传
                imageUrl:null,//模型数据,用于上传图片完成后图片预览
                activeName:‘first‘,//添加/编辑窗口Tab标签名称
                pagination: {//分页相关属性
                    currentPage: 1,
                    pageSize:10,
                    total:100,
                    queryString:null,
                },
                dataList: [],//列表数据
                formData: {},//表单数据
                tableData:[],//添加表单窗口中检查组列表数据
                checkgroupIds:[],//添加表单窗口中检查组复选框对应id
                dialogFormVisible: false,//控制添加窗口显示/隐藏
                dialogFormVisible4Edit:false//控制编辑窗口显示/隐藏
            },
            created() {
                this.findPage();
            },
            methods: {
                //handleAvatarSuccess:文件上传成功后的钩子,response为服务端返回的值,file为当前上传的文件封装成的js对象
                // 使用ElementUI中的upload(response),此时和axios的响应(response.data)是不一样的
                handleAvatarSuccess(response, file) {
                    // 返回Result(flag,message,data)
                    if(response.flag){
                        // 赋值imageUrl(imageUrl=”七牛云空间”+UUID的方式生成文件名)
                        this.imageUrl = "http://q5vtd58my.bkt.clouddn.com/"+response.data;
                        // 赋值img属性的值(UUID生成的文件名),用于套餐保存
                        this.formData.img = response.data;
                        // 成功的提示
                        this.$message({
                            type:"success",
                            message:response.message
                        })
                    }else{
                        // 成功的提示
                        this.$message({
                            type:"error",
                            message:response.message
                        })
                    }
                },
                //上传图片之前执行
                beforeAvatarUpload(file) {
                  const isJPG = file.type === ‘image/jpeg‘;
                  const isLt2M = file.size / 1024 / 1024 < 2;
                  if (!isJPG) {
                    this.$message.error(‘上传套餐图片只能是 JPG 格式!‘);
                  }
                  if (!isLt2M) {
                    this.$message.error(‘上传套餐图片大小不能超过 2MB!‘);
                  }
                  return isJPG && isLt2M;
                },
                //添加
                handleAdd () {
                    axios.post("/setmeal/add.do?checkgroupIds="+this.checkgroupIds,this.formData).then((response)=>{
                        // 返回Result(flag,message,data)
                        if(response.data.flag){
                            // 关闭新增窗口
                            this.dialogFormVisible = false;
                            // 成功的提示
                            this.$message({
                                type:"success",
                                message:response.data.message
                            })
                        }else{
                            // 失败的提示
                            this.$message({
                                type:"error",
                                message:response.data.message
                            })
                        }
                    }).catch((error)=>{

                    }).finally(()=>{
                        // 刷新页面
                        this.findPage();
                    })
                    
                },
                //分页查询
                findPage() {
                    // 封装QueryPageBean
                    var params = {
                        "currentPage":this.pagination.currentPage,
                        "pageSize":this.pagination.pageSize,
                        "queryString":this.pagination.queryString
                    };
                    axios.post("/setmeal/findPage.do",params).then((response)=> {
                        // 响应PageResult
                        this.pagination.total = response.data.total;
                        this.dataList = response.data.rows;
                    }).catch((error)=>{

                    })
                    
                },
                // 重置表单
                resetForm() {
                    // 重置套餐表单
                    this.formData = {};
                    // 重置选项卡,始终让选项卡在第一个上
                    this.activeName = "first";
                    // 重置第二个选项卡的复选框
                    this.checkgroupIds = [];
                    // 重置图片的imageUrl
                    this.imageUrl = null;
                },
                // 弹出添加窗口
                handleCreate() {
                    //弹出窗口
                    this.dialogFormVisible = true;
                    // 重置表单
                    this.resetForm();
                    //初始化检查组
                    axios.post("/checkgroup/findAll.do").then((response)=> {
                        if (response.data.flag){
                            this.tableData = response.data.data;
                        }else{
                            this.$message.error(response.data.message);
                        }
                    }).catch((error)=>{

                    })
                    
                },
                //切换页码
                handleCurrentChange(currentPage) {
                    this.pagination.currentPage = currentPage;
                    this.findPage();
                },
                // 弹出编辑窗口
                handleUpdate(row) {
                    // alert(row.id);
                    this.dialogFormVisible4Edit = true;
                    // 重置选项卡,在第一个选项卡上
                    this.activeName = "first";
                    //回显套餐数据
                    axios.get("/setmeal/findById.do?id="+row.id).then((response)=>{
                        if (response.data.flag){
                            // 返回Result(flag,message,data),data:Setmeal对象
                            this.formData=response.data.data;
                            //回显表单中的图片
                            this.imageUrl = "http://q5vtd58my.bkt.clouddn.com/"+response.data.data.img;
                            //查询检查组列表
                            axios.get("/checkgroup/findAll.do").then((response)=>{
                                // 返回Result(flag,message,data),data:List<CheckGroup>
                                if (response.data.flag){
                                    this.tableData = response.data.data;
                                    // 3:当前套餐具有的复选框被选中
                                    axios.get("/setmeal/findCheckGroupIdsBySetmealId.do?id="+row.id).then((response)=>{
                                        this.checkgroupIds=response.data;

                                    }).catch((error)=>{
                                        this.$message.error(response.data.message);
                                    })
                                } else {
                                    this.$message.error(response.data.message);
                                }
                            }).catch((error)=>{

                            })
                        }else {
                            this.$message.error(response.data.message);
                        }
                    }).catch((error)=>{

                    })

                },
                //编辑
                handleEdit() {
                    //编辑保存
                    axios.post("/setmeal/edit.do?checkgroupIds="+this.checkgroupIds,this.formData).then((response)=> {
                        // 返回Result(flag,message,data)
                        if(response.data.flag){
                            // 关闭编辑窗口
                            this.dialogFormVisible4Edit = false;
                            // 成功提示
                            this.$message({
                                type:"success",
                                message:response.data.message
                            })
                        }else {
                            // 错误提示
                            this.$message({
                                type:"error",
                                message:response.data.message
                            })
                        }

                    }).catch((error)=>{

                    }).finally(()=>{
                        this.findPage();
                    })
                    
                },
                // 删除
                handleDelete(row) {
                    // alert(row.id);
                    this.$confirm(‘此操作将永久删除该数据, 是否继续?‘, ‘提示‘, {
                        confirmButtonText: ‘确定‘,
                        cancelButtonText: ‘取消‘,
                        type: ‘warning‘,
                        center: true
                    }).then(() => {
                        // 选择“确定”
                        axios.get("/setmeal/delete.do?id="+row.id).then((response)=>{
                            // 返回Result(flag,message,data)
                            if(response.data.flag){
                                this.$message({
                                    type: ‘success‘,
                                    message: response.data.message
                                });
                            }else{
                                this.$message({
                                    type: ‘error‘,
                                    message: response.data.message
                                });
                            }
                        }).catch((error)=>{

                        }).finally(()=>{
                            // 刷新页面
                            this.findPage();
                        })

                    }).catch(() => {
                        // 选择“取消”
                        this.$message({
                            type: ‘info‘,
                            message: ‘已取消删除‘
                        });
                    });
                    
                }
            }
        })
    </script>

后端:

    package com.itheima.health.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.health.constant.MessageConstant;
import com.itheima.health.constant.RedisPicConstant;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.entity.Result;
import com.itheima.health.pojo.Setmeal;
import com.itheima.health.service.SetmealService;
import com.itheima.health.utils.QiniuUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import redis.clients.jedis.JedisPool;

import java.util.List;
import java.util.UUID;

/**
 * @ClassName CheckItemContoller
 * @Description TODO
 * @Author ly
 * @Company 深圳黑马程序员
 * @Date 2020/2/13 16:04
 * @Version V1.0
 */
@RestController
@RequestMapping(value = "/setmeal")
public class SetmealContoller {

    @Reference// 订阅 dubbo注解
    SetmealService setmealService;

    @Autowired
    JedisPool jedisPool;

    // 上传
    @RequestMapping(value = "/upload")
    public Result upload(MultipartFile imgFile){
        try {
            // * 实现将图片存放到七牛云上
            // 参数一:字节数组(springmvc的方式),使用imgFile.getBytes()
            // 参数二:上传文件名(唯一)
            // 获取上传的文件名(1.jpg)
            String originalFilename = imgFile.getOriginalFilename();
            // 使用UUID的方式生成文件名
            String fileName = UUID.randomUUID()+originalFilename.substring(originalFilename.lastIndexOf("."));
            // * 实现将图片存放到七牛云上
            QiniuUtils.upload2Qiniu(imgFile.getBytes(),fileName);
            // (1)Redis的集合存储,上传图片的时候,将图片名称,存放到Redis中一份(key值setmeal_pic_resource),然后再上传到七牛云上
            jedisPool.getResource().sadd(RedisPicConstant.SETMEAL_PIC_RESOURCE,fileName);
            // UUID的方式生成文件名,并返回
            return new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS,fileName);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.PIC_UPLOAD_FAIL);
        }
    }


    // 保存
    @RequestMapping(value = "/add")
    public Result add(@RequestBody Setmeal setmeal, Integer[] checkgroupIds){
        try {
            setmealService.add(setmeal,checkgroupIds);
            return new Result(true, MessageConstant.ADD_SETMEAL_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.ADD_SETMEAL_FAIL);
        }
    }

    // 分页查询
    @RequestMapping(value = "/findPage")
    public PageResult findPage(@RequestBody QueryPageBean queryPageBean){

        PageResult pageResult = setmealService.findPage(queryPageBean.getCurrentPage(),
                queryPageBean.getPageSize(),
                queryPageBean.getQueryString());
        return pageResult;
    }
    // ID查询
    @RequestMapping(value = "/findById")
    public Result findById(Integer id){
        Setmeal setmeal = setmealService.findById(id);
        if(setmeal!=null){
            return new Result(true,MessageConstant.QUERY_SETMEAL_SUCCESS,setmeal);
        }
        else{
            return new Result(false,MessageConstant.QUERY_SETMEAL_FAIL);
        }
    }

    // 使用套餐ID,查询检查组ID的集合
    @RequestMapping(value = "/findCheckGroupIdsBySetmealId")
    public List<Integer> findCheckGroupIdsBySetmealId(Integer id){
        List<Integer> list = setmealService.findCheckGroupIdsBySetmealId(id);
        return list;
    }

    // 编辑保存
    @RequestMapping(value = "/edit")
    public Result edit(@RequestBody Setmeal setmeal, Integer [] checkgroupIds){
        try {
            setmealService.edit(setmeal,checkgroupIds);
            return new Result(true, MessageConstant.EDIT_SETMEAL_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.EDIT_SETMEAL_FAIL);
        }
    }

    // 删除
    @RequestMapping(value = "/delete")
    public Result delete(Integer id){
        try {
            setmealService.delete(id);
            return new Result(true, MessageConstant.DELETE_SETMEAL_SUCCESS);
        }catch (RuntimeException e) {
            e.printStackTrace();
            return new Result(false, e.getMessage());
        }catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.DELETE_SETMEAL_FAIL);
        }
    }







}


Service:

    package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.constant.MessageConstant;
import com.itheima.health.constant.RedisPicConstant;
import com.itheima.health.dao.CheckGroupDao;
import com.itheima.health.dao.CheckItemDao;
import com.itheima.health.dao.SetmealDao;
import com.itheima.health.entity.PageResult;
import com.itheima.health.pojo.Setmeal;
import com.itheima.health.service.SetmealService;
import com.itheima.health.utils.QiniuUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import redis.clients.jedis.JedisPool;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ClassName CheckItemServiceImpl
 * @Description TODO
 * @Author ly
 * @Company 深圳黑马程序员
 * @Date 2020/2/13 16:03
 * @Version V1.0
 */
@Service // dubbo提供
@Transactional
public class SetmealServiceImpl implements SetmealService {

   @Autowired
    SetmealDao setmealDao;
    // 检查组
    @Autowired
    CheckGroupDao checkGroupDao;

    // 检查项
    @Autowired
    CheckItemDao checkItemDao;

    @Autowired
    JedisPool jedisPool;

    @Override
    public void add(Setmeal setmeal, Integer[] checkgroupIds) {
        // 1:保存套餐
        setmealDao.add(setmeal);
        // 2:建立套餐和检查组的关联关系,向中间表保存数据
        setSetmealAndCheckGruop(setmeal.getId(),checkgroupIds);
        // (2)Redis的集合存储,保存套餐数据图片的时候,将图片名称,存放到Redis中一份(key值setmeal_pic_db_resource),然后在保存到数据库
        jedisPool.getResource().sadd(RedisPicConstant.SETMEAL_PIC_DB_RESOURCE,setmeal.getImg());
        // 生成静态页面(通过WEB-INF/ftl/下的flt文件)(输出到healthmobile_web下的webapp/pages下)
        this.generateMobileStatichtml();
    }

    private void generateMobileStaticHtml() {
        // 查询所有套餐(从数据库查询)
        List<Setmeal> list = this.findAll();
        // 生成套餐列表的静态页面
        this.generateMobileSetmealListStaticHtml(list);
        // 生成套餐详情的静态页面
        this.generateMobileSetmealDetailStaticHtml(list);
    }

    private void generateMobileSetmealDetailStaticHtml(List<Setmeal> list) {
        if(list!=null && list.size()>0){
            for (Setmeal setmeal : list) {
                Map<String,Object> map = new HashMap<>();
                map.put("setmeal",this.findById(setmeal.getId())); // 使用套餐id,查询套餐的详情(包括检查组的集合和检查项的集合)
                // 生成静态页面(参数1:静态页面的ftl文件名,参数2:静态页面的名称,参数三:map)
                useFreeMarkerGenerateHtml("mobile_setmeal_detail.ftl","setmeal_detail_"+setmeal.getId()+".html",map);
            }
        }
    }
    @Autowired
    FreeMarkerConfigurer freeMarkerConfigurer;

    @Value("${out_put_path}")
    private String output_path;  // 等同于加载D:\ideaProjects\85\health_parent\healthmobile_web\src\main\webapp\pages


    private void useFreeMarkerGenerateHtml(String s, String s1, Map<String, Object> map) {
        //  第一步:创建一个 Configuration 对象
        Configuration configuration = freeMarkerConfigurer.getConfiguration();
        Writer writer = null;
        try {
            // 第二步:加载一个模板,创建一个模板对象。
            Template template = configuration.getTemplate(s);
            // 第三步:创建Writer对象,加载D:\ideaProjects\85\health_parent\healthmobile_web\src\main\webapp\pages\m_setmeal.html
            writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(output_path+"\"+s1))));
            // 第四步:调用模板对象的 process 方法输出文件(格式,定义html)。
            template.process(map,writer);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //第八步:关闭流。
            try {
                writer.flush();
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void generateMobileSetmealListStaticHtml(List<Setmeal> list) {
        Map<String,Object> map = new HashMap<>();
        map.put("setmealList",list);
        // 生成静态页面(参数1:静态页面的ftl文件名,参数2:静态页面的名称,参数三:map)
        useFreeMarkerGenerateHtml("mobile_setmeal.ftl","m_setmeal.html",map);
    }

    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        PageHelper.startPage(currentPage,pageSize);
        Page<Setmeal> page = setmealDao.findPage(queryString);
        return new PageResult(page.getTotal(),page.getResult());
    }

//    @Override
//    public Setmeal findById(Integer id) {
//        // 1:使用id查询套餐信息
//        Setmeal setmeal = setmealDao.findById(id);
//        // 2:查询检查组集合的信息,封装到套餐对象中的checkGroups的集合属性中
//        List<CheckGroup> checkGroups = checkGroupDao.findCheckGroupListBySetmealId(setmeal.getId());
//        setmeal.setCheckGroups(checkGroups);
//        // 3:查询检查项集合的信息,封装到检查组对象中的checkItems的集合属性中
//        if(checkGroups!=null && checkGroups.size()>0){
//            for (CheckGroup checkGroup : checkGroups) {
//                List<CheckItem> checkItems = checkItemDao.findCheckItemListByCheckGroupId(checkGroup.getId());
//                checkGroup.setCheckItems(checkItems); // 封装检查组中的检查项集合
//            }
//        }
//        setmeal.setCheckGroups(checkGroups); // 封装套餐中的检查组集合
//        return setmeal;
//    }

    //利用ResultMap来映射
    @Override
    public Setmeal findById(Integer id) {
        // 1:使用id查询套餐信息
        Setmeal setmeal = setmealDao.findById(id);
        return setmeal;
    }

    @Override
    public List<Integer> findCheckGroupIdsBySetmealId(Integer id) {
        return setmealDao.findCheckGroupIdsBySetmealId(id);
    }

    @Override
    public void edit(Setmeal setmeal, Integer[] checkgroupIds) {
        // 建议最后操作数据库,先操作其他服务器内容(删除七牛云上的图片)
        // 判断是否改变的图片名称
        // (1)使用套餐id,查询套餐
        Setmeal setmeal_db = setmealDao.findById(setmeal.getId());
        // (2)获取数据库的套餐图片名称
        String img_db = setmeal_db.getImg();
        // (3)判断是否改变图片名称
        if(setmeal.getImg()!=null && !setmeal.getImg().equals(img_db)){
            // 如果改变套餐图片的名称,需要做处理
            // 删除之前七牛云上的存放图片
            QiniuUtils.deleteFileFromQiniu(img_db);
            // 删除Redis中key值是SETMEAL_PIC_RESOURCE的图片名称
            jedisPool.getResource().srem(RedisPicConstant.SETMEAL_PIC_RESOURCE,img_db);
            // 删除Redis中key值是SETMEAL_PIC_DB_RESOURCE的图片名称
            jedisPool.getResource().srem(RedisPicConstant.SETMEAL_PIC_DB_RESOURCE,img_db);
            // 添加Redis中key值是SETMEAL_PIC_DB_RESOURCE的新的图片名称
            jedisPool.getResource().sadd(RedisPicConstant.SETMEAL_PIC_DB_RESOURCE,setmeal.getImg());


        }
        // 1:编辑保存套餐
        setmealDao.edit(setmeal);
        // 2:删除套餐和检查组中间表的数据
        setmealDao.deleteSetmealAndCheckGroupBySetmealId(setmeal.getId());
        // 3:重新新增套餐和检查组中间表的数据,建立关联关系
        this.setSetmealAndCheckGruop(setmeal.getId(),checkgroupIds);
        // 生成静态页面(通过WEB-INF/ftl/下的flt文件)(输出到healthmobile_web下的webapp/pages下)
        this.generateMobileStaticHtml();
    }

    @Override
    public void delete(Integer id) {
        // 判断当前套餐是否和检查组之间存在关联关系
        Long count = setmealDao.findSetmealAndCheckGroupCountBySetmealId(id);
        // 查询获取到数据
        if(count>0){
            throw new RuntimeException(MessageConstant.GET_SETMEALANDCHECKGROUPERROR);
        }
        // 如果可以删除
        // 先删除七牛云上的图片
        // 使用套餐id,查询套餐
        Setmeal setmeal_db = setmealDao.findById(id);
        // 获取删除的图片名称
        String img_db = setmeal_db.getImg();
        // 七牛云删除图片
        if(img_db!=null && !"".equals(img_db)){
            // 删除七牛云上图片
            QiniuUtils.deleteFileFromQiniu(img_db);
            // 删除Redis中key值是SETMEAL_PIC_RESOURCE的图片名称
            jedisPool.getResource().srem(RedisPicConstant.SETMEAL_PIC_RESOURCE,img_db);
            // 删除Redis中key值是SETMEAL_PIC_DB_RESOURCE的图片名称
            jedisPool.getResource().srem(RedisPicConstant.SETMEAL_PIC_DB_RESOURCE,img_db);

        }

        // 再使用id,删除套餐
        setmealDao.delete(id);
        // 生成静态页面(通过WEB-INF/ftl/下的flt文件)(输出到healthmobile_web下的webapp/pages下)
        this.generateMobileStaticHtml();
    }

    @Override
    public List<Setmeal> findAll() {
        List<Setmeal> list = setmealDao.findAll();
        return list;
    }

    @Override
    public List<Map> findOrderCountBySetmealName() {
        List<Map> list = setmealDao.findOrderCountBySetmealName();
        return list;
    }

    private void setSetmealAndCheckGruop(Integer setmealId, Integer[] checkgroupIds) {
        if(checkgroupIds!=null && checkgroupIds.length>0){
            for (Integer checkGroupId : checkgroupIds) {
                // 使用Map
                Map map = new HashMap();
                map.put("setmealId",setmealId);
                map.put("checkGroupId",checkGroupId);
                setmealDao.addSetmealAndCheckGroup(map);
            }
        }
    }
}


SQL:

    <?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.itheima.health.dao.SetmealDao">
    <!--保存套餐,返回套餐id-->
    <insert id="add" parameterType="setmeal">
        <selectKey resultType="int" order="AFTER" keyProperty="id">
            select last_insert_id()
        </selectKey>
        insert into t_setmeal(name,code,helpCode,sex,age,price,remark,attention,img) values(#{name},#{code},#{helpCode},#{sex},#{age},#{price},#{remark},#{attention},#{img})
    </insert>

    <!--保存套餐和检查组的中间表-->
    <insert id="addSetmealAndCheckGroup" parameterType="map">
        insert into t_setmeal_checkgroup(setmeal_id,checkgroup_id) values(#{setmealId},#{checkGroupId})
    </insert>

    <!--条件的查询-->
    <select id="findPage" parameterType="String" resultType="setmeal">
        select * from t_setmeal
        <if test="value!=null and value.length>0">
            where name like concat(‘%‘,#{value},‘%‘) or code = #{value} or helpCode = #{value }
        </if>
    </select>

    <!--映射数据库的字段和实体类的属性-->
    <resultMap id="setmealMap" type="Setmeal">
        <!--映射id字段-->
        <id column="id" property="id"></id>
        <!--映射普通字段-->
        <result column="name" property="name"></result>
        <result column="code" property="code"></result>
        <result column="helpCode" property="helpCode"></result>
        <result column="sex" property="sex"></result>
        <result column="age" property="age"></result>
        <result column="price" property="price"></result>
        <result column="remark" property="remark"></result>
        <result column="attention" property="attention"></result>
        <result column="img" property="img"></result>
        <!--映射集合List
            property="":映射的实体类型属性
            column="":传递条件id的字段(需求:使用套餐id,查询检查组的集合List<CheckGroup>,封装到checkGroups的属性中)
            select="":指定Dao的查询方法
        -->
        <collection property="checkGroups" column="id" select="com.itheima.health.dao.CheckGroupDao.findCheckGroupListBySetmealId"></collection>

    </resultMap>

    <!--ID查询-->
    <select id="findById" parameterType="int" resultMap="setmealMap">
        select * from t_setmeal where id = #{id}
    </select>

    <!--使用套餐ID,查询检查组的ID集合-->
    <select id="findCheckGroupIdsBySetmealId" parameterType="int" resultType="int">
        select checkgroup_id from t_setmeal_checkgroup where setmeal_id = #{setmealId}
    </select>

    <!--编辑保存套餐-->
    <update id="edit" parameterType="setmeal">
        update t_setmeal
        <set>
            <if test="name!=null and name.length>0">
                name = #{name},
            </if>
            <if test="code!=null and code.length>0">
                code = #{code},
            </if>
            <if test="helpCode!=null and helpCode.length>0">
                helpCode = #{helpCode},
            </if>
            <if test="sex!=null and sex.length>0">
                sex = #{sex},
            </if>
            <if test="age!=null and age.length>0">
                age = #{age},
            </if>
            <if test="price!=null">
                price = #{price},
            </if>
            <if test="remark!=null and remark.length>0">
                remark = #{remark},
            </if>
            <if test="attention!=null and attention.length>0">
                attention = #{attention},
            </if>
            <if test="img!=null and img.length>0">
                img = #{img},
            </if>
        </set>
        where id = #{id}
    </update>

    <!--使用套餐id,删除套餐和检查组中间表的数据-->
    <delete id="deleteSetmealAndCheckGroupBySetmealId" parameterType="int">
        delete from t_setmeal_checkgroup where setmeal_id = #{setmealId}
    </delete>

    <!--使用套餐id,删除套餐-->
    <delete id="delete" parameterType="int">
        delete from t_setmeal where id = #{id}
    </delete>

    <!--使用套餐id,查询套餐和检查组的中间表,判断是否存在数据-->
    <select id="findSetmealAndCheckGroupCountBySetmealId" parameterType="int" resultType="long">
        select count(*) from t_setmeal_checkgroup where setmeal_id = #{setmealId}
    </select>

    <!--查询所有套餐-->
    <select id="findAll" resultType="setmeal">
        select * from t_setmeal
    </select>

    <!--统计分组,根据套餐统计预约数量-->
    <select id="findOrderCountBySetmealName" resultType="map">
        SELECT s.name,COUNT(*) value FROM t_order o,t_setmeal s WHERE o.setmeal_id = s.id GROUP BY s.name
    </select>


</mapper>











        

 

以上是关于基本增删改查的主要内容,如果未能解决你的问题,请参考以下文章

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

如何用SSM框架写一个增删改查的功能

如何用SSM框架写一个增删改查的功能

Beego脱坑(十三)ORM基本增删改查

如何用PHP代码实现MySQL数据库的增删改查

SQL的增删改查