1.环境搭建
- 添加新的模块
- 选择所使用技术
- 添加Spring官网未收录的技术依赖
<?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.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.rendan</groupId>
<artifactId>SpringBoot_mybatisPlus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBoot_mybatisPlus</name>
<description>SpringBoot_mybatisPlus</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>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--连接池技术依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!--mybatisPlus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--cmd终端输入java -jar jar包,运行该程序的插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 搭建工作目录
2.前端页面
- index.html(使用element组件快速开发)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>student</title>
<link rel="stylesheet" href="./element-ui/lib/theme-chalk/index.css">
<script src="./js/jquery.min.js"></script>
<script src="./js/vue.js"></script>
<script src="./js/axios-0.18.0.js"></script>
<script src="./element-ui/lib/index.js"></script>
<script src="./js/index.js"></script>
</head>
<body>
<div id="app">
<template>
<el-table
:data="students"
stripe
style="width: 100%">
<el-table-column
prop="id"
label="id"
width="180">
</el-table-column>
<el-table-column
prop="studentName"
label="姓名"
width="180">
</el-table-column>
<el-table-column
prop="studentId"
label="学号">
</el-table-column>
<el-table-column
prop="tel"
label="电话号">
</el-table-column>
<el-table-column
prop="dormitoryAddress"
label="宿舍地址">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
type="primary"
@click="handleUpdateSelect(scope.row)">修改</el-button>
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</template>
<!--添加成员对话框-->
<el-button type="primary" @click="openAddMember()">新增</el-button>
<el-dialog title="成员信息" :visible.sync="dialogFormVisible">
<el-form :model="student">
<el-form-item label="姓名" label-width=120px>
<el-input v-model="student.studentName" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="学号" label-width=120px>
<el-input v-model="student.studentId" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="电话" label-width=120px>
<el-input v-model="student.tel" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="宿舍地址" label-width=120px>
<el-input v-model="student.dormitoryAddress" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel()">取 消</el-button>
<el-button type="primary" @click="handleAdd()">确 定</el-button>
</div>
</el-dialog>
<!--修改成员对话框-->
<el-dialog title="成员信息" :visible.sync="dialogFormVisibleUpdate">
<el-form :model="student">
<el-form-item label="姓名" label-width=120px>
<el-input v-model="student.studentName" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="学号" label-width=120px>
<el-input v-model="student.studentId" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="电话" label-width=120px>
<el-input v-model="student.tel" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="宿舍地址" label-width=120px>
<el-input v-model="student.dormitoryAddress" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel()">取 消</el-button>
<el-button type="primary" @click="handleUpdate()">确 定</el-button>
</div>
</el-dialog>
</div>
</body>
</html>
- 页面js编写使用vue
$(document).ready(function () {
new Vue({
//确定vue作用域
el: "#app",
//定义数据模型
data() {
return {
students: [],
student:{
id:"",
studentName:"",
studentId:"",
tel:"",
dormitoryAddress:"",
},
//展示斑马纹
show: true,
dialogFormVisible: false,
dialogFormVisibleUpdate: false,
}
},
//页面加载完成,发送异步请求,查询数据
mounted() {
this.selectMembers()
},
methods: {
selectMembers(){
axios.get("/members").then((res)=>{
// console.log(res.data)
this.students = res.data.data;
})
},
openAddMember(){
this.dialogFormVisible = true;
this.student={};
},
handleAdd(){
axios.post("/members",this.student).then((res)=>{
if (res.data.flag){
this.dialogFormVisible = false;
this.$message.success("添加成功")
}else {
this.$message.error("添加失败")
}
}).finally(()=>{
this.selectMembers();
})
},
cancel(){
this.dialogFormVisible = false;
this.dialogFormVisibleUpdate = false;
this.$message.info("已取消操作");
},
handleUpdateSelect(row){
this.dialogFormVisibleUpdate = true
axios.get("/members/"+row.id).then((res)=>{
if (res.data.flag && res.data.data != null){
this.student = res.data.data;
}else {
this.$message.error("数据同步失败!该成员可能未存在!")
}
}).finally(()=>{
this.selectMembers();
})
},
handleUpdate(){
axios.put("/members",this.student).then((res)=>{
if (res.data.flag){
this.dialogFormVisibleUpdate = false;
this.$message.success("修改成功!")
}else {
this.$message.error("修改失败!")
}
}).finally(()=>{
this.selectMembers();
})
},
handleDelete(row){
this.$confirm("此操作将永久删除信息,是否确认执行?").then(()=>{
axios.delete("/members/"+row.id).then((res)=>{
if (res.data.flag){
this.$message.success("删除成功")
}else {
this.$message.error("删除失败")
}
}).finally(()=>{
this.selectMembers();
})
}).catch(()=>{
this.$message.info("已取消操作")
})
}
}
})
})
3.后端内容
- spring相关配置
# 端口号配置
server:
port: 80
# 配置数据源
spring:
datasource:
# 使用druid连接池技术
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/data211
username: root
password: ******
mybatis-plus:
# 如有单独的 MyBatis 配置
# config-location: classpath:mybatis-config.xml
# 配置自定义sql语句xml文件
mapper-locations: classpath:mapper/*.xml
# 配置别名
type-aliases-package: com.rendan.domain
global-config:
db-config:
# 配置主键id自增长
id-type: auto
# 配置表的前缀名
table-prefix: data211_
# 配置逻辑删除
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
# 控制台输出连接数据库日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 实体类(doamin)
package com.rendan.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
@Data
//@TableName("data211_members")
public class Members {
// @TableId(type = IdType.AUTO)
private int id;
private String studentName;
private String studentId;
@TableField(exist = false)
private String identityCard;
private String tel;
private String dormitoryAddress;
@TableLogic//逻辑删除字段,1_删除,0_未删除
private int deleted;
//该字段表中未出现,通过设置TableField的exist属性不报错
@TableField(exist = false)
private String birthday;
}
定义同意响应给前端的数据格式
package com.rendan.controller.utils;
import lombok.Data;
@Data
public class Result {
private boolean flag;
private Object data;
Result(){}
public Result(boolean flag){
this.flag = flag;
}
public Result(boolean flag, Object data){
this.flag = flag;
this.data = data;
}
}
- Controller类中接口
- REST风格请求规范 :
查询 ==>GTE
新增 ==>POST
更新==>PUT
删除==>DELETE
package com.rendan.controller;
import com.baomidou.mybatisplus.extension.api.R;
import com.rendan.controller.utils.Result;
import com.rendan.domain.Members;
import com.rendan.service.IMembersService;
import org.apache.ibatis.annotations.ResultMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
//Rest风格
@RestController
@RequestMapping("/members")
public class MembersController {
@Autowired
private IMembersService membersService;
@GetMapping
public Result GetAllMembers(){
return new Result(true,membersService.list());
}
@GetMapping("/{id}")
public Result UpdateMemberInformation(@PathVariable int id){
return new Result(true,membersService.getById(id));
}
@PostMapping
public Result AddMember(@RequestBody Members member){
return new Result(membersService.save(member));
}
@DeleteMapping("/{id}")
public Result DeleteMember(@PathVariable int id){
return new Result(membersService.removeById(id));
}
@PutMapping
public Result UpdateMember(@RequestBody Members member){
return new Result(membersService.updateById(member));
}
}
- 逻辑层(service)
package com.rendan.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rendan.domain.Members;
//MybatisPlus帮助实现业务层快速开发
public interface IMembersService extends IService<Members> {
}
package com.rendan.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.rendan.dao.MembersDao;
import com.rendan.domain.Members;
import com.rendan.service.IMembersService;
import org.springframework.stereotype.Service;
@Service
public class MembersImpl extends ServiceImpl<MembersDao, Members> implements IMembersService {
}
- 操作数据库(dao)
package com.rendan.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.rendan.domain.Members;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MembersDao extends BaseMapper<Members> {
}
完成 !