2018年4月4日14:10:38
controller层只是负责从service层获得数据,对外暴露API接口,核心业务逻辑在service层。不要在controller类的方法中编写业务相关代码。
@RestController
@RequestMapping("/domain/领域名称(enc)/版本(v1)")
public class 模块名Controller {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private Service1 service1;
@Autowired
private Service2 service2;
// 查询所有用户
@GetMapping("/user/")
public ResponseEntity<List<User>> listAllUsers() {
List<User> users = userService.findAllUsers();
if(users.isEmpty()){
return new ResponseEntity<List<User>>(HttpStatus.NO_CONTENT);//You many decide to return HttpStatus.NOT_FOUND
}
return new ResponseEntity<List<User>>(users, HttpStatus.OK);
}
/*
在看上面这段代码,如果前台传递来几个参数,那很好办,我们只要给这个方法多几个形参就可以,但是如果前台传递来大量的信息,我们还会创建那么多的参数吗?
那样恐怕会使你的代码特别难看吧。这时,我们可以将多个参数封装到一个对象中,而在这个方法中传递这个对象的一个引用,如上面的代码我们将查询的请求全部
封装到了一个UserQueryCondition的类中。这样就化简了代码,也让更加有了层次性。
我们在src/main/java路径下创建一个VO层,然后创建UserQueryCondition 类如下:
@JsonInclude(JsonInclude.Include.NON_NULL)
@ApiModel(value ="UserQueryCondition")
public class UserQueryCondition {
@ApiModelProperty(value = "用户名", required = false)
public String username;
@ApiModelProperty(value = "性别", required = false)
public String sex;
@ApiModelProperty(value = "年龄", required = false)
public int age;
@ApiModelProperty(value = "地址", required = false)
public String address;
//省略set,get方法
}
我们接着上面的讲解,Pageable这个类可以传递分页的信息,比如每页的信息数量,页数等等信息,@PageableDefault(size=15,page=3,sort=”username,asc”)
这个参数表示分页信息的默认值,如果我们不传递分页的信息,那么它将默认每页的大小size为15,页数page为第三页,分类的方式是使用username,用asc升序的方式排列。
*/
// 多条件查询
@PostMapping("/user/")
public ResponseEntity<List<User>> query(UserQueryCondition condition,@PageableDefault(size=15,page=3,sort="username,asc") Pageable pageable) {
List<User> users = userService.query(condition, pageable);
return new ResponseEntity<List<User>>(users, HttpStatus.OK);
}
// 查询单个用户
@GetMapping("/user/{id}")
public ResponseEntity<User> getUser(@PathVariable("id") long id) {
User user = userService.findById(id);
if (user == null) {
logger.info("User with id " + id + " not found");
return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<User>(user, HttpStatus.OK);
}
// 添加用户
@PostMapping("/user/")
public ResponseEntity<Void> createUser(@RequestBody User user) {
logger.info("Creating User " + user.getName());
if (userService.isUserExist(user)) {
logger.info("A User with name " + user.getName() + " already exist");
return new ResponseEntity<Void>(HttpStatus.CONFLICT);
}
userService.saveUser(user);
return new ResponseEntity<Void>("添加成功", HttpStatus.OK);
}
// 根据id修改用户
@PutMapping("/user/{id}")
public ResponseEntity<User> updateUser(@PathVariable("id") long id, @RequestBody User user) {
logger.info("Updating User " + id);
User currentUser = userService.findById(id);
if (currentUser==null) {
logger.info("User with id " + id + " not found");
return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
}
currentUser.setName(user.getName());
currentUser.setAge(user.getAge());
currentUser.setSalary(user.getSalary());
userService.updateUser(currentUser);
return new ResponseEntity<User>(currentUser, HttpStatus.OK);
}
// 根据id删除用户
@DeleteMapping("/user/{id}")
public ResponseEntity<User> deleteUser(@PathVariable("id") long id) {
logger.info("Fetching & Deleting User with id " + id);
User user = userService.findById(id);
if (user == null) {
logger.info("Unable to delete. User with id " + id + " not found");
return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
}
userService.deleteUserById(id);
return new ResponseEntity<User>(HttpStatus.NO_CONTENT);
}
// 删除所有用户
@DeleteMapping("/user/")
public ResponseEntity<User> deleteAllUsers() {
logger.info("Deleting All Users");
userService.deleteAllUsers();
return new ResponseEntity<User>(HttpStatus.NO_CONTENT);
}
}
详解: * @RestController :首先我们使用的是Spring 4的新注解 @RestController注解.
此注解避免了每个方法都要加上@ResponseBody注解。也就是说@RestController 自己戴上了 @ResponseBody注解,看以看作是@Controller 和 @ResponseBody的结合体。
service必须基于接口编程
接口类:位于xxx.xxx.service包下,采用Xxx+ServiceI的形式来定义,即,模块+ServiceI。
如:用户管理接口类:UserMsgServiceI
实现类:位于xxx.xxx.service.impl包下,采用Xxx+ServiceImpl的形式来定义,即,模块+ServiceImpl。
如:用户管理实现类:UserMsgServiceImpl
package xxx.xxx.service;
...
public interface UsersServiceI {
public List<User> queryUsersList(Map<String, Object> map) throws Exception;
}
package xxx.xxx.service.impl;
...
@Service("userService")
public class UsersServiceImpl implements UsersServiceI {
@Autowired
private UserMapper userMapper;
@Override
public List<Map<String, Object>> queryUsersList(Map<String, Object> map)
throws Exception {
return userMapper.queryUserList(map);
}
}
对象关系映射(ORM)概念的产物,基本上对象的成员变量对应了数据库中一行记录各字段的映射,方便实现ORM的持久层框架如(Mybatis)在读取数据的时候将数据库一行记录快速转换为对象供业务层使用。因此,持久对象PO里边本应该不包含逻辑,只有标配的getter和setter方法即可。
VO是值对象,业务对象,存活在业务层,是业务逻辑使用的,它存活的目的就是为数据提供一个生存的地方。
为了增加API接口可读性,在编写vo类时建议使用swagger注解
@JsonInclude(JsonInclude.Include.NON_NULL)
@ApiModel(value ="UserInfo")
public class UserInfo {
@ApiModelProperty(value = "ID")
private Integer id;
@ApiModelProperty(value = "用户登录账号", required = true)
private String userNo;
@ApiModelProperty(value = "姓名", required = true)
private String userName;
@ApiModelProperty(value = "姓名拼音")
private String spellName;
@ApiModelProperty(value = "密码", required = true)
private String password;
@ApiModelProperty(value = "手机号", required = true)
private String userPhone;
@ApiModelProperty(value = "性别")
private Integer userGender;
@ApiModelProperty(value = "记录创建时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "记录修改时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
// setter 和 getter
}