有些开发者习惯于 sql 随手就来,不管是在哪里只要有需要就直接 sql 操作数据库。这种习惯表面上会带来开发效率与便利性,但事实并非如此
当要写代码时,优先考虑将代码写在 Service 层中,例如有个 RegValidator 用于注册时对表单提交的数据进行校验,其中需要判断一项 nickName 是否已被注删,在 RegValidator 中有如下代码:
public class RegValidator extends Validator { public void validate(Controller c) { String sql = "select id from account where nickName=? limit 1"; Account account = new Account().findFirst(sql, c.getPara("nickName")); if (account != null) { addError("msg", "nickName 已被注册"); } // ... 其它代码 } }
最佳实践是 nickName 是否被注册的代码写在 AccountService 层中,有利于代码重用,有助于未来分布式演化,有利于在业务层添加缓存等机制,将代码挪至业务层后 RegValidator 的样子:
public class RegValidator extends Validator { public void validate(Controller c) { if (AccountService.me.isNickNameRegisted(c.getPara("nickName"))) { addError("msg", "nickName 已被注册"): } } }