前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编程规范

编程规范

作者头像
用户1212940
发布2018-04-16 17:22:34
8100
发布2018-04-16 17:22:34
举报
文章被收录于专栏:LambdaLambdaLambda

领域层–编码规范

2018年4月4日14:10:38

Controller层编写规范

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的结合体。

  • @RequestBody : 如果方法参数被@RequestBody注解,Spring将绑定HTTP请求体到那个参数上。如果那样做,Spring将根据请求中的ACCEPT或者 Content-Type header(私下)使用 HTTP Message converters 来将http请求体转化为domain对象。
  • @PathVariable 此注解意味着一个方法参数应该绑定到一个url模板变量[在’{}’里的一个]中

Service编写规范

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);
    }

}

Model层编写规范

对象关系映射(ORM)概念的产物,基本上对象的成员变量对应了数据库中一行记录各字段的映射,方便实现ORM的持久层框架如(Mybatis)在读取数据的时候将数据库一行记录快速转换为对象供业务层使用。因此,持久对象PO里边本应该不包含逻辑,只有标配的getter和setter方法即可。

VO层编写规范

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 
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年04月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 领域层–编码规范
    • Controller层编写规范
      • Service编写规范
        • Model层编写规范
          • VO层编写规范
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档