后台SpringBoot + MyBatis前台vue,多对多简单三表联查,增删改查(附源码),存在问题sql语句子查询显示出来数据不全分析解决方案,后台解析格式化数据非直接传入数据

本人,初学java,可能有很多地方不是很合适,但也请见谅,欢迎各位大神提出意见,可以学习,后台直接采用sql代码展示解析所需数据,不建议使用, 纯属练习sql语句,后台还是需要提交数据就可以。

题目需求:(很简单)

只是个样子,我们使用vue做前台样式会出现不同,但不影响正常功能。

拿到题目,首先设计数据库:

-- 学生表
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`
(
  `id`            int(11)      NOT NULL auto_increment,
  `name`           varchar(255) NOT NULL,
  `date` varchar(255) ,
  PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8
  auto_increment = 1;

-- 中间表
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for s_c
-- ----------------------------
DROP TABLE IF EXISTS `s_c`;
CREATE TABLE `s_c`
(
  `id`            int(11)      NOT NULL auto_increment,
  `sid`           int(11) NOT NULL,
  `cid`           int(11) NOT NULL,
  PRIMARY KEY (`id`)
  index `sid`(`sid`),
  index `cid`(`cid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8
  auto_increment = 1;

-- 课程表
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for classes
-- ----------------------------
DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes`
(
  `id`            int(11)      NOT NULL auto_increment,
  `name`           varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8
  auto_increment = 1;

总共合计三张表,一张学生表,存储学生姓名、日期;一张课程表,存储课程信息;一张中间表,存储学生、课程表直接关系,为多对多。

一、分析思路:

      1、列表思路

                两种思路:①后台使用sql直接处理连接好所选课程,使用group_concat()group by来处理数据(采用这种思路)

                                  ②后台把数据封装起来,只提交数据到前台,由前台处理(最好使用这样的思路来做,但由于我是想练习sql语句,所以我采用第一种思路来处理)

       2、新增思路

                新增时,只需要新增学生表和中间表即可,由于学生表主键自增,先新增学生表返回主键值,根据对应主键值和课程表的所选id进行新增中间表。

       3、修改思路

                修改时,首先根据学生表查询学生信息进行回显,在根据学生表主键id查询中间表课程id,然后对课程进行回显处理。然后修改学生表信息,同时删除中间表关于当前学生id的所有课程信息数据,然后根据新选择课程id,学生id进行添加中间表。

       4、删除思路

                删除根据学生id删除学生表,再根据学生id删除中间表数据。

二、实现后台功能:

       1、列表功能

                ①我采用直接用sql的方案来写后台代码,所以我首先需要测试sql怎么去写。

                   首先我直接用group_concat()group by来处理数据,直接显示

                   1、 采用where根据条件直接连接三表(后面用这种连接方式)

SELECT
	s.*, GROUP_CONCAT(c. NAME) AS concat
FROM
	student s,
	classes c,
	s_c z
WHERE
	z.cid = c.id
AND z.sid = s.id
GROUP BY
	z.sid

                    2、 采用left join连接三表,也可以达到效果。

SELECT
	s.*, GROUP_CONCAT(c. NAME) AS concat
FROM
	s_c z
LEFT JOIN student s ON z.sid = s.id
LEFT JOIN classes c ON z.cid = c.id
GROUP BY
	z.sid

 基本所需要的数据已经展示出来。

GROUP_CONCAT 函数返回一个字符串结果,该结果由分组中的值连接组合而成,常和 GROUP BY 连用。

1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

注意示例:

别乱用 GROUP_CONCAT,说不定你现在使用的 GROUP_CONCAT 得到的结果就是隐藏着BUG的。

GROUP_CONCAT 的结果会受到 group_concat_max_len 变量的限制。

默认 group_concat_max_len = 1024,即字符串的长度字节超过1024 则会被截断。

题目要求:根据姓名模糊查询,根据课程进行查询,现在来实现这些功能。

先来模糊查询

SELECT
	s.*, GROUP_CONCAT(c. NAME) AS concat
FROM
	student s,
	classes c,
	s_c z
WHERE
	z.cid = c.id
AND z.sid = s.id
AND INSTR(s. NAME, '干')
GROUP BY
	z.sid

 INSTR(s. NAME, '干')  模糊查询带有“干”的数据,用LIKE也可以实现模糊查询功能。

根据课程查询

我先试着写一下,把数据放到where条件地方,看看是什么效果,我现在想查1的课程都有哪些符合的学生,1为数据结构,2为计算机原理

SELECT
	s.*, GROUP_CONCAT(c. NAME) AS concat
FROM
	student s,
	classes c,
	s_c z
WHERE
	z.cid = c.id
AND z.sid = s.id
AND INSTR(s. NAME, '')
AND z.cid in(1)
GROUP BY
	z.sid

写完发现数据不全,整个关于2的课程信息都没了,这很明显的sql出错,我们写的时候不能直接把条件写where里面,这样的话,直接会匹配条件,所以数据显示不会完全。 所以我们应该怎么条件查询呢,要根据group分组结果后来进行条件查询,使用HAVING来进行条件查询。

SELECT
	s.*, GROUP_CONCAT(c. NAME) AS concat
FROM
	student s,
	classes c,
	s_c z
WHERE
	z.cid = c.id
AND z.sid = s.id
AND INSTR(s. NAME, '')
GROUP BY
	z.sid
HAVING
	z.cid IN (1)

作为小白,忘了怎么写了,先尝试一下,发现报错。[Err] 1054 - Unknown column 'z.cid' in 'having clause',很明显不可以这样写,那么应该是根据z.sid来进行条件匹配的,那这样我就得查关于选中课程的id对应的sid都有哪些数据。

符合课程为1的学生都有id为:根据最初的界面可以看到为“5,10,12”,那么sql就这样写。

SELECT
	s.*, GROUP_CONCAT(c. NAME) AS concat
FROM
	student s,
	classes c,
	s_c z
WHERE
	z.cid = c.id
AND z.sid = s.id
AND INSTR(s. NAME, '')
GROUP BY
	z.sid
HAVING
	z.sid IN (5, 10, 12)

 思路是对的,这样做是没错的,我现在需要怎么把5,10,12查询出来,现在开始写这个sql,这还是用到了GROUP_CONCAT。

SELECT
	GROUP_CONCAT(DISTINCT sid)
FROM
	s_c
WHERE
	cid IN (1)

DISTINCT 去除重复的数据。相关的sid数据也拿到了,我是不是可以直接用子查询就可以解决问题了嘛,但是并没有。

SELECT
	s.*, GROUP_CONCAT(c. NAME) AS concat
FROM
	student s,
	classes c,
	s_c z
WHERE
	z.cid = c.id
AND z.sid = s.id
AND INSTR(s. NAME, '')
GROUP BY
	z.sid
HAVING
	z.sid IN (
		SELECT
			GROUP_CONCAT(DISTINCT sid)
		FROM
			s_c
		WHERE
			cid IN (1)
	)

你会发现数据不对呀,怎么子查询查询出来的数据不全呢,是什么原因呢,看一下,只显示出来了sid为10的一条,说明查询没有出错,原来是GROUP_CONCAT查询出来的结果为"10,12,5",这样写到in里面会只显示出来一条,要么是in("10","12","5")或者in(10,12,5)原来是这样的原因,那么我需要这样进行处理。最终的sql语句。

SELECT
	s.*, GROUP_CONCAT(c. NAME) AS concat
FROM
	student s,
	classes c,
	s_c z
WHERE
	z.cid = c.id
AND z.sid = s.id
AND INSTR(s. NAME, '')
GROUP BY
	z.sid
HAVING
	FIND_IN_SET(
		z.sid,
		(
			SELECT
				GROUP_CONCAT(DISTINCT sid)
			FROM
				s_c
			WHERE
				cid IN (1)
		)
	)

 这样就可以达到最终的效果了。我们借用

FIND_IN_SET(str,strlist)函数

str 要查询的字符串

strlist 字段名 参数以”,”分隔 如 (1,2,6,8)

查询字段(strlist)中包含(str)的结果,返回结果为null或记录

后台SQL语句写完,开始写controller层。

 //列表
    @GetMapping("/list")
    public PageInfo<StudentListDto> getList(@RequestParam(defaultValue = "1") Integer pageNum,
                                            @RequestParam(required = false,defaultValue = "") String name,
                                            @RequestParam(required = false) String cname){
        PageHelper.startPage(pageNum,3);
        Page<StudentListDto> page = studentMapper.selectAll(name,cname);
        PageInfo<StudentListDto> pageInfo = page.toPageInfo();
        return pageInfo;
    }

用到了PageHelper分页插件,以及在定义一个数据传输层的自定义StudentListDto来接受数据来给前台使用。mapperXML如下:

<?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.example.demo.mapper.StudentMapper"> 
 <select id="selectAll" resultType="com.example.demo.dto.StudentListDto">
    select s.*,GROUP_CONCAT(c.name) as concat
    from student s,classes c,s_c z where z.cid=c.id and z.sid=s.id and INSTR(s.name,#{name})
    GROUP BY z.sid
    <if test="cname != null and cname != ''">
      HAVING  FIND_IN_SET(z.sid,( select GROUP_CONCAT(DISTINCT sid) from s_c where cid in (${cname})))
    </if>
  </select>
</mapper>
package com.example.demo.dto;

import com.example.demo.po.Student;

public class StudentListDto extends Student {
    private String concat;

    public String getConcat() {
        return concat;
    }

    public void setConcat(String concat) {
        this.concat = concat;
    }
}

动态获取课程复选框

 @GetMapping("/getClasses")
    public List<Classes> getClasses(){
        List<Classes> clist =classesMapper.selectAll();
        return clist;
    }

 

<?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.example.demo.mapper.ClassesMapper">
  <resultMap id="BaseResultMap" type="com.example.demo.po.Classes">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
  </resultMap>  
  <select id="selectAll"  resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from classes
  </select>
</mapper>

       2、新增功能

                  从前台接受过来的数据,用自己设定的dto接收,然后给po的实体类,遍历前台的课程id集合,从而添加中间表。

    @PostMapping("/add")
    @Transient
    public Integer add(@RequestBody StudentCreateDto studentCreateDto) {
        Student student = new Student();
        student.setDate(studentCreateDto.getDate());
        student.setName(studentCreateDto.getName());

        studentMapper.insert(student);
        List<Integer> cids = studentCreateDto.getCids();
        for (Integer cid : cids) {
            S_C s_c = new S_C();
            s_c.setSid(student.getId());
            s_c.setCid(cid);
            s_cMapper.insert(s_c);
        }
        return student.getId();
    }
package com.example.demo.dto;

import com.example.demo.po.Student;

import java.util.List;

public class StudentCreateDto extends Student{

    private List<Integer> cids;

    public List<Integer> getCids() {
        return cids;
    }

    public void setCids(List<Integer> cids) {
        this.cids = cids;
    }
}
<?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.example.demo.mapper.StudentMapper">
  <insert id="insert" parameterType="com.example.demo.po.Student" keyProperty="id" useGeneratedKeys="true">
        insert into student (name, date)
        values (#{name,jdbcType=VARCHAR}, #{date,jdbcType=VARCHAR})
  </insert>
</mapper>
<?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.example.demo.mapper.S_CMapper"> 
    <insert id="insert" parameterType="com.example.demo.po.S_C" useGeneratedKeys="true" keyProperty="id">
        insert into s_c ( sid, cid)
        values ( #{sid,jdbcType=INTEGER}, #{cid,jdbcType=INTEGER})
   </insert>
</mapper>

       3、查看功能

                  根据学生表的id查询学生信息,以及根据学生id查询课程进行回显。

    @GetMapping("/getById")
    public GetStudentDto getById(@RequestParam Integer id) {
        GetStudentDto getStudentDto = studentMapper.selectByPrimaryKey2(id);
        List<Integer> cids = s_cMapper.selectByPrimaryKey2(id);
        getStudentDto.setCids(cids);
        return getStudentDto;
    }

 

package com.example.demo.dto;

import com.example.demo.po.Student;

import java.util.List;

public class GetStudentDto extends Student{

    private List<Integer> cids;

    public List<Integer> getCids() {
        return cids;
    }

    public void setCids(List<Integer> cids) {
        this.cids = cids;
    }
}
<?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.example.demo.mapper.StudentMapper">   
  <select id="selectByPrimaryKey2" parameterType="java.lang.Integer" resultType="com.example.demo.dto.GetStudentDto">
    select s.*,GROUP_CONCAT(c.name) as concat  from student s,classes c,s_c z 
    where z.cid=c.id and z.sid=s.id and s.id = #{id,jdbcType=INTEGER}
    GROUP BY s.id
  </select>
</mapper>

       4、编辑功能

                  根据学生表的id查询学生信息,以及根据学生id查询课程进行回显,回显之后根据学生id修改学生表,在根据学生id删除中间表关于学生id的数据,然后新增最新的对应关系。

@PostMapping("/update")
    @Transient
    public void update(@RequestBody StudentUpdateDto studentUpdateDto) {
        Student student = new Student();
        student.setId(studentUpdateDto.getId());
        student.setName(studentUpdateDto.getName());
        student.setDate(studentUpdateDto.getDate());
        studentMapper.updateByPrimaryKey(student);
        s_cMapper.deleteByStudentId(studentUpdateDto.getId());
        List<Integer> cids = studentUpdateDto.getCids();
        for (Integer cid : cids) {
            S_C s_c = new S_C();
            s_c.setCid(cid);
            s_c.setSid(student.getId());
            s_cMapper.insert(s_c);
        }
    }
package com.example.demo.dto;

import com.example.demo.po.Student;

import java.util.List;

public class StudentUpdateDto extends Student{

    private List<Integer> cids;

    public List<Integer> getCids() {
        return cids;
    }

    public void setCids(List<Integer> cids) {
        this.cids = cids;
    }
}
<?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.example.demo.mapper.StudentMapper">  
  <update id="updateByPrimaryKey" parameterType="com.example.demo.po.Student">
    update student
    set name = #{name,jdbcType=VARCHAR},
      date = #{date,jdbcType=VARCHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>
<?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.example.demo.mapper.S_CMapper"> 
  <delete id="deleteByStudentId" parameterType="java.lang.Integer">
    delete from s_c
    where sid = #{id,jdbcType=INTEGER}
  </delete>
</mapper>

       4、批量删除功能

                  批量删除通过数组接收删除学生id,进行遍历,删除学生表以及中间表

@PostMapping("/plsc")
    @Transient
    public void plsc(@RequestBody List<Integer> selectId) {
        for (Integer id : selectId) {
            studentMapper.deleteByPrimaryKey(id);
            s_cMapper.deleteByStudentId(id);
        }
    }
<?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.example.demo.mapper.StudentMapper">
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from student
    where id = #{id,jdbcType=INTEGER}
  </delete>
</mapper>

三、实现前台页面:(直接码代码了)

        1、列表页面

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="assets/css/elementui.css">
    <title>Demo</title>
</head>
<body>
    <div id="app">
        选修课:<el-checkbox-group v-model="cids">
            <el-checkbox v-for="classe in classes" :label="classe.id" :key="classe.id">{{classe.name}}</el-checkbox>
        </el-checkbox-group>
        <el-input v-model="name" placeholder="请输入姓名查询" style="width: 20%"></el-input>
        <el-button type="primary" @click="handleSearch">搜索</el-button>
        <el-button type="primary" @click="handleCreate">添加</el-button>
        <el-button type="primary" @click="handleBatchDelete">批量删除</el-button>
        <el-table :data="pageInfo.list" border style="width: 60%" @selection-change="handleSelectionChange">
            <el-table-column type="selection" width="55">
            </el-table-column>
            <el-table-column prop="id" label="编号">
            </el-table-column>
            <el-table-column prop="name" label="姓名">
            </el-table-column>
            <el-table-column prop="concat" label="选修课">
            </el-table-column>
            <el-table-column label="操作">
                <template slot-scope="scope">
                    <el-button @click="handleTotalClick(scope.row)" type="text" size="small">查看</el-button>
                    <el-button @click="handleEditClick(scope.row)" type="text" size="small">编辑</el-button>
                </template>
            </el-table-column>
        </el-table>
        <el-pagination background layout="prev, pager, next" :total="pageInfo.total" :page-size="pageInfo.pageSize"
            @current-change="pageChange">
        </el-pagination>
    </div>
    <script src="assets/js/axios.min.js"></script>
    <script src="assets/js/common.js"></script>
    <script src="assets/js/vue.js"></script>
    <script src="assets/js/elementui.js"></script>
    <script src="viewmodels/studentList.js"></script>
</body>
</html>
var app = new Vue({
    el: '#app',
    data: {
        pageInfo: '',
        pageNum: 1,
        classes: [],
        cids: [],
        name: '',
        selectId: []
    },
    mounted() {
        this.getList();
        this.getClasses();
    },
    methods: {
        getList() {
            axios.get('/stu/list', {
                params: {
                    pageNum: this.pageNum,
                    cname: this.cids.join(),
                    name: this.name
                }
            })
                .then(function (response) {
                    app.pageInfo = response.data;
                })
        },
        pageChange(val) {
            console.log(val);
            this.pageNum = val;
            this.getList();
        },
        getClasses() {
            axios.get('/cla/getClasses')
                .then(function (response) {
                    app.classes = response.data;
                })
        },
        handleSearch() {
            this.pageNum = 1;
            console.log(this.cids.join());
            this.getList();
        },
        plsc() {
            if (this.selectId.length == 0) {
                alert("请选择要删除的项")
            } else {
                axios.post('/stu/plsc',
                    this.selectId
                )
                    .then(function (response) {
                        alert('批删成功');
                        location.reload();
                    })
                    .catch(function (error) {
                        console.log(error);
                        alert('批删失败');
                    });
            }

        },
        handleCreate() {
            location.href = "StudentCreate.html";
        },
        handleBatchDelete() {
            this.plsc();
        },
        handleSelectionChange(val) {
            console.log(val)
            this.selectId = val.map(x => x.id);
            console.log(this.selectId)
        },
        handleTotalClick(row) {
            location.href = "studentTotal.html?id=" + row.id;
            console.log(row.id)
        },
        handleEditClick(row) {
            location.href = "studentUpdate.html?id=" + row.id;
            console.log(row.id)
        }
    }
})

        2、新增页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="assets/css/elementui.css">
    <title>Demo</title>
</head>
<body>
    <div id="app">
        姓名:<el-input placeholder="请输入姓名" v-model="name" clearable style="width: 20%"></el-input></br>
        日期:<el-date-picker v-model="date" type="date" placeholder="选择日期" style="width: 20%">
        </el-date-picker></br>
        选修课:<el-checkbox-group v-model="cids">
            <el-checkbox v-for="classe in classes" :label="classe.id" :key="classe.id">{{classe.name}}</el-checkbox>
        </el-checkbox-group>
        <el-button type="primary" @click="handleCreate">添加</el-button>
        <el-button type="primary" @click="handleGoback">返回</el-button>
    </div>
    <script src="assets/js/axios.min.js"></script>
    <script src="assets/js/common.js"></script>
    <script src="assets/js/vue.js"></script>
    <script src="assets/js/elementui.js"></script>
    <script src="viewmodels/studentCreate.js"></script>
</body>
</html>
var app = new Vue({
    el: '#app',
    data: {
        classes: [],
        name: '',
        date: '',
        cids: []
    },
    mounted() {
        this.getClasses();
    },
    methods: {
        getClasses() {
            axios.get('/cla/getClasses')
                .then(function (response) {
                    app.classes = response.data;
                })
        },
        create() {
            axios.post('/stu/add', {
                name: this.name,
                date: this.date,
                cids: this.cids
            })
                .then(function (response) {
                    alert('添加成功');
                    location.href = "studentList.html"
                })
                .catch(function (error) {
                    console.log(error);
                    alert('添加失败');
                });
        },
        handleGoback() {
            location.href = "studentList.html"
            // console.log(this.cids)
        },
        handleCreate() {
            this.create();
        }
    }
})

        3、查看页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="assets/css/elementui.css">
    <title>Demo</title>
</head>
<body>
    <div id="app">
        姓名:<el-input placeholder="请输入姓名" v-model="name" clearable style="width: 20%"></el-input></br>
        日期:<el-date-picker v-model="date" type="date" placeholder="选择日期" style="width: 20%">
        </el-date-picker></br>
        选修课:<el-checkbox-group v-model="cids">
            <el-checkbox v-for="classe in classes" :label="classe.id" :key="classe.id">{{classe.name}}</el-checkbox>
        </el-checkbox-group>
        <el-button type="primary" @click="handleGoback">返回</el-button>
    </div>
    <script src="assets/js/axios.min.js"></script>
    <script src="assets/js/common.js"></script>
    <script src="assets/js/vue.js"></script>
    <script src="assets/js/elementui.js"></script>
    <script src="viewmodels/studentTotal.js"></script>
</body>
</html>
var app = new Vue({
    el: '#app',
    data: {
        classes: [],
        name: '',
        date: '',
        cids: []
    },
    mounted() {
        this.getClasses();
        var url = new URL(location.href);
        var id = url.searchParams.get("id")
        this.getStudentById(id);
    },
    methods: {
        getClasses() {
            axios.get('/cla/getClasses')
                .then(function (response) {
                    app.classes = response.data;
                })
        },
        getStudentById(id) {
            axios.get('/stu/getById', {
                params: {
                    id: id,
                }
            })
                .then(function (response) {
                    var student = response.data;
                    app.name = student.name;
                    app.date = student.date;
                    app.cids = student.cids;
                })
        },
        handleGoback() {
            location.href = "studentList.html"
        }
    }
})

        4、编辑页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="assets/css/elementui.css">
    <title>Demo</title>
</head>
<body>
    <div id="app">
        <el-input type="hidden" v-model="id"></el-input>
        姓名:<el-input placeholder="请输入姓名" v-model="name" clearable style="width: 20%"></el-input></br>
        日期:<el-date-picker v-model="date" type="date" placeholder="选择日期" style="width: 20%">
        </el-date-picker></br>
        选修课:<el-checkbox-group v-model="cids">
            <el-checkbox v-for="classe in classes" :label="classe.id" :key="classe.id">{{classe.name}}</el-checkbox>
        </el-checkbox-group>
        <el-button type="primary" @click="handleEdit">修改</el-button>
        <el-button type="primary" @click="handleGoback">返回</el-button>
    </div>
    <script src="assets/js/axios.min.js"></script>
    <script src="assets/js/common.js"></script>
    <script src="assets/js/vue.js"></script>
    <script src="assets/js/elementui.js"></script>
    <script src="viewmodels/StudentUpdate.js"></script>
</body>
</html>
var app = new Vue({
    el: '#app',
    data: {
        classes: [],
        name: '',
        date: '',
        cids: [],
        id: ''
    },
    mounted() {
        this.getClasses();
        var url = new URL(location.href);
        var id = url.searchParams.get("id")
        this.getStudentById(id);
    },
    methods: {
        getClasses() {
            axios.get('/cla/getClasses')
                .then(function (response) {
                    app.classes = response.data;
                })
        },
        getStudentById(id) {
            axios.get('/stu/getById', {
                params: {
                    id: id,
                }
            })
                .then(function (response) {
                    var student = response.data;
                    app.name = student.name;
                    app.date = student.date;
                    app.cids = student.cids;
                    app.id = student.id;
                })
        },
        studentUpdate() {
            axios.post('/stu/update', {
                name: this.name,
                date: this.date,
                cids: this.cids,
                id: this.id
            })
                .then(function (response) {
                    alert('修改成功');
                    location.href = "studentList.html"
                })
                .catch(function (error) {
                    console.log(error);
                    alert('修改失败');
                });
        },
        handleGoback() {
            location.href = "studentList.html"
        },
        handleEdit() {
            this.studentUpdate();
        }
    }
})

基本上就完事了,最后附上配置文件,但是列表不介意直接sql语句转,应该传递所有数据给前台进行转码。

<?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 http://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.1.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<!-- web依赖也需要,因为我们采用MVC模式 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-freemarker</artifactId>
		</dependency>
		<!-- rabbitmq -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>
		<!-- pagehelper -->
		<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.2.10</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>org.mybatis.generator</groupId>
				<artifactId>mybatis-generator-maven-plugin</artifactId>
				<version>1.3.7</version>
			</plugin>
		</plugins>
	</build>
</project>

 

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值