SpringBoot教学资料4-SpringBoot简单增删改查(带前端)

发布时间 2023-07-04 09:40:20作者: 临易

最终样式:

增:

 

删:

 

 

改:

 

 项目结构:

 

 

 

 

 - springboot1.5.9以下兼容jdk1.7

- springboot2.x.x版本兼容jdk1.8

- springboot3.0及以上版本兼容jdk17

- springboot2.1之后的版本已经兼容JDK11

 

pom.xml:

<?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 https://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.7.13</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.bai</groupId>
    <artifactId>crudspringboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>crudspringboot</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <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>2.3.1</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>2.3.1</version>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- tomcat 依赖包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <!--<scope>provided</scope>-->
        </dependency>
        <!-- servlet 依赖包 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <!--<scope>provided</scope>-->
        </dependency>
        <!-- JSTL (JSP standard Tag Library) JSP 标准标签库 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

application.properties:

# 监听端口
server.port=8080

# Spring datasource配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456


# 视图层的配置
spring.mvc.view.prefix=WEB-INF/views/
spring.mvc.view.suffix=.jsp

#DispatcherServlet 的配置# 启动时 加载
spring.jersey.servlet.load-on-startup=1

# MyBatis的配置# Mapper文件的位置 * 所有
mybatis.mapper-locations=classpath:mapper/*.xml
# Model 层的配置 包
mybatis.type-aliases-package=com.bai.crudspringboot.model

 

 

 user.jap:

<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!-- 简体中文 -->
<html lang="zh-cmn-Hans">

<head>
    <title>用户列表</title>
</head>

<body>
<table border="1">
    <tr>
        <td>ID</td>
        <td>Name</td>
        <td>Age</td>
        <td>删除</td>
        <td>修改</td>
    </tr>
    <c:forEach var="user" items="${users}">
        <tr>
            <td>${user.id}</td>
            <td>${user.name}</td>
            <td>${user.age}</td>
            <td><a href='javascript:userDel("${user.id}")'> 删除 </a></td>
            <td><a href="updateview?id=${user.id}"> 修改 </a></td>
        </tr>
    </c:forEach>
</table>
<br />
<br />
<a href="addview"> 新增用户 addview </a>
<br />
<br />
<a href="addview2"> 新增用户2  addview2</a>
</body>
<script src="/asset/js/jquery-3.5.1.min.js"></script>
<script type="text/javascript">
    // JS 定义一个名为userDel的js方法,可传入参数id
    function userDel(id){
        $.ajax({
            // 请求方式 POST GET 与控制器的设置一致
            type : "POST",
            // 访问控制器的url
            url : "delete",
            //往控制器传入的参数,JSON居多,String
            data : {
                "id" : id
            },
            // 接收后台的数据类型 text json 和 控制器的 return 一致
            dataType : "text",
            //请求成功时
            success : function(message) {
                if (message == "ok"){
                    alert("删除成功");
                    location.href = "alluser";
                } else {
                    alert("删除失败");
                }
            },
            //请求失败时
            error : function(message) {
                alert("删除失败");
            }
        });
    }
</script>
</html>

addview.jsp

<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!-- 简体中文 -->
<html lang="zh-cmn-Hans">
<head>
    <title>新增用户</title>
</head>
<body>
新增用户
<form id="userInfo" method="post">
    name: <input type="text" name="name" id="name"><br>
    age:  <input type="text" name="age" id="age"><br>
    <input type="button" id="commit"  value="提交">
</form>
</body>
<script src="/asset/js/jquery-3.5.1.min.js"></script>
<script>
    $(function () {
        // # 之后的变量和 id="commit" 值一致 才可以绑定
        $("#commit").click(function () {
            //id="name" 找到的
            var name = $("#name").val();
            var age = $("#age").val();
            //debugger 调试使用
            $.ajax({
                type : "POST",
                url : "add",
                data : {
                    "name" : name,
                    "age" : age
                },
                // 接收后台的数据类型
                dataType : "text",
                // 请求成功
                success : function(message) {
                    if (message == "ok"){
                        alert("新增成功");
                        // 调用显示所有用户的控制器
                        location.href = "alluser";
                    } else {
                        alert(message);
                    }
                },
                //请求失败
                error : function(message) {
                    alert("新增失败");
                }
            });
        })
    })
</script>
</html>

 

 updateview.jsp

<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!-- 简体中文 -->
<html lang="zh-cmn-Hans">
<head>
    <title>修改用户</title>
</head>
<body>
修改用户
<form id="userInfo" method="post">
    id: <input type="text" name="id" id="id" value="${user.id}" disabled="disabled"><br>
    name: <input type="text" name="name" id="name" value="${user.name}"><br>
    age:  <input type="text" name="age" id="age" value="${user.age}"><br>
    <input type="button" id="commit"  value="更新用户">
</form>
</body>
<script src="/asset/js/jquery-3.5.1.min.js"></script>
<script>
    $(function () {
        $("#commit").click(function () {
            var id = $("#id").val();
            var name = $("#name").val();
            var age = $("#age").val();
            $.ajax({
                type : "POST",
                url : "update",
                data : {
                    "id" : id,
                    "name" : name,
                    "age" : age
                },
                // 接收后台的数据类型
                dataType : "text",
                // 返回成功
                success : function(message) {
                    if (message == "ok"){
                        alert("修改成功");
                        // 调用显示所有用户的控制器
                        location.href = "alluser";
                    } else {
                       alert(message);
                    }
                },
                //失败
                error : function(message) {
                    alert("修改请求失败");
                }
            });
        })
    })
</script>
</html>

 

 User.java:

package com.bai.crudspringboot.model;

// 和数据库的表设计、字段对应的
public class User {

    private String id;
    private String name;
    private int age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

UserDao.xml:

<?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">

<!-- namespace 包名+接口名 -->
<mapper namespace="com.bai.crudspringboot.dao.UserDao">
    <resultMap id="UserMap" type="com.bai.crud_springboot.model.User">
        <id column="id" javaType="String" property="id"/>
        <result column="name" javaType="String" property="name"/>
        <result column="age" jdbcType="INTEGER" property="age" />
    </resultMap>

    <!-- id = 接口文件的 方法名
    resultType 返回值类型 要与使用的对象一致
    -->
    <select id="select" resultType="com.bai.crudspringboot.model.User">
        SELECT * FROM user order by age
    </select>

    <!-- 增加用户
    parameterType 传入的参数类型
    因为MyBatis做了优化,以接口为准

    #占位符
    MySQL客户端的SQL语句
    insert into  `user` (`id`, `name`, `age`) values ('fa4f46','张三','23');
    需要改为
    insert into `user` (`id`, `name`, `age`) values (#{id},#{name},#{age});

    'fa4f46' 改为 #{id}
    特定的值  改为 #{id}

    规范  #{类的变量名称}
    -->
    <insert id="addUser" parameterType="com.bai.crudspringboot.model.User" >
        insert into `user` (`id`, `name`, `age`)
        values (#{id},#{name},#{age});
    </insert>

    <!-- 删除用户 -->
    <delete id="delUser" parameterType="com.bai.crudspringboot.model.User" >
        delete from user where id = #{id}
    </delete>

    <select id="selectById" resultType="com.bai.crudspringboot.model.User">
        SELECT * FROM user where id = #{id}
    </select>

    <!-- 更新用户 -->
    <update id="updateUser" parameterType="com.bai.crudspringboot.model.User" >
        update user set id= #{id},name= #{name},age= #{age} where id = #{id}
    </update>

</mapper>

UserDao.java:

package com.bai.crudspringboot.dao;

import com.bai.crudspringboot.model.User;

import java.util.List;

public interface UserDao {

    // 方法名和 UserDao.xml select标签的select对应
    List<User> select();

    void addUser(User user);

    void delUser(String id);

    User selectById(String id);

    void updateUser(User user);
}

UserService.java:

package com.bai.crudspringboot.service;

import com.bai.crudspringboot.model.User;

import java.util.List;

// 用户服务层的接口
public interface UserService {

    List<User> get();

    void insert(User user);

    void remove(String id);

    User getById(String id);

    void updateInfo(User user);

}

UserServiceImpl.java:

package com.bai.crudspringboot.service.Impl;

import com.bai.crudspringboot.dao.UserDao;
import com.bai.crudspringboot.model.User;
import com.bai.crudspringboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
/*
UserService 接口的实现

@Service 以当前类为模板创建一个对象放入Spring容器中
id:默认小驼峰
此时id 是  userServiceImpl

 */
@Service
public class UserServiceImpl implements UserService {
    /*
    @Autowired
    把 Dao层的 对象,从Spring中拿出来,注入到当前Bean中
     */
    @Autowired
    private UserDao userDao;

    @Override
    public List<User> get() {

        // 因为业务简单 复杂之后代码很多
        List<User> users = userDao.select();

        return users;
    }

    @Override
    public void insert(User user) {

        userDao.addUser(user);
    }

    @Override
    public void remove(String id) {
        userDao.delUser(id);
    }

    @Override
    public User getById(String id) {
        return userDao.selectById(id);
    }

    @Override
    public void updateInfo(User user) {
        userDao.updateUser(user);
    }
}

 

UserController.java:

如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。

package com.bai.crudspringboot.controller;

import com.bai.crudspringboot.model.User;
import com.bai.crudspringboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.UUID;
/*
 以类UserController为模板
 创建一个userController对象
 存放到Spring容器中
 */
@Controller
public class UserController {
    /*
    @Autowired:在Spring容器中,找一个Bean,注入到当前Bean中
    Bean:指定的id 小驼峰
    备注:可单独使用
    配对注解
    @Qualifier
    要求 userServiceImpl Bean注入到当前Bean中
    备注:和@Autowired配合使用,服务层有多态时常用
     */
    @Autowired
    @Qualifier("userServiceImpl")
    private UserService userService;
    /*
    显示用户列表
    @RequestMapping 设置请求的参数
    value 控制器名
    method 请求方式
     */
    @RequestMapping(value = "/alluser", method = RequestMethod.GET)
    public ModelAndView alluser() {
        List<User> usersResult = userService.get();
        ModelAndView mav = new ModelAndView();
        // 视图的名字 .jsp不带
        mav.setViewName("user");
        //携带的数据,让试图去展示
        mav.addObject("users", usersResult);
        return mav;
    }
    /*
    第一种写法
    跳入到新增用户的 jsp
     */
    @RequestMapping(value = "/addview", method = RequestMethod.GET)
    public ModelAndView addview() {

        ModelAndView mav = new ModelAndView();
        mav.setViewName("addview");

        return mav;
    }
    /*
    第二种写法
    跳入到新增用户的 jsp
    请求方式默认是 GET
     */
    @RequestMapping(value = "addview2")
    public String addView2() {
        return "addview";
    }
    /*
     接收用户提交过来的用户信息

     @ResponseBody = 应答 消息体
     不在让此方法去视图解析题
     而是 在请求过来的http的消息体中写入返回的值,给客户端(jsp页面、第三方、软件客户端等)

     控制器 add
     方法 add
     必须一致吗?不是
     一致是因为,方便、快捷、整洁
     */
    @ResponseBody
    @RequestMapping(value = "add", method = RequestMethod.POST)
    public String add(HttpServletRequest request, User user) {
        if (user.getAge() <0 || user.getAge() >200){
            return "年龄不正确";
        }

        // 生成一个 id
        String id = UUID.randomUUID().toString();

        user.setId(id);

        //调用服务层方法增加一个用户
        userService.insert(user);
        return "ok";
    }
    /*
    删除用户
    只在方法上有此注解
    @RequestMapping(value = "delete"
    访问方式 域名:端口/delete

    类和方法上有此注解
    类 @RequestMapping(value = "/user"
    方法 @RequestMapping(value = "/delete"
    访问方式 域名:端口/user/delete
     */
    @ResponseBody
    @RequestMapping(value = "delete", method = RequestMethod.POST)
    public String delete(HttpServletRequest request, String id) {
        /*
        调用服务层方法 删除一个用户
        此方法并不非常严谨,待改进
         */
        userService.remove(id);

        return "ok";
    }

    //显示一个用户
    @RequestMapping(value = "/updateview", method = RequestMethod.GET)
    public ModelAndView updateview(String id) {

        User userResult = userService.getById(id);

        ModelAndView mav = new ModelAndView();
        mav.setViewName("updateview");
        mav.addObject("user", userResult);

        return mav;
    }

    // 更新用户
    @ResponseBody
    @RequestMapping(value = "update", method = RequestMethod.POST)
    public String update(HttpServletRequest request, User user) {

        //调用服务层方法 更新一个用户
        userService.updateInfo(user);
        return "ok";
    }
}

 

CrudSpringBootApplication.java:

package com.bai.crudspringboot;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//去扫描Dao层接口

@MapperScan("com.bai.crudspringboot.dao")
@SpringBootApplication
public class CrudspringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(CrudspringbootApplication.class, args);
    }

}

 

 

访问网址:http://localhost:8080/alluser