准备工作:
工程创建:
首先是创建springboot工程,创建Lombok、springweb、mybatis frame和mysql driver驱动
然后编写application.properties文件中的相关信息:
spring.application.name=tlias-web-management spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/tlias spring.datasource.username=root spring.datasource.password=zyy2176801587 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl mybatis.configuration.map-underscore-to-camel-case=true
数据库创建:
创建数据库talis,并为其创建两张数据表dept和emp
相关接口和实体类创建
按照分层解耦方式创建好目录和相关文件:
相关方法编写:
根据接口文档编写相关代码:
Dept类和Emp类中编写get,set和toString以及无参含参构造方法,Result类编写相应信息,并编写相关响应结果:
package edu.wust.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg; //响应信息 描述字符串
private Object data; //返回的数据
//增删改 成功响应
public static Result success(){
return new Result(1,"success",null);
}
//查询 成功响应
public static Result success(Object data){
return new Result(1,"success",data);
}
//失败响应
public static Result error(String msg){
return new Result(0,msg,null);
}
}
增加数据:
数据访问层(Mapper):DeptMapper接口定义了访问数据库的List方法,通过Dept类来获取用户全部信息,并打包保存进一个List列表中:
package edu.wust.mapper;
import edu.wust.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 部门管理
*/
@Mapper
public interface DeptMapper {
@Select("select * from dept")
List<Dept> list();
}
服务层(Service):在DeptService接口中生成list方法,定义了部门管理的业务逻辑:
package edu.wust.service;
import edu.wust.pojo.Dept;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 部门管理
*/
@Service
public interface DeptService {
List<Dept> list();
}
DeptServicelmpl类是接口DeptService的实现类,通过在DeptServicelmpl类中创建Mapper接口,利用接口中的list方法查询并返回全部的部门信息:
package edu.wust.service.impl;
import edu.wust.mapper.DeptMapper;
import edu.wust.pojo.Dept;
import edu.wust.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public List<Dept> list() {
return deptMapper.list();
}
}
控制层(Controller):前端发送信息到DeptController类中,DeptController调用deptService接口获取list中的数据:
package edu.wust.controller;
import edu.wust.pojo.Dept;
import edu.wust.pojo.Result;
import edu.wust.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.logging.Logger;
/**
* 部门管理Controller
*/
@Slf4j //日志
@RestController
public class DeptController {
// private static Logger log= (Logger) LoggerFactory.getLogger(DeptController.class);
@Autowired
private DeptService deptService;
//@RequestMapping(value = "/depts",method = RequestMethod.GET)
@GetMapping("/depts")
public Result list(){
log.info("查询全部部门数据");
List<Dept> deptList=deptService.list();
return Result.success(deptList);
}
}
几个注意点:
1.实体类中使用@Data注解,可以自动生成get、set、toString等方法,但是不能生成含参和无参的构造方法,需要再手动生成
2.由于业务要求控制请求方法,不能直接使用@RequestMapping注解,可以在注解后加一个method来指定方法,也可以直接使用@GetMapping等注解
3.可以直接通过导入@Slf4j注解来调用log.info日志
4.为了符合OIC操作bean管理,需要引入@Autowired注解,并创建一个私有变量
前后端联调(nginx):
nginx.conf文件中的
server {
listen 90;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location ^~ /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://localhost:8080;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
控制开启的端口号(这里是localhost:90)
注意由于80是默认的端口号,可能会因为权限不够出现开启不了的情况,需要以管理员身份开启。
开启之后输入url之后会看到前端页面,此时数据均为空:
运行后端页面进行查询操作之后再点击刷新就会出现相关数据:
根据id删除数据:
删除操作与上述步骤相同:
首先在controller层创建delete方法(根据id进行删除)
然后在service接口声明一个delete方法
接着在serviceimpl类中调用Mapper中的deleteById方法
最后在Mapper层编写SQL语句和deleteById方法
1.请求的url /depts/{id} 包含路径,使用要加入 @PathVariable 注解
2.删除和查询部分的url有重合部分 "/depts" ,可以在开头使用@RequstMapping("/depts")对公共部分进行抽取
相关代码:
// 1
@DeleteMapping("/depts/{id}")
public Result delete(@PathVariable Integer id){
log.info("根据id删除部门:{}",id);
deptService.delete(id);
return Result.success();
}
// 2
void delete(Integer id);
// 3
@Override
public void delete(Integer id) {
deptMapper.deleteById(id);
}
// 4
@Delete("delete from dept where id=#{id}")
void deleteById(Integer id);
插入数据:
接口文档中声明插入数据为一个name字段的字符串,但数据表包含创建时间和更新时间两个字段,因此需要自行创建两个方法,并返回一个类对象。
代码:
// 1
@PostMapping("/depts")
public Result add(@RequestBody Dept dept){
log.info("根据名称新增部门:{}",dept);
deptService.add(dept);
return Result.success();
}
// 2
void add(Dept dept);
// 3
@Override
public void add(Dept dept) {
//补全相关属性(用户端创建时没有传入相关数据)
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
deptMapper.insert(dept);
}
// 4
@Insert("insert into dept (name, create_time, update_time) VALUES (#{name},#{createTime},#{updateTime})")
void insert(Dept dept);
运行结果如下:
1.由于返回的是一个dept类对象,因此需要加入一个@RequestBody注解
2.用户只需要传递一个name字段的字符串,因此还需要编写另外两个方法
3.根据文档要求,传入数据格式为json,在postman中测试的时候需要在body->raw->选择json格式,然后输入增加数据的信息才会被正常执行
编辑数据:
由于仍然需要传递更新时间,因此返回值还是一个dept对象,需要加入@RequestBody注解
需要传递更新时间,在DeptServiceImpl类中需要编写时间更新方法并打包调用Mapper类中的update方法
dept中已经有id属性,因此Mapper中直接编写更新语句
update dept set name=#{name} where id=#{id}即可,无需另外获取id值
相关代码:
// 1
@PutMapping("/depts")
public Result update(@RequestBody Dept dept){
log.info("修改部门:{}",dept);
deptService.update(dept);
return Result.success();
}
// 2
void update(Dept dept);
// 3
@Override
public void update(Dept dept) {
dept.setUpdateTime(LocalDateTime.now());
deptMapper.update(dept);
}
// 4
@Update("update dept set name=#{name} where id=#{id}")
void update(Dept dept);
运行结果:
原数据表:
将id为7的销售部修改为教务处:
数据表: