最近在项目中遇到一个问题,数据库中有很多张需要由人手工维护的基本数据表,而这些数据表每一个都需要人工对其中的数据进行维护。在开发的过程中发现基本上每个页面需要做的控件相差不大,区别在于不同的界面对应的表和字段不同,而基本的代码处理流程是一
最近在项目中遇到一个问题,数据库中有很多张需要由人手工维护的基本数据表,而这些数据表每一个都需要人工对其中的数据进行维护。在开发的过程中发现基本上每个页面需要做的控件相差不大,区别在于不同的界面对应的表和字段不同,而基本的代码处理流程是一至的,所以这就促使我想到能不能有更好一点的办法简化这个开发过程。
用户界面层,我们最重点的是用户操作界面的控件要和数据库的字段匹配,在开发过程中还有,如果数据库的字段有变化的话代码修改越少越好。所以最好UI可以根据数据库的字段自动生成相应的控件。
业务层,可能会做一些基本的数据校验之类的工作,由于在需求中重点是UI和数据库访问所以业务层的功能应该会相对简单一些。
数据库访问层,在数据库的操作语句中我们也需要知道数据库的字段,以此生成增删改查的语句。
在这里我打算使用配置文件来进行配置。
在这里我也想到过可以通过DAO来获得数据库的字段和字段类型,但是转念一想再数据库中我们很多时候可能会使用一样的SQL类型来存储不一样的数据类型,比如使用varchar可以存储字符串,但是也有人使用varchar存储枚举型数据,可能不同的人会使用不同的控件显示对应同一个SQL数据类型。所以这里我打算适当的使用一些配置来对UI显示数据的控件进行配置。
想到这里,在配置文件中就需要有这样一些配置项,1.数据库的字段。2.这个字段可以是用什么样地数据类型存储的3.在界面上是用什么控件来展示的。
这里我打算使用java来做开发,但是这种思想我觉得其他任何语言都是可以考虑使用的。所以如果读者们有什么意见的话也可以一起交流。
下一步是要对配置文件进行定型了。
2014-03-20
<?xml version="1.0" encoding="UTF-8"?> <root> <Table name="country"> <countrycode type="string" UIDisplay="true"> <UIControl type="text" label="Country Code"/> </countrycode> <countryname type="string" UIDisplay="true"> <UIControl type="text" label="Country Name"/> </countryname> <createdby type="string" UIDisplay="false" /> <createdat type="datetime" UIDisplay="false" /> <updatedby type="string" UIDisplay="false" /> <updatedat type="datetime" UIDisplay="false" /> </Table> </root>
配置结构则需要考虑什么控件需要在界面上展示,怎么样展示,目前还是比较简单的控件只是输入文本的。
由于在每个界面上都有的保存,删除等的按钮,所以就添加一个的通用界面吧,当然直接在JFrame上画开始也可以。
import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import java.awt.BorderLayout; import javax.swing.JButton; import java.util.TreeMap;
public class ProjectForm extends JFrame{ public String nameString; public JPanel panel ; public TreeMap<String, JTextField> TextFieldList = new TreeMap<String,JTextField>(); public ProjectForm() { panel = new JPanel(); getContentPane().add(panel, BorderLayout.CENTER); panel.setLayout(null); JPanel panel_1 = new JPanel(); panel_1.setBounds(82, 5, 265, 33); panel.add(panel_1); JButton btnNew = new JButton("New"); panel_1.add(btnNew); JButton btnSave = new JButton("Save"); panel_1.add(btnSave); JButton btnClear = new JButton("Clear"); panel_1.add(btnClear); JButton btnDelete = new JButton("Delete"); panel_1.add(btnDelete); } }
import java.io.File; import java.util.List; import javax.swing.JLabel; import javax.swing.JTextField; import org.jdom2.*; import org.jdom2.input.SAXBuilder;
public class FormCreator { static ProjectForm CreateForm(String name) { ProjectForm form = new ProjectForm(); form.nameString = name; String filename = "D:\\work eclipse\\1.xml"; int topx = 20; int topy = 80; int Labelwidth = 100; int LabelHeight = 15; int gapy = 30; int textwidth = 300; try { SAXBuilder builder = new SAXBuilder(); org.jdom2.Document document; File file = new File(filename); document = builder.build(file); Element rootElement = document.getRootElement(); List<Element> tableList = rootElement.getChildren(); for (int i = 0; i < tableList.size(); i++) { Element node = tableList.get(i); String tNameString = node.getAttribute("name").getValue(); if(!tNameString.equalsIgnoreCase(name)) { continue; } List<Element> tablefeilds = node.getChildren(); for(int j=0;j<tablefeilds.size();j++) { Element feildnode = tablefeilds.get(j); if(!"true".equalsIgnoreCase(feildnode.getAttribute("UIDisplay").getValue())) { continue; } List<Element> UIfeilds = feildnode.getChildren(); for(int k=0;k<UIfeilds.size();k++) { Element UIfeild = UIfeilds.get(k); Attribute attribute = UIfeild.getAttribute("label"); if(attribute != null) { JLabel label= new JLabel(attribute.getValue()); label.setBounds(topx,topy+gapy*j,Labelwidth,LabelHeight); form.panel.add(label); } attribute = UIfeild.getAttribute("type"); if("text".equalsIgnoreCase(attribute.getValue())) { JTextField TextField= new JTextField(); TextField.setBounds(topx+Labelwidth,topy+gapy*j,textwidth,20); form.panel.add(TextField); form.TextFieldList.put(feildnode.getName(), TextField); } } } } } catch (Exception e) { System.out.println(e.getMessage()); } return form; } }