我的java web架构方案(续)之ERP系统

ERP系统中,最优秀的前端技术非React莫属,层层封装,可以在任何一层开始构建应用,兼顾了足够的灵活性、适应性和封装重用性。如同下围棋,用最简洁的规则,描述了最复杂的智慧。

而语法严格的工业语言JAVA,足够优秀能承担优良封装的任务。

此文的前篇链接:[url=http://afadgaeg.iteye.com/blog/2395132]我的java web架构方案[/url]

闲话少述,我们首先用一个方法来构筑一个Action


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,只需要一行代码即可完成。

并且,[color=red]我们可以在封装的任何一层,开始构筑我们的应用,而不用担心被框架所困,以致画蛇添足。[/color]

在此我依然强调我的原则:

架构原则:
1、轻量级组件优于重量级框架。实现完全解耦
2、约定优于配置。实现零配置
3、不要为了所谓的优雅而做不优雅的事,如过度封装和过度配置

[i][color=green]本人目前在职,并有意寻求更具挑战和更高报酬的工作,以期望充分实现个人价值。[/color][/i]
我的邮箱:2530210585@qq.com 手机:13874372370
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值