源代码链接https://github.com/leasonlan/crud
数据库
```sql
DROP TABLE IF EXISTS `myuser`;
CREATE TABLE `myuser` (
`id` int(32) NOT NULL AUTO_INCREMENT,
`username` varchar(32) DEFAULT NULL,
`password` varchar(32) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL,
`classnum` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of myuser
-- ----------------------------
INSERT INTO `myuser` VALUES ('1', '1001', '123456', '张三', '1');
INSERT INTO `myuser` VALUES ('2', '1002', '123456', '李四', '2');
INSERT INTO `myuser` VALUES ('3', '1003', '123456', '王五', '1');
INSERT INTO `myuser` VALUES ('4', '1004', '123456', '陈六', '2');
INSERT INTO `myuser` VALUES ('5', '1005', '123456', '刘七', '3');
实体类
```java
package com.example.crud.entity;
/**
* @author desheng.lan
* @version 1.0
* @date 2019/12/6 0006 上午 9:19
*/
public class Myuser {
private int id;
private String username;
private String password;
private String name;
private String classNum;
public Myuser(){
/*
* 构造函数*/
}
public Myuser(int id,String username){
super();
this.id=id;
this.username=username;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getClassNum() {
return classNum;
}
public void setClassNum(String classNum) {
this.classNum = classNum;
}
@Override
public String toString() {
return "Myuser{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", name='" + name + '\'' +
", classNum='" + classNum + '\'' +
'}';
}
}
mapper
package com.example.crud.mapper;
import com.example.crud.entity.Myuser;
import java.util.List;
import java.util.Map;
/**
* @author desheng.lan
* @version 1.0
* @date 2019/12/5 0005 下午 3:54
*/
//@Mapper
// 在启动器上加了@MapperScan("com.example.crud.mapper")这里就没必要写上面那句
// 用的依赖是<dependency>
// <groupId>org.mybatis.spring.boot</groupId>
// <artifactId>mybatis-spring-boot-starter</artifactId>
// <version>1.3.0</version>
// </dependency>
public interface MyuserMapper {
/*
* 查询统计班级人数
* */
public int getuserCount(Map<String, Object> params);
/*
* 查询用户详细信息
* */
public List<Map<String,Object>> getUserInfo(Map<String,Object> mpa);
/*
*增加用户
* */
public boolean addUser(Myuser myuser);
/*
*删除用户
* */
public int deleteUser(Map<String,Object> map);
/*
* 修改用户
* */
public void update(Myuser myuser);
}
package com.example.crud.service;
import com.example.crud.dto.Rsp;
import com.example.crud.entity.Myuser;
import com.example.crud.mapper.MyuserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* @author desheng.lan
* @version 1.0
* @date 2019/12/5 0005 下午 4:08
*/
@Service
public class MyuserService {
@Value("dev")
private String dataShow;
@Autowired MyuserMapper myuserMapper;
/*
*
* 根据班级号统计人数
* 根据id查询用户详细信息
*
* */
public Object getuserCount(String classNumTotal){
Map<String, Object> pam = new HashMap<String, Object>();
pam.put("classNumTotal",classNumTotal);
pam.put("dataShow", dataShow);
return myuserMapper.getuserCount(pam);
}
public Object getUserInfo(int id){
Map<String,Object> pam=new HashMap<String, Object>();
pam.put("id",id);
pam.put("dataShow",dataShow);
return myuserMapper.getUserInfo(pam);
}
/*
* 增加新用户信息
* */
public Object addUser(Myuser myuser){
try {
myuserMapper.addUser(myuser);
}
catch (Exception e){
System.out.println("新增失败!");
e.printStackTrace();
return false;
}
return Rsp.succ("添加用户成功!", true);
}
/*
*
*根据id删除用户信息
* */
public Object deleteUser(int id){
Map<String,Object> map=new HashMap<String, Object>();
map.put("id",id);
map.put("dataShow",dataShow);
return myuserMapper.deleteUser(map);
}
/*
* 修改用户信息
* */
public Object updateUser(Myuser myuser){
/* boolean flag=false;
try {
myuserMapper.updateUser(id,myuser);
flag=true;
}
catch (Exception e){
System.out.println("修改失败!");
e.printStackTrace();
}
return flag;*/
try{
myuserMapper.update(myuser);
}catch (Exception e){
System.out.println("修改失败!");
e.printStackTrace();
return false;
}
return true;
}
}
package com.example.crud.controller;
import com.example.crud.dto.Rsp;
import com.example.crud.entity.Myuser;
import com.example.crud.service.MyuserService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @author desheng.lan
* @version 1.0
* @date 2019/12/5 0005 下午 4:21
*/
@RestController
@RequestMapping("/myuser")
public class MyuserController {
@Autowired
MyuserService myuserService;
@ApiOperation(value ="查询同一个班级人数",notes="查询同一个班级人数")
@ApiImplicitParam(name = "classNumTotal",value = "班级号", required = true, dataType = "String", paramType = "query")
@RequestMapping(value = "/getuserCount",method = RequestMethod.GET)
Object getuserCount(@RequestParam String classNumTotal){
System.out.println("传入班级为"+classNumTotal);
return Rsp.succ("查询成功!", myuserService.getuserCount(classNumTotal));
}
@ApiOperation(value ="查询用户详细信息",notes="查询用户详细信息")
@ApiImplicitParam(name = "id",value = "id", required = true, dataType = "Integer", paramType = "query")
@RequestMapping(value = "/getUserInfo",method = RequestMethod.GET)
Object getUserInfo(int id){
System.out.println("传入班级为"+id);
return Rsp.succ("查询成功!", myuserService.getUserInfo(id));
}
@ApiOperation(value ="添加用户信息",notes="添加用户信息")
@ApiImplicitParam(name = "myuser",value = "新用户实体类", required = true, dataType = "Myuser")
@RequestMapping(value = "addUser",method = RequestMethod.POST)
public Object addUser(@RequestBody Myuser myuser){
System.out.println("controller传入用户对象为"+myuser.toString());
return myuserService.addUser(myuser);
}
@ApiOperation(value ="删除用户信息",notes="删除用户信息")
@ApiImplicitParam(name = "id",value = "输入id", required = true,dataType = "Integer",paramType = "query")
@RequestMapping(value = "/deleteUser",method = RequestMethod.DELETE)
Object deleteUser(int id){
return Rsp.succ("删除成功!",myuserService.deleteUser(id));
}
@ApiOperation(value ="修改用户信息",notes="修改用户信息")
@ApiImplicitParam(name = "myuser",value = "修改用户实体类", required = true, dataType = "Myuser")
@RequestMapping(value = "updateUser",method = RequestMethod.PUT)
Object updateUser(@RequestBody Myuser myuser) {
return myuserService.updateUser(myuser);
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.crud.mapper.MyuserMapper">
<select id="getuserCount" parameterType="java.util.Map" resultType="java.lang.Integer">
<if test="dataShow == 'dev'">
select count(*) from myuser m
where 1 = 1
<if test="classNumTotal!=null and classNumTotal!=''">
AND m.`classnum`=#{classNumTotal}
</if>
</if>
</select>
<select id="getUserInfo" parameterType="java.util.Map" resultType="java.util.Map">
select * from myuser m
where 1 = 1
<if test="id!=null and id!=''">
AND m.`id`=#{id}
</if>
</select>
<insert id="addUser" parameterType="com.example.crud.entity.Myuser">
insert into
myuser
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username!=null">
username,
</if>
<if test="password!=null">
password,
</if>
<if test="name!=null">
name,
</if>
<if test="classNum!=null">
classNum,
</if>
</trim>
<trim prefix="values(" suffix=")" suffixOverrides=",">
<if test="username!=null">
#{username},
</if>
<if test="password!=null">
#{password},
</if>
<if test="name!=null">
#{name},
</if>
<if test="classNum!=null">
#{classNum},
</if>
</trim>
</insert>
<delete id="deleteUser" parameterType="java.util.Map" >
delete from
myuser
where
myuser.id=#{id}
</delete>
<update id="update" parameterType="com.example.crud.entity.Myuser">
<if test="id!=null and id!=''">
update myuser m
<set>
<if test="username!=null and username!=''">
username=#{username},
</if>
<if test="password!=null and password!=''">
password=#{password},
</if>
<if test="name!=null and name!=''">
name=#{name},
</if>
<if test="classNum!=null and classNum!=''">
classnum=#{classNum},
</if>
</set>
where m.id=#{id}
</if>
</update>
</mapper>
查询
修改
@ApiImplicitParams、ApiImplicitParam的使用
@ApiImplicitParam:
作用在方法上,表示单独的请求参数
参数:
1. name :参数名。
2. value : 参数的具体意义,作用,解释。
3. required : 参数是否必填。
4. dataType :参数的数据类型。(String、int)
5. paramType :查询参数类型,这里有几种形式:
类型 作用
path 以地址的形式提交数据
query 直接跟参数完成自动映射赋值
body 以流的形式提交 仅支持POST
header 参数在request headers 里边提交
form 以form表单的形式提交 仅支持POST
这个参数和SpringMvc中的@RequestBody冲突,索性我就去掉了paramType,对接口测试并没有影响。
@ApiImplicitParams:
用于方法,包含多个 @ApiImplicitParam:
例:
@ApiOperation("查询测试")
@GetMapping("select")
//@ApiImplicitParam(name="name",value="用户名",dataType="String", paramType = "query")
@ApiImplicitParams({
@ApiImplicitParam(name="name",value="用户名",dataType="string", paramType = "query",example="xingguo"),
@ApiImplicitParam(name="id",value="用户id",dataType="long", paramType = "query")})
public void select(){
}
paramType 示例详解
path
@RequestMapping(value = "/findById1/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@PathVariable(name = "id") Long id
body
@ApiImplicitParams({ @ApiImplicitParam(paramType = "body", dataType = "MessageParam", name = "param", value = "信息参数", required = true) })
@RequestMapping(value = "/findById3", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@RequestBody MessageParam param
提交的参数是这个对象的一个json,然后会自动解析到对应的字段上去,也可以通过流的形式接收当前的请求数据,但是这个和上面的接收方式仅能使用一个(用@RequestBody之后流就会关闭了)
header
@ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "Long", name = "id", value = "信息id", required = true) })
String idstr = request.getHeader("id");
if (StringUtils.isNumeric(idstr)) {
id = Long.parseLong(idstr);
}
Form
@ApiImplicitParams({ @ApiImplicitParam(paramType = "form", dataType = "Long", name = "id", value = "信息id", required = true) })
@RequestMapping(value = "/findById5", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
总结:
(1)对于@ApiImplicitParam的paramType:query、form域中的值需要使用@RequestParam获取, header域中的值需要使用@RequestHeader来获取,path域中的值需要使用@PathVariable来获取,body域中的值使用@RequestBody来获取,否则可能出错;而且如果paramType是body,name就不能是body,否则有问题,与官方文档中的“If paramType is "body", the name should be "body"不符。
@ApiImplicitParams:用在方法上包含一组参数说明
@ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面
paramType:参数放在哪个地方
header-->请求参数的获取:@RequestHeader
query-->请求参数的获取:@RequestParam
path(用于restful接口)-->请求参数的获取:@PathVariable
body(不常用)
form(不常用)
name:参数名
dataType:参数类型
required:参数是否必须传
value:参数的意思
defaultValue:参数的默认值
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
code:数字,例如400
message:信息,例如"请求参数没填好"
response:抛出异常的类
以上这些就是最常用的几个注解了。