ERP系统中,最优秀的前端技术非React莫属,层层封装,可以在任何一层开始构建应用,兼顾了足够的灵活性、适应性和封装重用性。如同下围棋,用最简洁的规则,描述了最复杂的智慧。
而语法严格的工业语言JAVA,足够优秀能承担优良封装的任务。
此文的前篇链接:我的java web
架构方案
闲话少述,我们首先用一个方法来构筑一个Action
class="java" name="code">
String[] fieldNames = new String[]{"id", "name", "remark"};
//此方法如何被servlet调用请参考前篇链接
public void insert(HttpServletRequest req, HttpServletResponse res) throws ...{
//ActionTool是一个业务逻辑工具类,他的insert静态方法接收四个参数
//req和res为servlet的对象
//第三个参数是要插入记录的数据库表映射实体类型
//第四个参数是字段数组,这个数组被用来生成sql语句和完成ORM映射
ActionTool.insert(req, res, Area.class, fieldNames);
}
我们展开ActionTool.insert方法
public static void insert(HttpServletRequest req, HttpServletResponse res, Class entityClass, String[] fieldNames) throws ...{
//此方法只有一行代码
//MysqlTool.getInsertSql方法用来拼接Mysql数据库的insert语句
//并使用以冒号作前缀的命名参数,比如生成类似这样的 insert into `table_name` (`p1`,`p2`)values(:p1,:p2);
executeUpdate(req, res, entityClass, MysqlTool.getInsertSql(entityClass.getSimpleName(), fieldNames), fieldNames);
}
我们再展开executeUpdate方法
public static void executeUpdate(HttpServletRequest req, HttpServletResponse res, Class entityClass, String sql, String[] fieldNames)throws ... {
Object entity = entityClass.newInstance();
//bind方法会使用反射机制将一系列请求参数绑定到JavaBean,并且进行bean validate,并将异常消息写入messages对象中,供res输出,此方法返回代表数据完整性验证成功与否的布尔值。如果验证失败,会输出失败消息(JSON)
if (bind(req, res, entity, fieldNames)) {
try (Connection conn = TgdDataSource.getConnection();) {
//DAO.executeUpdate将数据插入数据表
DAO.executeUpdate(conn, sql, entity);
//输出成功消息
outSuccessfulMsg(req, res);
}
}
}
以上的DAO.executeUpdate方法和MysqlTool.getInsertSql方法我不在赘述,请参考此文顶部的前篇链接,这里仅贴出方法源码:
public static int executeUpdate(Connection conn, String sql, Object bean)
throws ... {
PreparedStatementWrapper warper = new PreparedStatementWrapper(conn, sql);
warper.bind(bean);
try (PreparedStatement stmt = warper.getStmt();) {
return stmt.executeUpdate();
}
}
public static String getInsertSql(String entityName, String[] fieldNames) {
StringBuilder values = new StringBuilder();
StringBuilder names = new StringBuilder();
for (String fieldName : fieldNames) {
names.append(",`").append(JavaTool.camelToUnderline(fieldName)).append("`");
values.append(",:").append(fieldName);
}
return new StringBuilder("insert into `").append(JavaTool.camelToUnderline(entityName)).append("` (")
.append(names.substring(1)).append(")values(").append(values.substring(1)).append(");").toString();//clz.getSimpleName()
}
由此,我们用足够优良的封装,用一行代码完成了一个Area数据插入动作的API。
当然,业务逻辑远比此复杂,但这样的封装,显然可以适应足够复杂的情况。
我们可以以同样的原则,构筑update、delete以及select的Action,对于大多数ERP系统,可能会有近三分之二的Action,只需要一行代码即可完成。
并且,
我们可以在封装的任何一层,开始构筑我们的应用,而不用担心被框架所困,以致画蛇添足。
在此我依然强调我的原则:
架构原则:
1、轻量级组件优于重量级框架。实现完全解耦
2、约定优于配置。实现零配置
3、不要为了所谓的优雅而做不优雅的事,如过度封装和过度配置
本人目前在职,并有意寻求更具挑战和更高报酬的工作,以期望充分实现个人价值。
我的邮箱:2530210585@qq.com 手机:13874372370