编程规范

领域层–编码规范

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 
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

SpringBoot开发案例之整合mongoDB

JDK1.7、Maven、Eclipse、SpringBoot1.5.2、mongodb3.4,Robomongo(可视化工具)

6506
来自专栏IT笔记

SpringBoot开发案例之整合mongoDB

? mongodb.jpg 开始前,建议大家去了解以下文章,当然不看也没问题: MongoDB从入门到“精通”之简介和如何安装 MongoDB从入门到“精通”...

5518
来自专栏后端沉思录

mybatis拦截器分表

mybatis提供了拦截器插件用来处理被拦截的方法的某些逻辑.下面会通过创建8张表,当用户注册时,根据对手机号取余入不同的表.

5573
来自专栏MasiMaro 的技术博文

枚举进程中的模块

在Windows中枚举进程中的模块主要是其中加载的dll,在VC上主要有2种方式,一种是解析PE文件中导入表,从导入表中获取它将要静态加载的dll,一种是利用查...

1392
来自专栏JAVA后端开发

JAVA实现编写平台代码生成器

[项目中经常写CRUD,但实际这些工作,我觉得如果有一个完整的代码规范,完全可以自动生成,加快开发效率. 代码生成器技术原理不复杂,一般就是写好一个模板生成一...

6932
来自专栏Java3y

从零开始写项目第一篇【搭建环境】

使用Maven搭建SSM环境 SSM需要的基础jar包有哪些??整理一下: c3p0数据连接池 springMVC的JSON springAOP springC...

51210
来自专栏纯洁的微笑

springboot(十八):使用Spring Boot集成FastDFS

上篇文章介绍了《如何使用Spring Boot上传文件》,这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中。 这个项目会...

4664
来自专栏ImportSource

微服务弹性框架hystrix-javanica详解(上)

Java语言相比其他语言有一些比较great的优点,那就是反射(refleaction)和注解(annotation)。 几乎所有的流行框架比如Spring, ...

48010
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件

结果条件 在Java中,如果有重复的代码我们会考虑进行重构,抽取公共方法或继承父类,以减少相同的代码在多处出现,达到代码的最优管理和不必要的麻烦。Drools同...

2399
来自专栏码匠的流水账

聊聊lettuce的sentinel连接

lettuce-core-5.0.4.RELEASE-sources.jar!/io/lettuce/core/RedisClient.java

1952

扫码关注云+社区