本帖最后由 ys_0225 于 2013-04-16 20:10:03 编辑

解决方案 »

  1.   

    这不就是一个简单的查询显示吗,有什么难的,这和是否用hibernate和spring有什么关系啊。
      

  2.   


    public class Test { /**
     * 这个是数据库查询接口,对应Spring里面的Service。
     * 查询参数,可以根据情况,自定义类型。
     */
    interface QueryService<T>{
    List<T> query(Properties queryParams);
    }
    /**
     * 查询事件对象,保存查询操作的相关信息。
     */
    class QueryEvent{
    Object source;//可以保存触发查询操作的Button对象,或者表示事件来源的对象信息。
    Properties queryParams;//查询的参数
    QueryService<?> queryService;//数据库查询操作对象
    JPanel target;//查询结果的显示对象
    Long createTime;//事件的创建时间
    }
    /**
     * 事件的执行器,调用call方法,完成查询操作。
     */
    abstract class EventRunner implements Runnable{
    private QueryEvent queryEvent;
    public EventRunner(QueryEvent queryEvent) {
    this.queryEvent = queryEvent;
    }
    public void run(){
    List<?> list;
    try {
    before(queryEvent);
    list = queryEvent.queryService.query(queryEvent.queryParams);
    setDatas(queryEvent.target,list,queryEvent);
    after(list,queryEvent);
    } catch (Throwable t) {
    onException(t);
    }
    }
    /**
     * 将查询结果设置到target对应的Panel里,显示给用户观看。这个方法必须实现。
     */
    protected abstract void setDatas(JPanel target, List<?> datas, QueryEvent event);
    /**
     * 在数据库查询之前调用,可以让target指向的Panel上显示“正在查询”字样的东西,增强用户体验。
     * 这个方法可以不用实现
     */
    protected void before(QueryEvent event) {
    }
    /**
     * 在数据库查询之后调用。这个方法可以不用实现。
     * 如果本次查询没有数据,可以让target指向的Panel上显示“没有查询结果”字样的东西,增强用户体验。
     */
    protected void after(List<?> datas, QueryEvent queryEvent2) {
    }
    /**
     * 在整个查询处理中,出现异常则会调用该方法。
     */
    protected void onException(Throwable t){
    t.printStackTrace();
    }
    }

    /**
     * 测试用例
     * 同步调用方式:
     */
    public void useage_0(){
    //写在按钮的触发(响应)代码(ActionListener)中的。
    ActionListener listener = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    QueryEvent queryEvent = new QueryEvent();
    queryEvent.source = e.getSource();
    queryEvent.createTime = System.currentTimeMillis();
    queryEvent.queryParams = new Properties();
    //采集查询条件,设置到queryParams中 ...
    //通过Spring的BeanFactory获得具体的QueryService对象
    //queryEvent.queryService = ApplicationContext.getBean("bean name");
    //queryEvent.target =  < some JTable object >;
    EventRunner runner = new EventRunner(queryEvent) {
    @Override
    protected void setDatas(JPanel target, List<?> datas, QueryEvent event) {
    // TODO 需要填写  设置数据的代码
    }
    };
    runner.run();
    }
    };
    //button.addActionListener(listener);
    }
    /**
     * 测试用例
     * 异步调用方式:
     */
    public void useage_1(){
    //写在按钮的触发(响应)代码(ActionListener)中的。
    ActionListener listener = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    QueryEvent queryEvent = new QueryEvent();
    queryEvent.source = e.getSource();
    queryEvent.createTime = System.currentTimeMillis();
    queryEvent.queryParams = new Properties();
    //采集查询条件,设置到queryParams中 ...
    //通过Spring的BeanFactory获得具体的QueryService对象
    //queryEvent.queryService = ApplicationContext.getBean("bean name");
    //queryEvent.target =  < some JTable object >;
    EventRunner runner = new EventRunner(queryEvent) {
    @Override
    protected void setDatas(JPanel target, List<?> datas, QueryEvent event) {
    // TODO 需要填写  设置数据的代码
    }
    };
    //如果上下文环境中存在ExecutorService(线程池)对象,
    //那么直接  executorService.submit(executor);

    //如果上下文环境中不存在线程池,那么创建线程,执行查询操作
    Thread executor = new Thread(runner);
    executor.start();
    }
    };
    //button.addActionListener(listener);
    }

    }
      

  3.   


    恩,谢谢,我这里不想使用bean来操作,数据库中表的数据很多所以不方便一个个来写,而且在eclipse里面没有集成ssh的条件下使用spring也不怎么会。。
    不过你的思路给的很好,非常感谢~
      

  4.   

    另外我自己改了下代码终于可以实现查询显示了,附上我的代码以供他人参考:
    其中sqlhelper里面主要是数据库连接以及查询方法,constant里面是对面板的一些参数进行初始化的操作,就不附上了~package pack.frame.pane.list;import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;import javax.swing.JPanel;import pack.BaseMainJPanel;
    import pack.MiddleButtonJPanel;
    import pack.SqlHelper;/**
     * 显示查询数据表中的信息面板
     * 
     */
    public class ListJPanel extends BaseMainJPanel { /**
     * 
     */
    private static final long serialVersionUID = 1L; private static ListJPanel ListJPanel;
    private ResultSet rs = null; private ListJPanel() { } public static ListJPanel getInstance() {
    // TODO Auto-generated method stub
    ListJPanel = new ListJPanel();
    return ListJPanel;
    } @Override
    public String[][] fillTableData() {
    // TODO Auto-generated method stub
    String sql = "select * from user";
    System.out.println(sql);
    rs = SqlHelper.execteQuery(sql, null);
    String[][] table = null;
    try {
    // 结果集指定到最后一行数据
    rs.last();
    int m = rs.getRow();
    ResultSetMetaData rsmd = rs.getMetaData();
    int n = rsmd.getColumnCount();
    table = new String[m][n + 1];
    // 将结果集指定到开头
    rs.beforeFirst(); System.out.println(m + " " + n); for (int i = 0; i < m && rs.next(); i++) {
    for (int j = 1; j <= n; j++) {// 这个getString规定是从1开始的哈。
    table[i][j] = rs.getString(j);
    // System.out.println(table[i][0]);
    table[i][j - 1] = rs.getString(j);
    }
    }

    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } return table;
    } @Override
    public String[] fillTableHeader() {
    // TODO Auto-generated method stub
    String sql = "select * from user";
    System.out.println(sql);
    rs = SqlHelper.execteQuery(sql, null);
    String[] column_name = null;
    try {
    ResultSetMetaData rsmd = rs.getMetaData();
    int n = rsmd.getColumnCount();
    // 获取列名
    column_name = new String[n];
    for (int i = 0; i < n; i++)
    column_name[i] = rsmd.getColumnName(i + 1);
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return column_name;
    } @Override
    public JPanel setButtonJPanel() {
    // TODO Auto-generated method stub
    return new MiddleButtonJPanel(czJpanel);
    }}import java.awt.BorderLayout;
    import javax.swing.JPanel;
    import com.tqms.util.Constant;
    /**
     * 有表格的面板
     * @author Administrator
     */
    public abstract class BaseMainJPanel extends JPanel implements Constant { public final static String czJpanel = "czJpanel";
    private static final long serialVersionUID = 6818200379655732088L; public abstract String[][] fillTableData(); public abstract String[] fillTableHeader(); public abstract JPanel setButtonJPanel();
    /**
     * 显示面板
     */
    public void viewJPanel() {
    this.setLayout(new BorderLayout());
    DataTableJScrollPane dataPanel = new DataTableJScrollPane(
    fillTableData(), fillTableHeader());
    this.add(dataPanel, BorderLayout.CENTER);
    // 按钮面板设为--布局置顶
    this.add(setButtonJPanel(), BorderLayout.NORTH);
    } public BaseMainJPanel() {
    super();
    }
    }import java.awt.Color;
    import java.awt.FlowLayout;import javax.swing.JButton;
    import javax.swing.JPanel;
    /**
     * 操作布局顶部按钮面板
     * 
     * @author Administrator
     */
    public class MiddleButtonJPanel extends JPanel {
        
        private static final long serialVersionUID = -593726515640329532L;
        
        public MiddleButtonJPanel(String jpanelName) {
            // 设置布局
            FlowLayout flowLayout = new FlowLayout();
            flowLayout.setVgap(2);
            flowLayout.setHgap(2);
            flowLayout.setAlignment(FlowLayout.RIGHT);
            setLayout(flowLayout);
            setBackground(new Color(232, 232, 232));
            
        }
    }
      

  5.   


    但是这个显示需要嵌套啊,嵌套到另一个面板里面,不要hibernate和spring在获取数据库中数据的时候有些问题啊。。 当然我不怎么懂还是。。难不难只有自己去写才知道,对于我这样的菜鸟来说确实有点困难,所以才来发帖提问的。。