一个根据配置文件对数据库进行增删改查的三层架构解决方法

最近在项目中遇到一个问题,数据库中有很多张需要由人手工维护的基本数据表,而这些数据表每一个都需要人工对其中的数据进行维护。在开发的过程中发现基本上每个页面需要做的控件相差不大,区别在于不同的界面对应的表和字段不同,而基本的代码处理流程是一至的,所以这就促使我想到能不能有更好一点的办法简化这个开发过程。

用户界面层,我们最重点的是用户操作界面的控件要和数据库的字段匹配,在开发过程中还有,如果数据库的字段有变化的话代码修改越少越好。所以最好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 Tier.BLLClass;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class ProjectForm extends JFrame
{

    public String nameString;
    public JPanel panel;
    public TreeMap<String, JTextField> TextFieldMap = new TreeMap<>();

    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);
        btnNew.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                TreeMap<String, Object> data = new TreeMap<>();
                data.put("table", nameString);
                Set<String> key = TextFieldMap.keySet();
                for (Iterator it = key.iterator(); it.hasNext();)
                {
                    String s = (String) it.next();
                    data.put(s, TextFieldMap.get(s).getText());
                }
                BLLClass bll = new BLLClass();
                bll.Add(data);
            }
        });
        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 (Element node : tableList)
            {
                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 (Element UIfeild : UIfeilds)
                    {
                        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.TextFieldMap.put(feildnode.getName(), TextField);
                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }

        return form;
    }
}


之后则应该还有BLL和DAL的部分。
2014-03-29

为了先做出一个简单的架子,BLL,DAL也没有使用接口

BLL

import java.util.Map;

public class BLLClass
{
    public boolean Add(Map<String,Object> data)
    {
        DALClass dal = new DALClass();
        return dal.Add(data);
    }
}

DAL

import Common.SQLHelper;
import java.sql.*;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class DALClass
{

    public boolean Add(Map<String, Object> data)
    {
        try
        {
            String url = "jdbc:mysql://localhost:3306/";
            String user = "root";
            String pwd = "123456";

            //加载驱动,这一句也可写为:Class.forName("com.mysql.jdbc.Driver");
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            //建立到MySQL的连接
            Connection conn = DriverManager.getConnection(url, user, pwd);

            //执行SQL语句
            StringBuffer sqlFeildsString = new StringBuffer();
            String tablename = data.get("table").toString();
            int count = SQLHelper.GetFeilds("D:\\work eclipse\\1.xml", tablename, sqlFeildsString);
            String sqlString = SQLHelper.PerpareInsertString(tablename, sqlFeildsString.toString(), count);

            PreparedStatement state = conn.prepareStatement(sqlString);

            List<String> list = SQLHelper.GetFeildsList("D:\\work eclipse\\1.xml", tablename);
            for (int i = 0; i < list.size(); i++)
            {
                String name = list.get(i);
                Object obj = data.get(name);
                String value;
                if (obj == null)
                {
                    value = "";
                }
                else
                {
                    value = obj.toString();
                }
                state.setString(i + 1, value);
            }
            Date date = new Date();
            Timestamp tt=new Timestamp(date.getTime());
            state.setTimestamp(list.indexOf("createdat") + 1, tt);
            state.setTimestamp(list.indexOf("updatedat") + 1, tt);

            boolean rs = state.execute();
            conn.close();
        }
        catch (Exception ex)
        {
            System.out.println(ex.getMessage());
        }
        return false;
    }
}

源代码可以再下面的连接去下载

http://download.csdn.net/detail/tan_tan_1/7115649

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值