学生管理系统案例(基本Maven环境搭建 -->单表增删改查 --> 关联查询 (多表)--> 多表增删改查)

1.搭建环境

1.1 创建项目

  • 创建项目:exam-student

在这里插入图片描述

  • 搭建环境:添加坐标、拷贝配置文件、编写启动类
    在这里插入图片描述

1.2 添加坐标

在这里插入图片描述
pom.xml文件

    <!-- 父工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <!-- jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <mybatis.starter.version>1.3.2</mybatis.starter.version>
        <mapper.starter.version>2.0.2</mapper.starter.version>
        <mysql.version>5.1.32</mysql.version>
        <pageHelper.starter.version>1.2.5</pageHelper.starter.version>
        <durid.starter.version>1.1.10</durid.starter.version>
    </properties>

    <!-- 导入需要依赖(坐标/jar包)   -->
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- mybatis启动器 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.starter.version}</version>
        </dependency>
        <!-- 通用Mapper启动器 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>${mapper.starter.version}</version>
        </dependency>
        <!-- 分页助手启动器 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>${pageHelper.starter.version}</version>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!-- Druid连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${durid.starter.version}</version>
        </dependency>
        <!--swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>

    </dependencies>

1.3 拷贝properties文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Td9FczPy-1618965629099)(assets/image-20201003080023835.png)]

application.properties配置文件

#端口号
server.port=8080

#数据库基本配置
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/db3?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=1234

#druid 连接池配置
#驱动
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#初始化连接池大小
spring.datasource.druid.initial-size=1
#最小连接数
spring.datasource.druid.min-idle=1
#最大连接数
spring.datasource.druid.max-active=20
#获取连接时候验证,会影响性能
spring.datasource.druid.test-on-borrow=true

# mybatis
# mybatis.type-aliases-package=com.czxy.domain.base
# mybatis.mapper-locations=classpath:mappers/*.xml
#mapper
mapper.not-empty=false
mapper.identity=MYSQL
#开启驼峰映射
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.mapper-locations=classpath*:mapper/*.xml
#开启log4j打印SQL语句
logging.level.com.czxy.dao=debug

1.4 编写启动类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RclS8Lo6-1618966098799)(assets/image-20201003080328191.png)]

启动类:

package com.czxy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author 桐叔
 * @email [email protected]
 */
@SpringBootApplication
public class StudentApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(StudentApplication.class, args);
    }
}

1. 5 拷贝封装类

  • BaseResult类,用于存在自定义响应结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KZWfxdp8-1618966216020)(assets/image-20201003082432797.png)]

1.6 拷贝配置类(可选)

  • Swagger2Configuration类,用于自动生成后端访问接口,进行增删改查测试的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SsPEZogF-1618966326475)(assets/image-20201003082515069.png)]

  • 如果没有拷贝此配置文件,必须会用postman进行增删改查测试的

2. 单表:班级管理

2.0 数据库

create database db1005;
use db1005;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQRQPv3W-1618966397564)(assets/image-20201005082741104.png)]

2.1 班级SQL

-- 班级表
create table tb_class(
  `c_id` varchar(32) primary key comment '班级ID',
  `c_name` varchar(50) comment '班级名称',
  `desc` varchar(200) comment '班级描述'
);
insert into tb_class(`c_id`,`c_name`,`desc`) values('c001','Java12班','。。。。');
insert into tb_class(`c_id`,`c_name`,`desc`) values('c002','Java34班','。。。。');

2.2 查询所有班级

2.2.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WxZrKeM-1618966642555)(assets/image-20201003103110231.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0GQeX3Of-1618966642558)(assets/image-20201003084851111.png)]

2.2.2 分析

**### [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1rcuuKOG-1618966642561)(assets/image-20201005082919849.png)]**

2.2.3 后端实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qsY87X58-1618967295455)(assets/image-20201003082704510.png)]

  • 编写JavaBean

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FRqrjol6-1618967295457)(assets/image-20201003082841051.png)]

    package com.czxy.domain;
    
    import javax.persistence.Column;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    /**
     * @author 桐叔
     * @email [email protected]
     */
    @Table(name="tb_class")
    public class Classes {
          
          
        @Id
        @Column(name="c_id")
        private String cId;
    
        @Column(name="c_name")
        private String cName;
    
        @Column(name="`desc`")
        private String desc;
    
        public String getcId() {
          
          
            return cId;
        }
    
        public void setcId(String cId) {
          
          
            this.cId = cId;
        }
    
        public String getcName() {
          
          
            return cName;
        }
    
        public void setcName(String cName) {
          
          
            this.cName = cName;
        }
    
        public String getDesc() {
          
          
            return desc;
        }
    
        public void setDesc(String desc) {
          
          
            this.desc = desc;
        }
    
        @Override
        public String toString() {
          
          
            return "Classes{" +
                    "cId='" + cId + '\'' +
                    ", cName='" + cName + '\'' +
                    ", desc='" + desc + '\'' +
                    '}';
        }
    }
    
    
    
  • 编写mapper

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HKTLbo1m-1618967443474)(assets/image-20201003082929577.png)]

    package com.czxy.mapper;
    
    import com.czxy.domain.Classes;
    import tk.mybatis.mapper.common.Mapper;
    
    /**
     * @author 桐叔
     * @email [email protected]
     */
    @org.apache.ibatis.annotations.Mapper
    public interface ClassesMapper extends Mapper<Classes> {
          
          
    }
    
    
  • 编写service

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4tM99iwY-1618967443476)(assets/image-20201003083011045.png)]

    package com.czxy.service;
    
    import com.czxy.domain.Classes;
    import com.czxy.mapper.ClassesMapper;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    /**
     * @author 桐叔
     * @email [email protected]
     */
    @Service
    @Transactional
    public class ClassesService {
          
          
    
        @Resource
        private ClassesMapper classesMapper;
    
        /**
         * 查询所有
         * @return
         */
        public List<Classes> findAll() {
          
          
            List<Classes> list = classesMapper.selectAll();
            return list;
        }
    }
    
    
  • 编写controller

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Lfi3Tut-1618967443478)(assets/image-20201003083102703.png)]

    package com.czxy.controller;
    
    import com.czxy.domain.Classes;
    import com.czxy.service.ClassesService;
    import com.czxy.vo.BaseResult;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    /**
     * @author 桐叔
     * @email [email protected]
     */
    @RestController
    @RequestMapping("/classes")
    public class ClassesController {
          
          
    
        @Resource
        private ClassesService classesService;
    
        /**
         * 查询所有
         * @return
         */
        @GetMapping
        public BaseResult findAll(){
          
          
            // 查询
            List<Classes> list = classesService.findAll();
            // 返回
            return BaseResult.ok("查询成功", list );
        }
    
    
    }
    
    

2.2.4 前端实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zhjGW8An-1618967606238)(assets/image-20201003083527316.png)]

  • 创建static/js目录,拷贝js类库

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hqTypgUj-1618967606240)(assets/image-20201003083600380.png)]

  • 创建首页

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sgiywhE3-1618967606242)(assets/image-20201003083641604.png)]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <a href="classes_list.html">班级管理</a> |
</body>
</html>
  • 创建列表页面

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JWNC3DaF-1618967742765)(assets/image-20201003083716000.png)]

    • 基本结构

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>班级列表</title>
      
          <script type="text/javascript" src="js/jquery-3.3.1.js"></script>
      
          <script>
              $(function(){
               
               
                  // 查询班级
      
                  // 查询所有
                  findAll();
              });
      
              //查询所有函数
              function findAll() {
               
               
      
              }
              
      
          </script>
      
      
      </head>
      <body>
          <a href="index.html">返回首页</a>
          <a href="">添加班级</a> <br/>
      
          <table id="tid" border="1" width="800">
              <tr>
                  <td>班级ID</td>
                  <td>班级名称</td>
                  <td>班级描述</td>
                  <td>操作</td>
              </tr>
              <tr>
                  <td>c001</td>
                  <td>Java34班</td>
                  <td>这是一个有韧劲的班</td>
                  <td>
                      <a href="">修改</a>
                      <a href="">删除</a>
                  </td>
              </tr>
          </table>
      </body>
      </html>
      

      完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级列表</title>

    <script type="text/javascript" src="js/jquery-3.3.1.js"></script>

    <script>
        $(function(){
     
     
            // 查询班级

            // 查询所有
            findAll();
        });

        //查询所有函数
        function findAll() {
     
     

            // 查询
            $.ajax({
     
     
                "url":"/classes",
                "type":"get",
                "dataType":"json",
                "success":function(data){
     
     
                    // 处理
                    if(data.code == 1) {
     
     
                        // 重置table
                        $("#tid").html(`
                            <tr>
                                <td>班级ID</td>
                                <td>班级名称</td>
                                <td>班级描述</td>
                                <td>操作</td>
                            </tr>
                        `);
                        // 追加
                        $(data.data).each(function(index,classes){
     
     
                            $("#tid").append(`
                                <tr>
                                    <td>${
       
       classes.cId}</td>
                                    <td>${
       
       classes.cName}</td>
                                    <td>${
       
       classes.desc}</td>
                                    <td>
                                        <a href="">修改</a>
                                        <a href="">删除</a>
                                    </td>
                                </tr>
                            `)
                        });
                    } else {
     
     
                        //
                        alert('查询失败')
                    }
                },
                "error":function(){
     
     
                    alert('操作失败')
                }
            })
        }

    </script>


</head>
<body>
    <a href="index.html">返回首页</a>
    <a href="">添加班级</a> <br/>

    <table id="tid" border="1" width="800">
        <tr>
            <td>班级ID</td>
            <td>班级名称</td>
            <td>班级描述</td>
            <td>操作</td>
        </tr>
        <tr>
            <td>c001</td>
            <td>Java34班</td>
            <td>这是一个有韧劲的班</td>
            <td>
                <a href="">修改</a>
                <a href="">删除</a>
            </td>
        </tr>
    </table>
</body>
</html>

2.3 添加班级

2.3.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gyz3FndE-1618967939116)(assets/image-20201003094731815.png)]

2.3.2 分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xC9XtJUw-1618967939117)(assets/image-20201005092515226.png)]

2.3.2 后端实现

  • 编写service,添加save方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IL83XDw1-1618967939119)(assets/image-20201003083011045.png)]

        /**
         * 添加班级
         * @param classes
         * @return
         */
        public boolean save(Classes classes) {
          
          
            int count = classesMapper.insert(classes);
            return count == 1;
        }
    
  • 编写controller

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h9qYh4xq-1618967939121)(assets/image-20201003083102703.png)]

        /**
         * 添加班级
         * @param classes
         * @return
         */
        @PostMapping
        public BaseResult save(@RequestBody Classes classes){
          
          
            // 添加
            boolean result = classesService.save(classes);
            // 返回
            if(result){
          
          
                return BaseResult.ok("添加成功");
            } else {
          
          
                return BaseResult.error("添加失败");
            }
        }
    
  • 测试

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eXRbgyYg-1618967939140)(assets/image-20201003090550353.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EjoSOb9s-1618967939141)(assets/image-20201003090610869.png)]

2.3.3 前端实现

  • 修改首页

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mQcgss2w-1618968525153)(assets/image-20201003090844283.png)]

  • 添加 classes_add.html页面

![\求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cgctk-16189685s/image-20201003095420732.png)]

#25154)失败,源站可能有防盗链机制,建议将图片保存下来直接上传(assets/image-202010030908046)(assets/image-202010060811135695.png1.png)](https://img-blog.csdnimg.cn/20210421093059757.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpMTM0Mjk3NDM1ODA=,size_16,color_FFFFFF,t_70)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级列表</title>
	<!--导入jquery-->
    <script type="text/javascript" src="js/jquery-3.3.1.js"></script>
    <!--工具:将表单转换json字符串,注意:必须提供name属性-->
    <script type="text/javascript" src="js/form2json-2.1.js"></script>

    <script>

        function add() {
     
     
            // 获得表单数据
            var obj = $("#f01").formToJson();

            $.ajax({
     
     
                "url":"/classes",
                "type":"post",
                "contentType":"application/json;charset=UTF-8",
                "data": obj,
                "dataType":"json",
                "success":function(data){
     
     
                    // 处理
                    if(data.code == 1) {
     
     
                        // 成功提示
                        alert(data.message)
                        // 跳转
                        location.href = "classes_list.html"
                    } else {
     
     
                        // 失败提示
                        alert(data.message)
                    }
                },
                "error":function(){
     
     
                    alert('操作失败')
                }
            })
        }


    </script>


<body>
</head>
    <a href="classes_list.html">返回列表页</a>

    <form id="f01">
        <table id="tid" border="1">
            <tr>
                <td>班级ID</td>
                <td><input name="cId" /> </td>
            </tr>
            <tr>
                <td>班级名称</td>
                <td><input name="cName" /> </td>
            </tr>
            <tr>
                <td>班级描述</td>
                <td>
                    <textarea cols="20" rows="5" name="desc" ></textarea>
                </td>
            </tr>
            <tr>
                <td></td>
                <td><input type="button" value="添加" onclick="add()"/></td>
            </tr>

        </table>
    </form>
</body>
</html>

2.4 修改编辑

2.4.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yihCboZZ-1618968690513)(assets/image-20201003095420732.png)]

2.4.2 分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QaNI4ZbG-1618968690514)(assets/image-20201006081113569.png)]

2.4.3 后端实现:查询详情

  • 编写service:查询详情

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oRP94wIR-1618968898273)(assets/image-20201003083011045.png)]

        /**
         * 查询详情
         * @param classId
         * @return
         */
        public Classes findById(String classId){
          
          
            Classes classes = classesMapper.selectByPrimaryKey(classId);
            return classes;
        }
    
    
  • 编写controller

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zHeT6QM-1618968898274)(assets/image-20201003083102703.png)]

   /**
     * 查询详情
     * @param classId
     * @return
     */
    @GetMapping("/{id}")
    public BaseResult findById(@PathVariable("id") String classId ){
    
    
        // 查询
        Classes classes = classesService.findById(classId);
        // 返回
        return BaseResult.ok("查询成功", classes);
    }

  • 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCDr2LwP-1618968898275)(assets/image-20201003093516322.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sroqwzff-1618968898275)(assets/image-20201003093544480.png)]

2.4.4 后端实现:更新

  • 编写service:更新方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0rvReTXg-1618968898276)(assets/image-20201003083011045.png)]

        /**
         * 更新操作
         * @param classes
         * @return
         */
        public boolean update(Classes classes){
          
          
            // 更新非空项
            int count = classesMapper.updateByPrimaryKeySelective(classes);
            return count == 1;
        }
    
  • 编写controller

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMhHdgiP-1618968898278)(assets/image-20201003083102703.png)]

    /**
     * 更新操作
     * @param classes
     * @return
     */
    @PutMapping
    public BaseResult update(@RequestBody Classes classes){
    
    
        // 添加
        boolean result = classesService.update(classes);
        // 返回
        if(result){
    
    
            return BaseResult.ok("更新成功");
        } else {
    
    
            return BaseResult.error("更新失败");
        }
    }
  • 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xGlXDgnX-1618968898279)(assets/image-20201003093626610.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRjMsmrB-1618968898280)(assets/image-20201003093643622.png)]

2.4.5 前端实现

  • 修改列表页面,编写访问路径

    <a href="classes_edit.html?id=${classes.cId}">修改</a>
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ssn1Ldd9-1618969899134)(assets/image-20201003094126163.png)]

  • 表单回显

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级列表</title>

    <script type="text/javascript" src="js/jquery-3.3.1.js"></script>
    <script type="text/javascript" src="js/form2json-2.1.js"></script>

    <script>

        $(function(){
     
     
            // 查询所有
            findAll();

        });

		// 查询所有函数
        function findAll() {
     
     
            $.ajax({
     
     
                "url":"/classes",
                "type":"get",
                "dataType":"json",
                "success": function(data){
     
     
                    // 处理
                    if(data.code == 1){
     
     
                        // 追加数据
                        $(data.data).each(function(index, classes){
     
     
                            $("#tid").append(`
                                <tr>
                                    <td>${
       
       classes.cId}</td>
                                    <td>${
       
       classes.cname}</td>
                                    <td>${
       
       classes.desc}</td>
                                    <td>
                                        <a href="classes_edit.html?id=${
       
       classes.cId}">修改</a>
                                        <a href="javascript:deleteClasses('${
       
       classes.cId}')" >删除</a>
                                    </td>
                                </tr>
                            `);
                        })
                    } else {
     
     
                        alert(data.message)
                    }
                },
                "error": function() {
     
     
                    alert('操作失败')
                }
            })
        }

    </script>


<body>
</head>
    <a href="classes_list.html">返回列表页</a>

    <form id="f01">
        <table id="tid" border="1">
            <tr>
                <td>班级名称</td>
                <td>
                    <input id="cName" name="cName" />
                    <!-- 使用隐藏字段,记录id信息 -->
                    <input type="hidden" id="cId" name="cId" />
                </td>
            </tr>
            <tr>
                <td>班级描述</td>
                <td>
                    <textarea cols="20" rows="5" id="desc" name="desc" ></textarea>
                </td>
            </tr>
            <tr>
                <td></td>
                <td><input type="button" value="更新" /></td>
            </tr>

        </table>
    </form>
</body>
</html>
  • 表单提交,编写edit() 函数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTnqOPxm-1618969899136)(assets/image-20201003100734491.png)]

        // 编辑
        function edit() {
    
    
            // 获得表单数据
            var obj = $("#f01").formToJson();

            $.ajax({
    
    
                "url":"/classes",
                "type":"put",
                "contentType":"application/json;charset=UTF-8",
                "data": obj,
                "dataType":"json",
                "success":function(data){
    
    
                    // 处理
                    if(data.code == 1) {
    
    
                        // 成功提示
                        alert(data.message)
                        // 跳转
                        location.href = "classes_list.html"
                    } else {
    
    
                        // 失败提示
                        alert(data.message)
                    }
                },
                "error":function(){
    
    
                    alert('操作失败')
                }
            })
 		}

2.5 删除班级

2.5.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-slmThhu5-1618970004856)(assets/image-20201003100757522.png)]

2.5.2 分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7RB6L9C-1618970004858)(assets/image-20201006093613819.png)]

2.5.3 后端实现

  • 编写service

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RWoaXymb-1618970004862)(assets/image-20201003083011045.png)]

        /**
         * 通过id删除详情
         * @param classId
         * @return
         */
        public boolean deleteById(String classId) {
          
          
            int count = classesMapper.deleteByPrimaryKey(classId);
            return count == 1;
        }
    
  • 编写controller

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4D1YjaRn-1618970004864)(assets/image-20201003083102703.png)]

    /**
     * 查询详情
     * @param classId
     * @return
     */
    @DeleteMapping("/{id}")
    public BaseResult deleteById(@PathVariable("id") String classId ){
    
    
        // 查询
        boolean result = classesService.deleteById(classId);
        // 返回
        if(result){
    
    
            return BaseResult.ok("删除成功");
        } else {
    
    
            return BaseResult.error("删除失败");
        }
    }
  • 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H7icDBKk-1618970004865)(assets/image-20201003095846421.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gph5cyl2-1618970004866)(assets/image-20201003095906437.png)]

3.5.4 前端实现

  • 修改列表页面,添加删除功能

    <a href="javascript:del('${classes.cId}')">删除</a>
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D4E1zg7u-1618970640823)(assets/image-20201003100837130.png)]

  • 编写删除函数
// 删除
        function del(id) {
    
    
            // 询问
            if(! confirm('您确定要删除么')){
    
    
                return false;
            }

            // ajax 删除
            $.ajax({
    
    
                "url":"/classes/" + id,
                "type":"delete",
                "dataType":"json",
                "success":function(data){
    
    
                    // 处理
                    if(data.code == 1) {
    
    
                        // 成功提示
                        alert(data.message)
                        // 跳转
                        location.href = "classes_list.html"
                    } else {
    
    
                        // 失败提示
                        alert(data.message)
                    }
                },
                "error":function(){
    
    
                    alert('操作失败')
                }
            })
        }

3. 单表:学生管理(巩固)

3.1 学生SQL(数据库)

# 学生表
create table tb_student(
  s_id varchar(32) primary key comment '学生ID',
  sname varchar(50) comment '姓名',
  age int comment '年龄',
  birthday datetime comment '生日',
  gender char(1) comment '性别',
  c_id varchar(32)
);
alter table tb_student add constraint foreign key (c_id) references tb_class (c_id);

insert into tb_student(`s_id`,`sname`,`age`,`birthday`,`gender`,`c_id`) values('s001','赵三',19,'2001-01-17','1','c001');
insert into tb_student(`s_id`,`sname`,`age`,`birthday`,`gender`,`c_id`) values('s002','钱四',19,'2001-05-16','1','c001');
insert into tb_student(`s_id`,`sname`,`age`,`birthday`,`gender`,`c_id`) values('s003','孙五',18,'2002-03-15','1','c001');
insert into tb_student(`s_id`,`sname`,`age`,`birthday`,`gender`,`c_id`) values('s004','李三',19,'2001-04-14','0','c002');
insert into tb_student(`s_id`,`sname`,`age`,`birthday`,`gender`,`c_id`) values('s005','周四',19,'2001-02-13','0','c002');
insert into tb_student(`s_id`,`sname`,`age`,`birthday`,`gender`,`c_id`) values('s006','王五',18,'2002-06-12','1','c002');

3.2 查询所有学生

3.2.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dhAyweGZ-1619007194201)(assets/image-20201003103138623.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dkfDLImP-1619007194205)(assets/image-20201003103651190.png)]

3.2.2 后端实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6BdScSSo-1619007194208)(assets/image-20201003102633680.png)]

  • 编写JavaBean

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xek4YEa7-1619007194210)(assets/image-20201003102750507.png)]

    package com.czxy.domain;
    
    import javax.persistence.Column;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import java.util.Date;
    
    /**
     * @author 桐叔
     * @email [email protected]
     */
    @Table(name="tb_student")
    public class Student {
          
          
    
        @Id
        @Column(name="s_id")
        private String sId;         //学生ID
    
        @Column(name="sname")
        private String sname;         //姓名
    
        @Column(name="age")
        private Integer age;         //年龄
    
        @Column(name="birthday")
        private Date birthday;         //生日
    
        @Column(name="gender")
        private String gender;      //性别
    
        @Column(name="c_id")
        private String cId;         //班级外键
    
        public String getsId() {
          
          
            return sId;
        }
    
        public void setsId(String sId) {
          
          
            this.sId = sId;
        }
    
        public String getSname() {
          
          
            return sname;
        }
    
        public void setSname(String sname) {
          
          
            this.sname = sname;
        }
    
        public Integer getAge() {
          
          
            return age;
        }
    
        public void setAge(Integer age) {
          
          
            this.age = age;
        }
    
        public Date getBirthday() {
          
          
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
          
          
            this.birthday = birthday;
        }
    
        public String getGender() {
          
          
            return gender;
        }
    
        public void setGender(String gender) {
          
          
            this.gender = gender;
        }
    
        public String getcId() {
          
          
            return cId;
        }
    
        public void setcId(String cId) {
          
          
            this.cId = cId;
        }
    
        @Override
        public String toString() {
          
          
            return "Student{" +
                    "sId='" + sId + '\'' +
                    ", sname='" + sname + '\'' +
                    ", age=" + age +
                    ", birthday=" + birthday +
                    ", gender='" + gender + '\'' +
                    ", cId='" + cId + '\'' +
                    '}';
        }
    }
    
  • 编写Mapper

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qI05KjW0-1619007194212)(assets/image-20201003102806288.png)]

    package com.czxy.mapper;
    
    import com.czxy.domain.Student;
    import tk.mybatis.mapper.common.Mapper;
    
    /**
     * @author 桐叔
     * @email [email protected]
     */
    @org.apache.ibatis.annotations.Mapper
    public interface StudentMapper extends Mapper<Student> {
          
          
    
    }
    
    
  • 编写service

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aN8Tp3WF-1619007194214)(assets/image-20201003102834615.png)]

    package com.czxy.service;
    
    import com.czxy.domain.Student;
    import com.czxy.mapper.StudentMapper;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    /**
     * @author 桐叔
     * @email [email protected]
     */
    @Service
    @Transactional
    public class StudentService {
          
          
    
        @Resource
        private StudentMapper studentMapper;
    
        /**
         * 查询所有
         * @return
         */
        public List<Student> findAll(){
          
          
            List<Student> list = studentMapper.selectAll();
            return list;
        }
    
    }
    
    
  • 编写controller

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqzmZBWB-1619007194215)(assets/image-20201003102857211.png)]

    package com.czxy.controller;
    
    import com.czxy.domain.Student;
    import com.czxy.service.StudentService;
    import com.czxy.vo.BaseResult;
    import org.springframework.web.bind.annotation.*;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    /**
     * @author 桐叔
     * @email [email protected]
     */
    @RestController
    @RequestMapping("/student")
    public class StudentController {
          
          
    
        @Resource
        private StudentService studentService;
    
        /**
         * 查询所有
         * @return
         */
        @GetMapping
        public BaseResult findAll(){
          
          
            // 查询
            List<Student> list = studentService.findAll();
            // 返回
            return BaseResult.ok("查询成功", list );
        }
    }
    
    
  • 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMfJUjtp-1619007194215)(assets/image-20201003102942681.png)]

3.2.3 前端实现

  • 修改首页:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EpmFZtlD-1619008051339)(assets/image-20201003103842879.png)]

  • 创建student_list.html 页面

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z67HZive-1619008051342)(assets/image-20201003103901062.png)]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级列表</title>

    <script type="text/javascript" src="js/jquery-3.3.1.js"></script>

    <script>
        $(function(){
     
     

            // 查询所有
            findAll();
        });

        //查询所有函数
        function findAll() {
     
     

            // 查询
            $.ajax({
     
     
                "url":"/student",
                "type":"get",
                "dataType":"json",
                "success":function(data){
     
     
                    // 处理
                    if(data.code == 1) {
     
     
                        // 重置table
                        $("#tid").html(`
                            <tr>
                                <td>学生ID</td>
                                <td>班级ID</td>
                                <td>学生姓名</td>
                                <td>年龄</td>
                                <td>生日</td>
                                <td>性别</td>
                                <td>操作</td>
                            </tr>
                        `);
                        // 追加
                        $(data.data).each(function(index,student){
     
     
                            $("#tid").append(`
                                <tr>
                                    <td>${
       
       student.sId}</td>
                                    <td>${
       
       student.cId}</td>
                                    <td>${
       
       student.sname}</td>
                                    <td>${
       
       student.age}</td>
                                    <td>${
       
       student.birthday}</td>
                                    <td>${
       
       student.gender}</td>
                                    <td>
                                        <a href="">修改</a>
                                        <a href="">删除</a>
                                    </td>
                                </tr>
                            `)
                        });
                    } else {
     
     
                        //
                        alert(data.message)
                    }
                },
                "error":function(){
     
     
                    alert('操作失败')
                }
            })
        }


    </script>


</head>
<body>
    <a href="index.html">返回首页</a>
    <a href="">添加学生</a> <br/>

    <table id="tid" border="1" width="800">
        <tr>
            <td>学生ID</td>
            <td>班级ID</td>
            <td>学生姓名</td>
            <td>年龄</td>
            <td>生日</td>
            <td>性别</td>
            <td>操作</td>
        </tr>
        <!--
        <tr>
            <td>s001</td>
            <td>c001</td>
            <td>张三</td>
            <td>18</td>
            <td>2002-12-21</td>
            <td>男</td>
            <td>
                <a href="">修改</a>
                <a href="">删除</a>
            </td>
        </tr>
		-->
    </table>
</body>
</html>

3.2.4 日期处理

  • 分析

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FtDiWGxp-1619008146716)(assets/image-20201007083959586.png)]

  • 修改JavaBean,添加@JsonFormat注解

        @Column(name="birthday")
        @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
        private Date birthday;         //生日
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bCf1Ircy-1619008146719)(assets/image-20201003104200265.png)]

  • 效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j0gDxz3Y-1619008146721)(assets/image-20201003104248598.png)]

3.2.4 特殊信息处理

  • 性别数据为1或0,需要显示男或女。

    ${student.gender == 1 ? "男" : "女"}
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJgvxfM5-1619008359425)(assets/image-20201003104414172.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYbxE4g4-1619008359427)(assets/image-20201003105412336.png)]

  • 补充
== js等号,只比较值
1 == 1				--> true (整数比较整数,值都是1)
1 == '1'			--> true (整数比较字符,值都是1)

=== js全等,比较 值 + 类型
1 === 1				--> true (整数比较整数,值都是1,类型都是整数)
1 === '1'			--> false(整数比较字符,值都是1,类型不同)

三元运算:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QnjrxlP1-1619008359429)(assets/image-20201007085333603.png)]

3.3 添加班级

3.2.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eNQyJAFY-1619008637501)(assets/image-20201003110547684.png)]

3.2.2 后端实现

  • 修改service

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WWFSIb4l-1619008637502)(assets/image-20201003102834615.png)]

        /**
         * 添加学生
         * @param student
         * @return
         */
        public boolean save(Student student){
          
          
            int count = studentMapper.insert(student);
            return count == 1;
        }
    
  • 修改controller

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cSSGgQwf-1619008637504)(assets/image-20201003102857211.png)]

        /**
         * 添加学生
         * @param student
         * @return
         */
        @PostMapping
        public BaseResult save(@RequestBody Student student){
          
          
            // 添加
            boolean result = studentService.save(student);
            // 返回
            if(result){
          
          
                return BaseResult.ok("添加成功");
            } else {
          
          
                return BaseResult.error("添加失败");
            }
        }
    

3.2.3 前端实现

  • 修改学生列表

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OslgvfZZ-1619008835962)(assets/image-20201003105955821.png)]

  • 创建student_add.html页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zyfFyQSM-1619008835964)(assets/image-20201003110027900.png)]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级列表</title>

    <script type="text/javascript" src="js/jquery-3.3.1.js"></script>
    <script type="text/javascript" src="js/form2json-2.1.js"></script>

    <script>

        function add() {
     
     
            // 获得表单数据
            var obj = $("#f01").formToJson();

            $.ajax({
     
     
                "url":"/student",
                "type":"post",
                "contentType":"application/json;charset=UTF-8",
                "data": obj,
                "dataType":"json",
                "success":function(data){
     
     
                    // 处理
                    if(data.code == 1) {
     
     
                        // 成功提示
                        alert(data.message)
                        // 跳转
                        location.href = "student_list.html"
                    } else {
     
     
                        // 失败提示
                        alert(data.message)
                    }
                },
                "error":function(){
     
     
                    alert('操作失败')
                }
            })
        }


    </script>


<body>
</head>
    <a href="student_list.html">返回列表页</a>

    <form id="f01">
        <table id="tid" border="1">
            <tr>
                <td>学生</td>
                <td><input name="sId" /> </td>
            </tr>
            <tr>
                <td>班级ID</td>
                <td><input name="cId" /> </td>
            </tr>
            <tr>
                <td>姓名</td>
                <td><input name="sname" /> </td>
            </tr>
            <tr>
                <td>年龄</td>
                <td><input name="age" /> </td>
            </tr>
            <tr>
                <td>生日</td>
                <td><input name="birthday" /> </td>
            </tr>
            <tr>
                <td>性别</td>
                <td>
                    <input type="radio" name="gender" value="1" /><input type="radio" name="gender" value="0" /></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="button" value="添加" onclick="add()"/></td>
            </tr>

        </table>
    </form>
</body>
</html>

3.4 修改班级

3.2.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xks3IU8J-1619008937810)(assets/image-20201003112310571.png)]

3.2.2 后端实现:查询详情

  • 修改service

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d853QjXm-1619009008749)(assets/image-20201003102834615.png)

        /**
         * 查询详情
         * @param studentId
         * @return
         */
        public Student findById(String studentId){
          
          
            Student student = studentMapper.selectByPrimaryKey(studentId);
            return student;
        }
    
  • 修改controller

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rKTVojTL-1619009008751)(assets/image-20201003102857211.png)]

        /**
         * 查询详情
         * @param studentId
         * @return
         */
        @GetMapping("/{id}")
        public BaseResult findById(@PathVariable("id") String studentId ){
          
          
            // 查询
            Student student = studentService.findById(studentId);
            // 返回
            return BaseResult.ok("查询成功", student);
        }
    
  • 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4NEVYFTI-1619009008753)(assets/image-20201003111011144.png)]

3.2.3 后端实现:更新

  • 修改service

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Bz4P4zH-1619009188158)(assets/image-20201003102834615.png)]

        /**
         * 更新操作
         * @param student
         * @return
         */
        public boolean update(Student student){
          
          
            // 更新非空项
            int count = studentMapper.updateByPrimaryKeySelective(student);
            return count == 1;
        }
    
    
  • 修改controller

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9RrRQayk-1619009188160)(assets/image-20201003102857211.png)]

        /**
         * 更新操作
         * @param student
         * @return
         */
        @PutMapping
        public BaseResult update(@RequestBody Student student){
          
          
            // 添加
            boolean result = studentService.update(student);
            // 返回
            if(result){
          
          
                return BaseResult.ok("更新成功");
            } else {
          
          
                return BaseResult.error("更新失败");
            }
        }
    
  • 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWynHoYf-1619009188161)(assets/image-20201003111047422.png)]

3.2.4 前端实现

  • 修改列表页面

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmELZfuK-1619009399251)(assets/image-20201003111910103.png)]

  • 创建 student_edit.html ,用于 表单回显,

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>班级列表</title>
    
        <script type="text/javascript" src="js/jquery-3.3.1.js"></script>
        <script type="text/javascript" src="js/form2json-2.1.js"></script>
    
        <script>
            $(function(){
           
           
                // 获得id
                var arr = location.href.split("?id=")
                var id = arr[1]
    
                // 查询详情,用于表单回显
                $.ajax({
           
           
                    "url":"/student/" + id,
                    "type":"get",
                    "dataType":"json",
                    "success":function(data){
           
           
                        // 处理
                        if(data.code == 1) {
           
           
                            var student = data.data;
                            $("#sId").val(student.sId);
                            $("#cId").val(student.cId);
                            $("#sname").val(student.sname);
                            $("#age").val(student.age);
                            $("#birthday").val(student.birthday);
                            if(student.gender == '1'){
           
           
                                $("#male").attr("checked",true);
                            } else {
           
           
                                $("#female").attr("checked",true);
                            }
                        } else {
           
           
                            // 失败回显
                            alert(data.message)
                        }
                    },
                    "error":function(){
           
           
                        alert('操作失败')
                    }
                })
    
            });
    
    
    
        </script>
    
    
    <body>
    </head>
        <a href="student_list.html">返回列表页</a>
    
        <form id="f01">
            <table id="tid" border="1">
                <tr>
                    <td>班级ID</td>
                    <td>
                        <input id="cId" name="cId" />
                        <input type="hidden" id="sId" name="sId" />
                    </td>
                </tr>
                <tr>
                    <td>姓名</td>
                    <td><input id="sname" name="sname" /> </td>
                </tr>
                <tr>
                    <td>年龄</td>
                    <td><input id="age" name="age" /> </td>
                </tr>
                <tr>
                    <td>生日</td>
                    <td><input id="birthday" name="birthday" /> </td>
                </tr>
                <tr>
                    <td>性别</td>
                    <td>
                        <input type="radio" id="male" name="gender" value="1" /><input type="radio" id="female" name="gender" value="0" /></td>
                </tr>
                <tr>
                    <td></td>
                    <td><input type="button" value="添加" /></td>
                </tr>
    
            </table>
        </form>
    </body>
    </html>
    
  • 提交表单

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLoudU3l-1619009399252)(assets/image-20201003112148235.png)]

    function edit() {
          
          
                // 获得表单数据
                var obj = $("#f01").formToJson();
    
                $.ajax({
          
          
                    "url":"/student",
                    "type":"put",
                    "contentType":"application/json;charset=UTF-8",
                    "data": obj,
                    "dataType":"json",
                    "success":function(data){
          
          
                        // 处理
                        if(data.code == 1) {
          
          
                            // 成功提示
                            alert(data.message)
                            // 跳转
                            location.href = "student_list.html"
                        } else {
          
          
                            // 失败提示
                            alert(data.message)
                        }
                    },
                    "error":function(){
          
          
                        alert('操作失败')
                    }
                })
            }
    

3.5 删除班级

3.2.1 需求

3.2.2 后端实现

  • 修改service

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0EZC2TXS-1619009572765)(assets/image-20201003102834615.png)]

        /**
         * 通过id删除详情
         * @param studentId
         * @return
         */
        public boolean deleteById(String studentId) {
          
          
            int count = studentMapper.deleteByPrimaryKey(studentId);
            return count == 1;
        }
    
    
  • 修改controller

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RRd5mN0d-1619009572766)(assets/image-20201003102857211.png)]

    /**
         * 通过id删除
         * @param studentId
         * @return
         */
        @DeleteMapping("/{id}")
        public BaseResult deleteById(@PathVariable("id") String studentId ){
          
          
            // 查询
            boolean result = studentService.deleteById(studentId);
            // 返回
            if(result){
          
          
                return BaseResult.ok("删除成功");
            } else {
          
          
                return BaseResult.error("删除失败");
            }
        }
    
  • 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-stZ9KA66-1619009572768)(assets/image-20201003112448704.png)]

3.2.3 前端实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vfNc1GQ9-1619009783422)(assets/image-20201003112542718.png)]

// 删除
        function del(id) {
    
    
            // 询问
            if(! confirm('您确定要删除么')){
    
    
                return false;
            }

            // ajax 删除
            $.ajax({
    
    
                "url":"/student/" + id,
                "type":"delete",
                "dataType":"json",
                "success":function(data){
    
    
                    // 处理
                    if(data.code == 1) {
    
    
                        // 成功提示
                        alert(data.message)
                        // 跳转
                        location.href = "student_list.html"
                    } else {
    
    
                        // 失败提示
                        alert(data.message)
                    }
                },
                "error":function(){
    
    
                    alert('操作失败')
                }
            })
        }

4. 单表:条件查询

4.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b0EKoWSP-1619009939175)(assets/image-20201003114854735.png)]

<table id="f02">
        <tr>
            <td>班级</td>
            <td>
                <select name="" id="classId">
                    <option value="">--选择班级--</option>
                    <option value="c001">--Java12--</option>
                    <option value="c002">--Java34--</option>
                </select>
            </td>
            <td>姓名:</td>
            <td>
                <input type="text" placeholder="请输入姓名" id="sname" size="10">
            </td>
            <td>年龄:</td>
            <td>
                <input type="text" placeholder="请输入开始年龄" id="startAge" size="10">
                --
                <input type="text" placeholder="请输入结束年龄" id="endAge" size="10">
            </td>
            <td><input type="button" value="查询" onclick="condition()"></td>
        </tr>
    </table>

4.2 分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMrrF7wH-1619009939177)(assets/image-20201003113128523.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e3Zgxq3B-1619009939180)(assets/image-20201008082544244.png)]

4.3 后端实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DIORCSut-1619010322343)(assets/image-20201003113249327.png)]

  • 编写 StudentVo

    package com.czxy.vo;
    
    /**
     * @author 桐叔
     * @email [email protected]
     */
    public class StudentVo {
          
          
        private String classId;     //班级
        private String sname;       //姓名
        private String startAge;    //开始年龄
        private String endAge;      //结束年龄
    
        public String getClassId() {
          
          
            return classId;
        }
    
        public void setClassId(String classId) {
          
          
            this.classId = classId;
        }
    
        public String getSname() {
          
          
            return sname;
        }
    
        public void setSname(String sname) {
          
          
            this.sname = sname;
        }
    
        public String getStartAge() {
          
          
            return startAge;
        }
    
        public void setStartAge(String startAge) {
          
          
            this.startAge = startAge;
        }
    
        public String getEndAge() {
          
          
            return endAge;
        }
    
        public void setEndAge(String endAge) {
          
          
            this.endAge = endAge;
        }
    
        @Override
        public String toString() {
          
          
            return "StudentVo{" +
                    "classId='" + classId + '\'' +
                    ", sname='" + sname + '\'' +
                    ", startAge='" + startAge + '\'' +
                    ", endAge='" + endAge + '\'' +
                    '}';
        }
    }
    
    
  • 编写service

       /**
         * 查询所有
         * @return
         */
        public List<Student> findAllByCondition(StudentVo studentVo){
          
          
            // 拼凑条件
            Example example = new Example(Student.class);
            Example.Criteria criteria = example.createCriteria();
            if(studentVo != null){
          
          
                //等值查询
                if(studentVo.getClassId() != null && !"".equals(studentVo.getClassId())) {
          
          
                    criteria.andEqualTo("cId",studentVo.getClassId());
                }
                // 模糊查询
                if(studentVo.getSname() != null && !"".equals(studentVo.getSname())) {
          
          
                    criteria.andLike("sname","%"+studentVo.getSname()+"%");
                }
                // 区间查询
                if(studentVo.getStartAge() != null && !"".equals(studentVo.getStartAge())){
          
          
                    criteria.andGreaterThanOrEqualTo("age",studentVo.getStartAge());
                }
                if(studentVo.getEndAge() != null && !"".equals(studentVo.getEndAge())) {
          
          
                    criteria.andLessThanOrEqualTo("age",studentVo.getEndAge());
                }
            }
    
            // 条件查询
            List<Student> list = studentMapper.selectByExample(example);
            return list;
        }
    
  • 编写controller

        /**
         * 条件查询
         * @param studentVo
         * @return
         */
        @PostMapping("/condition")
        public BaseResult conditioin(@RequestBody StudentVo studentVo){
          
          
            // 添加
            List<Student> list = studentService.findAllByCondition(studentVo);
            // 返回
            // 返回
            return BaseResult.ok("查询成功", list );
        }
    

    4.4 前端实现

  • 编写查询条件表单(注意:表单元素的name属性)

<form id="f02">
        <table>
            <tr>
                <td>班级</td>
                <td>
                    <select name="classId" id="classId">
                        <option value="">--选择班级--</option>
                        <option value="c001">--Java12--</option>
                        <option value="c002">--Java34--</option>
                    </select>
                </td>
                <td>姓名:</td>
                <td>
                    <input type="text" placeholder="请输入姓名" id="sname" name="sname" size="10">
                </td>
                <td>年龄:</td>
                <td>
                    <input type="text" placeholder="请输入开始年龄" id="startAge" name="startAge" size="10">
                    --
                    <input type="text" placeholder="请输入结束年龄" id="endAge" name="endAge" size="10">
                </td>
                <td><input type="button" value="查询" onclick="condition()"></td>
            </tr>
        </table>
    </form>
  • 编写条件查询函数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3kAlc6XO-1619010404555)(assets/image-20201003191737145.png)]

// 条件查询
        function condition() {
    
    
            // 条件
            // 获得表单数据
            var obj = $("#f02").formToJson();

            // 查询
            $.ajax({
    
    
                "url":"/student/condition",
                "type":"post",
                "contentType":"application/json;charset=UTF-8",
                "data": obj,
                "dataType":"json",
                "success":function(data){
    
    
                    // 处理
                    if(data.code == 1) {
    
    
                        // 重置table
                        $("#tid").html(`
                            <tr>
                                <td>学生ID</td>
                                <td>班级ID</td>
                                <td>学生姓名</td>
                                <td>年龄</td>
                                <td>生日</td>
                                <td>性别</td>
                                <td>操作</td>
                            </tr>
                        `);
                        // 追加
                        $(data.data).each(function(index,student){
    
    
                            $("#tid").append(`
                                <tr>
                                    <td>${
      
      student.sId}</td>
                                    <td>${
      
      student.cId}</td>
                                    <td>${
      
      student.sname}</td>
                                    <td>${
      
      student.age}</td>
                                    <td>${
      
      student.birthday}</td>
                                    <td>${
      
      student.gender == 1 ? "男" : "女"}</td>
                                    <td>
                                        <a href="student_edit.html?id=${
      
      student.sId}">修改</a>
                                        <a href="javascript:del('${
      
      student.sId}')">删除</a>
                                    </td>
                                </tr>
                            `)
                        });
                    } else {
    
    
                        //
                        alert(data.message)
                    }
                },
                "error":function(){
    
    
                    alert('操作失败')
                }
            })
        }

5. 多表

5.1 关联查询

5.1.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C8S9gOHK-1619010457276)(assets/image-20201003192624181.png)]

5.1.2 后端实现

  • 修改JavaBean,修改Student类,添加 classes 属性

    private Classes classes;    //班级对象
    // 并生成对应的getter和setter方法
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-90VlQhkQ-1619010457277)(assets/image-20201003193458315.png)]

  • 修改service,添加关联查询代码

    • 注入 classesMapper

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BUgjpJFq-1619010457280)(assets/image-20201003193743549.png)]

    • 修改条件查询方法

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C6lQ0rJ8-1619010457282)(assets/image-20201003194038963.png)]

5.1.3 前端实现

  • 查询所有:显示学生对应的班级信息

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RFCc99eU-1619010610387)(assets/image-20201003194428941.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6GlW4JFi-1619010610389)(assets/image-20201003194609146.png)]

// ${表达式 ? true : false }
${
    
    student.classes ? student.classes.cName : ''}
  • 条件查询

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6iKdehwB-1619010610391)(assets/image-20201003194820365.png)]

5.2 添加学生

  • 已有功能:手写班级id(外键)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SuksGmdz-1619010726986)(assets/image-20201003213033670.png)]

  • 硬编码:通过下拉列表获得“班级ID”

    <select name="cId">
         <option value="">--请选择--</option>
         <option value="c001">Java12班</option>
         <option value="c002">Java34班</option>
    </select>
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nZ4p2G9c-1619010726988)(assets/image-20201003220243991.png)]

  • ajax查询:页面加载成功后,查询所有班级,并以下拉列表框展示

在这里插入图片描述

$(function(){
    
    
            // 查询所有班级,并添加到下拉列表框中
            $.ajax({
    
    
                "url":"/classes",
                "type":"get",
                "dataType":"json",
                "success":function(data){
    
    
                    // 处理
                    if(data.code == 1) {
    
    
                        // 重置table
                        $("#cId").html(`
                            <option value="">--请选择--</option>
                        `);
                        // 追加
                        $(data.data).each(function(index,classes){
    
    
                            $("#cId").append(`
                                <option value="${
      
      classes.cId}">${
      
      classes.cName}</option>
                            `)
                        });
                    } else {
    
    
                        // 查询失败
                        alert(data.message)
                    }
                },
                "error":function(){
    
    
                    alert('操作失败')
                }
            })

        });

5.3 修改学生

  • 使用下拉列表替换文本框

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GLk0cY5I-1619010812096)(assets/image-20201003220359762.png)]

  • 页面加载成功后,查询所有班级,班级信息显示后,查询学生详情

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jA4UJAsN-1619010812099)(assets/image-20201003220758804.png)]

// 页面加载成功
        $(function(){
    
    
            // 查询所有班级
            findAllClasses();
        });

        // 查询所有班级,成功显示,调用“学生详情”
        function findAllClasses() {
    
    
            $.ajax({
    
    
                "url":"/classes",
                "type":"get",
                "dataType":"json",
                "success":function(data){
    
    
                    // 处理
                    if(data.code == 1) {
    
    
                        // 重置table
                        $("#cId").html(`
                            <option value="">--请选择--</option>
                        `);
                        // 追加
                        $(data.data).each(function(index,classes){
    
    
                            $("#cId").append(`
                                <option value="${
      
      classes.cId}">${
      
      classes.cName}</option>
                            `)
                        });

                        // 班级查询完成,查询学生
                        findStudentById();
                    } else {
    
    
                        // 查询失败
                        alert(data.message)
                    }
                },
                "error":function(){
    
    
                    alert('操作失败')
                }
            })
        }
        // 通过id查询学生详情
        function findStudentById(){
    
    
            // 获得id
            var arr = location.href.split("?id=")
            var id = arr[1]

            // 查询详情,用于表单回显
            $.ajax({
    
    
                "url":"/student/" + id,
                "type":"get",
                "dataType":"json",
                "success":function(data){
    
    
                    // 处理
                    if(data.code == 1) {
    
    
                        var student = data.data;
                        $("#sId").val(student.sId);
                        $("#cId").val(student.cId);
                        $("#sname").val(student.sname);
                        $("#age").val(student.age);
                        $("#birthday").val(student.birthday);
                        if(student.gender == '1'){
    
    
                            $("#male").attr("checked",true);
                        } else {
    
    
                            $("#female").attr("checked",true);
                        }
                    } else {
    
    
                        // 失败回显
                        alert(data.message)
                    }
                },
                "error":function(){
    
    
                    alert('操作失败')
                }
            })
        }

5.4 删除班级

5.4.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W744FOkx-1619010893220)(assets/image-20201003221639441.png)]

5.4.2 后端实现

  • 修改service:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P5UHu7jw-1619010893221)(assets/image-20201003221717264.png)]

        /**
         * 通过id删除详情
         * @param classId
         * @return
         */
        public boolean deleteById(String classId) {
          
          
            // 查询指定班级id的学生数
            Example example = new Example(Student.class);
            Example.Criteria criteria = example.createCriteria();
            criteria.andEqualTo("cId", classId);
            int studentCount = studentMapper.selectCountByExample(example);
            if(studentCount > 0) {
          
          
                throw new RuntimeException("班级已关联学生,不能删除");
            }
    
            int count = classesMapper.deleteByPrimaryKey(classId);
            return count == 1;
        }
    
  • 修改controller:

        /**
         * 查询详情
         * @param classId
         * @return
         */
        @DeleteMapping("/{id}")
        public BaseResult deleteById(@PathVariable("id") String classId ){
          
          
            try {
          
          
                // 查询
                boolean result = classesService.deleteById(classId);
                // 返回
                if(result){
          
          
                    return BaseResult.ok("删除成功");
                } else {
          
          
                    return BaseResult.error("删除失败");
                }
            } catch (Exception e) {
          
          
                return BaseResult.error(e.getMessage());
            }
        }
    

    6. 分页

6.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zO4FSFWT-1619010989509)(assets/image-20201004224817287.png)]

6.2 分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jyE4W7yb-1619010989511)(assets/image-20201008145008530.png)]

6.2 后端实现

  • 修改controller:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bwoWsVXN-1619010989513)(assets/image-20201004220103089.png)]

    /**
     * 条件查询
     * @param studentVo
     * @return
     */
    @PostMapping("/condition/{pagesize}/{pagenum}")
    public BaseResult conditioin(@RequestBody StudentVo studentVo, @PathVariable("pagenum") Integer pagesize , @PathVariable("pagesize") Integer pagenum){
    
    
        // 添加
        PageInfo<Student> pageInfo = studentService.findAllByCondition(studentVo,pagesize,pagenum);
        // 返回
        // 返回
        return BaseResult.ok("查询成功", pageInfo);
    }
  • 修改 service
 /**
     * 查询所有 + 分页
     * @return
     */
    public PageInfo<Student> findAllByCondition(StudentVo studentVo, Integer pageSize, Integer pageNum){
    
    
        // 拼凑条件
        Example example = new Example(Student.class);
        Example.Criteria criteria = example.createCriteria();
        if(studentVo != null){
    
    
            //等值查询
            if(studentVo.getClassId() != null && !"".equals(studentVo.getClassId())) {
    
    
                criteria.andEqualTo("cId",studentVo.getClassId());
            }
            // 模糊查询
            if(studentVo.getSname() != null && !"".equals(studentVo.getSname())) {
    
    
                criteria.andLike("sname","%"+studentVo.getSname()+"%");
            }
            // 区间查询
            if(studentVo.getStartAge() != null && !"".equals(studentVo.getStartAge())){
    
    
                criteria.andGreaterThanOrEqualTo("age",studentVo.getStartAge());
            }
            if(studentVo.getEndAge() != null && !"".equals(studentVo.getEndAge())) {
    
    
                criteria.andLessThanOrEqualTo("age",studentVo.getEndAge());
            }
        }

        // 分页
        PageHelper.startPage(pageNum,pageSize);

        // 条件查询
        List<Student> list = studentMapper.selectByExample(example);

        // 关联查询
        for(Student student : list){
    
    
            // 查询班级外键对应的对象
            Classes classes = classesMapper.selectByPrimaryKey(student.getcId());
            student.setClasses(classes);
        }

        // 分页封装
        PageInfo pageInfo = new PageInfo(list);
        return pageInfo;
    }

6.3 前端实现

  • 修改条件查询函数,添加分页参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BV2DEXVU-1619010989517)(assets/image-20201004223503104.png)]

  • 修改条件查询函数,修改返回结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lieZX1Rz-1619010989519)(assets/image-20201004223928131.png)]

  • 修改查询按钮

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTW11Z1I-1619010989520)(assets/image-20201004223553571.png)]

  • 显示分页条

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vPvDgf7f-1619010989520)(assets/image-20201004224700084.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AySvfXvR-1619010989521)(assets/image-20201004224723292.png)]

6.4 前端完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级列表</title>

    <script type="text/javascript" src="js/jquery-3.3.1.js"></script>
    <script type="text/javascript" src="js/form2json-2.1.js"></script>

    <script>
        $(function(){
     
     

            // 查询所有
            //findAll();

            // 条件查询
            condition(2,1);
        });

        //查询所有函数
        function findAll() {
     
     

            // 查询
            $.ajax({
     
     
                "url":"/student",
                "type":"get",
                "dataType":"json",
                "success":function(data){
     
     
                    // 处理
                    if(data.code == 1) {
     
     
                        // 重置table
                        $("#tid").html(`
                            <tr>
                                <td>学生ID</td>
                                <td>班级</td>
                                <td>学生姓名</td>
                                <td>年龄</td>
                                <td>生日</td>
                                <td>性别</td>
                                <td>操作</td>
                            </tr>
                        `);
                        // 追加
                        $(data.data).each(function(index,student){
     
     
                            $("#tid").append(`
                                <tr>
                                    <td>${
       
       student.sId}</td>
                                    <td>${
       
       student.classes ? student.classes.cName : ''}</td>
                                    <td>${
       
       student.sname}</td>
                                    <td>${
       
       student.age}</td>
                                    <td>${
       
       student.birthday}</td>
                                    <td>${
       
       student.gender == 1 ? "男" : "女"}</td>
                                    <td>
                                        <a href="student_edit.html?id=${
       
       student.sId}">修改</a>
                                        <a href="javascript:del('${
       
       student.sId}')">删除</a>
                                    </td>
                                </tr>
                            `)
                        });
                    } else {
     
     
                        //
                        alert(data.message)
                    }
                },
                "error":function(){
     
     
                    alert('操作失败')
                }
            })
        }

        // 删除
        function del(id) {
     
     
            // 询问
            if(! confirm('您确定要删除么')){
     
     
                return false;
            }

            // ajax 删除
            $.ajax({
     
     
                "url":"/student/" + id,
                "type":"delete",
                "dataType":"json",
                "success":function(data){
     
     
                    // 处理
                    if(data.code == 1) {
     
     
                        // 成功提示
                        alert(data.message)
                        // 跳转
                        location.href = "student_list.html"
                    } else {
     
     
                        // 失败提示
                        alert(data.message)
                    }
                },
                "error":function(){
     
     
                    alert('操作失败')
                }
            })
        }

        // 条件查询
        function condition(pageSize,pageNum) {
     
     
            // 条件
            // 获得表单数据
            var obj = $("#f02").formToJson();

            // 查询
            $.ajax({
     
     
                "url":`/student/condition/${
       
       pageSize}/${
       
       pageNum}`,     ///student/condition/每页个数/当前页
                "type":"post",
                "contentType":"application/json;charset=UTF-8",
                "data": obj,
                "dataType":"json",
                "success":function(data){
     
     
                    // 处理
                    if(data.code == 1) {
     
     
                        // 重置table
                        $("#tid").html(`
                            <tr>
                                <td>学生ID</td>
                                <td>班级</td>
                                <td>学生姓名</td>
                                <td>年龄</td>
                                <td>生日</td>
                                <td>性别</td>
                                <td>操作</td>
                            </tr>
                        `);
                        // 获得分页数据
                        var pageInfo = data.data;
                        // 追加分页数据
                        $(pageInfo.list).each(function(index,student){
     
     
                            $("#tid").append(`
                                <tr>
                                    <td>${
       
       student.sId}</td>
                                    <td>${
       
       student.classes ? student.classes.cName : ''}</td>
                                    <td>${
       
       student.sname}</td>
                                    <td>${
       
       student.age}</td>
                                    <td>${
       
       student.birthday}</td>
                                    <td>${
       
       student.gender == 1 ? "男" : "女"}</td>
                                    <td>
                                        <a href="student_edit.html?id=${
       
       student.sId}">修改</a>
                                        <a href="javascript:del('${
       
       student.sId}')">删除</a>
                                    </td>
                                </tr>
                            `)
                        });
                        // 分页条
                        $("#pageId").html("");
                        
                        for(var i = 1 ; i <= pageInfo.pages; i ++){
     
     
                            $("#pageId").append(`<a href="javascript:void(0)" οnclick="condition(2,${
       
       i})">${
       
       i}</a> &nbsp;`)
                        }

                    } else {
     
     
                        //
                        alert(data.message)
                    }
                },
                "error":function(){
     
     
                    alert('操作失败')
                }
            })
        }

    </script>


</head>
<body>
    <a href="index.html">返回首页</a>
    <a href="student_add.html">添加学生</a> <br/>

    <form id="f02">
        <table>
            <tr>
                <td>班级</td>
                <td>
                    <select name="classId" id="classId">
                        <option value="">--选择班级--</option>
                        <option value="c001">--Java12--</option>
                        <option value="c002">--Java34--</option>
                    </select>
                </td>
                <td>姓名:</td>
                <td>
                    <input type="text" placeholder="请输入姓名" id="sname" name="sname" size="10">
                </td>
                <td>年龄:</td>
                <td>
                    <input type="text" placeholder="请输入开始年龄" id="startAge" name="startAge" size="10">
                    --
                    <input type="text" placeholder="请输入结束年龄" id="endAge" name="endAge" size="10">
                </td>
                <td><input type="button" value="查询" onclick="condition(2, 1)"></td>
            </tr>
        </table>
    </form>

    <table id="tid" border="1" width="800">
        <tr>

            <td>学生ID</td>
            <td>班级ID</td>
            <td>学生姓名</td>
            <td>年龄</td>
            <td>生日</td>
            <td>性别</td>
            <td>操作</td>
        </tr>
<!--        <tr>
            <td>s001</td>
            <td>c001</td>
            <td>张三</td>
            <td>18</td>
            <td>2002-12-21</td>
            <td>男</td>
            <td>
                <a href="">修改</a>
                <a href="">删除</a>
            </td>
        </tr>-->
    </table>

    <!-- 分页条 -->
    <div id="pageId"></div>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/li13429743580/article/details/115932822