Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 优化查询,而不是使用偏移、限制和按顺序_Java_Query Optimization_Limit_Offset_H2db - Fatal编程技术网

Java 优化查询,而不是使用偏移、限制和按顺序

Java 优化查询,而不是使用偏移、限制和按顺序,java,query-optimization,limit,offset,h2db,Java,Query Optimization,Limit,Offset,H2db,我是java新手,我面临着一个小问题。 实际上,我正在从包含7345987条记录的表中提取数据,并将它们显示在jtable上。 到目前为止,我已经通过使用Limit和offset成功地完成了这项工作 我的问题是: ResultSet rs1 = stmt1.executeQuery( "SELECT ANUMBER,BNUMBER,DATETIME FROM CDR LIMIT '" + recordPerPage + "' OFFSET '" + offSet

我是java新手,我面临着一个小问题。 实际上,我正在从包含7345987条记录的表中提取数据,并将它们显示在
jtable
上。 到目前为止,我已经通过使用
Limit
offset
成功地完成了这项工作

我的问题是:

ResultSet rs1 = stmt1.executeQuery(
                "SELECT ANUMBER,BNUMBER,DATETIME FROM CDR LIMIT '" + recordPerPage + "' OFFSET '" + offSet + "' ");
我已将第1页的
recordPerPage
设置为100000,将
offset
设置为0,并将第2页的
offset
增加到100001,以此类推

但是我想按列对结果进行排序。当我在
限制和偏移量之前的查询中尝试使用
order by
时。它需要花费大量时间,因为它首先对整个表进行排序,然后在每页的每次迭代中应用限制和偏移

但我想要的是,它应该使用一次order,然后在结果集上应用limit和offset。对于这种情况,这里有什么解决方案吗

以下是我的完整代码,以了解我在做什么

public class Try {

    static Connection conn;
    static JPanel panel;
    static DefaultTableModel model = new DefaultTableModel();
    static JTable table = new JTable(model);
    static JButton fButton, lButton, pButton, nButton;
    static int buttonID;
    static int totalRows;
    static int recordPerPage = 100;
    static int totalPages = 0;
    static int offSet = 0;
    static String x = "", y = "", z = "", inputValue = "";
    static int currentPage = 1;
    static JTextField pagingInput;

    private static JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    createAndShowGUI();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        });
    }

    protected static void createAndShowGUI() throws SQLException {
        JFrame frame = new JFrame();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(30, 50, 1300, 600);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        frame.setContentPane(contentPane);

        UIManager.put("TabbedPane.selected", Color.lightGray);
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.setBorder(new EmptyBorder(10, 10, 10, 10));
        frame.add(tabbedPane);

        panel = new JPanel();
        tabbedPane.addTab("TABLE", null, panel, null);
        tabbedPane.setFont(new Font("Dialog", Font.BOLD | Font.ITALIC, 16));
        panel.setBackground(Color.white);
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        JPanel panel_1 = new JPanel();
        tabbedPane.addTab("GRAPH", null, panel_1, null);
        panel_1.setBackground(Color.white);

        JTable table = new JTable();
        panel.add(table);
        table.setFillsViewportHeight(true);

        createDBConnection();
    }

    private static void createDBConnection() throws SQLException {
        try {
            Class.forName("org.h2.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            conn = DriverManager.getConnection("jdbc:h2:file:G:/hs_data/h2_db/test", "sa", "sa");
        } catch (SQLException e) {
            System.out.println("Unable to make connection with DB");
            e.printStackTrace();
        }
        createPaginationButtons(conn);
    }

    private static void createPaginationButtons(Connection conn) throws SQLException {
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT count(*) FROM cdr");
        while (rs.next()) {
            totalRows = rs.getInt(1);
        }
        // int v = totalRows % recordPerPage == 0 ? 0 : 1;
        totalPages = totalRows / recordPerPage;
        createButton(totalPages);
    }

    private static void createButton(int totalPages) throws SQLException {

        fButton = new JButton("FIRST");
        lButton = new JButton("LAST");
        pButton = new JButton("PREVIOUS");
        nButton = new JButton("NEXT");
        pagingInput = new JTextField(10);
        Font bigFont = pagingInput.getFont().deriveFont(Font.PLAIN, 17f);
        pagingInput.setFont(bigFont);

        fButton.addActionListener(buttonlistener);
        lButton.addActionListener(buttonlistener);
        pButton.addActionListener(buttonlistener);
        nButton.addActionListener(buttonlistener);
        pagingInput.addActionListener(inputlistener);

        fButton.setBackground(new Color(26, 82, 118));
        lButton.setBackground(new Color(26, 82, 118));
        pButton.setBackground(new Color(26, 82, 118));
        nButton.setBackground(new Color(26, 82, 118));

        fButton.setForeground(Color.white);
        lButton.setForeground(Color.white);
        pButton.setForeground(Color.white);
        nButton.setForeground(Color.white);

        fButton.setEnabled(false);
        pButton.setEnabled(false);

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(fButton);
        buttonPanel.add(pButton);
        buttonPanel.add(pagingInput);
        buttonPanel.add(nButton);
        buttonPanel.add(lButton);

        panel.add(buttonPanel);

        createTable(offSet);

    }

    static ActionListener inputlistener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            inputValue = pagingInput.getText();
            try {
                buttonID = Integer.parseInt(inputValue);
                offSet = (buttonID * recordPerPage) + 1;
                currentPage = buttonID;
                populateTable(offSet);
            } catch (NumberFormatException e2) {
                JOptionPane.showMessageDialog(null, "Please Enter Only Integers From 1 to'" + totalPages + "'");
                // e2.printStackTrace();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }

        }
    };

    static ActionListener buttonlistener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() instanceof JButton) {
                String text = ((JButton) e.getSource()).getText();
                if (text == "FIRST") {
                    offSet = 0;
                    currentPage = 1;
                } else if (text == "LAST") {
                    offSet = (totalPages * recordPerPage) + 1;
                    currentPage = totalPages;
                } else if (text == "NEXT") {
                    offSet = (currentPage * recordPerPage) + 1;
                    currentPage++;
                } else if (text == "PREVIOUS") {
                    if (currentPage == 2) {
                        offSet = 0;
                        currentPage--;
                    } else {
                        offSet = offSet - recordPerPage;
                        currentPage--;
                    }
                }

                if (currentPage >= totalPages) {
                    fButton.setEnabled(true);
                    pButton.setEnabled(true);
                    lButton.setEnabled(false);
                    nButton.setEnabled(false);
                }
                if (currentPage <= 1) {
                    fButton.setEnabled(false);
                    pButton.setEnabled(false);
                }
                if (currentPage > 1) {
                    fButton.setEnabled(true);
                    pButton.setEnabled(true);
                }
                try {
                    populateTable(offSet);
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }

        }
    };

    private static void createTable(int offSet) throws SQLException {

        model.addColumn("ANUMBER");
        model.addColumn("BNUMBER");
        model.addColumn("DATETIME");

        DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer();
        headerRenderer.setBackground(new Color(26, 82, 118));
        headerRenderer.setForeground(Color.white);
        for (int i = 0; i < table.getModel().getColumnCount(); i++) {
            table.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer);
        }
        table.getTableHeader().setPreferredSize(new Dimension(30, 30));

        UIDefaults defaults = UIManager.getLookAndFeelDefaults();
        if (defaults.get("Table.alternateRowColor") == null)
            defaults.put("Table.alternateRowColor", new Color(240, 240, 240));
        panel.add(new JScrollPane(table));
        populateTable(offSet);
    }

    public static void populateTable(int offSet2) throws SQLException {

        model.setRowCount(0);
        Statement stmt1 = conn.createStatement();
        ResultSet rs1 = stmt1.executeQuery(
                "SELECT ANUMBER,BNUMBER,DATETIME FROM CDR LIMIT '" + recordPerPage + "' OFFSET '" + offSet + "' ");
        while (rs1.next()) {
            x = rs1.getString("ANUMBER");
            y = rs1.getString("BNUMBER");
            z = rs1.getString("DATETIME");
            model.addRow(new Object[] { x, y, z });

        }
        table.setRowHeight(25);
    }

}
公共类尝试{
静态连接接头;
静态JPanel面板;
静态DefaultTableModel=new DefaultTableModel();
静态JTable表=新JTable(模型);
静态JButton fButton、lButton、pButton、nButton;
静态int按钮;
静态整数行;
静态int-recordPerPage=100;
静态int totalPages=0;
静态整数偏移=0;
静态字符串x=“”,y=“”,z=“”,inputValue=“”;
静态int currentPage=1;
静态JTextField分页输入;
私有静态JPanel内容窗格;
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
createAndShowGUI();
}捕获(SQLE异常){
e、 printStackTrace();
}
}
});
}
受保护的静态void createAndShowGUI()引发SQLException{
JFrame=新JFrame();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
机架立根(30、50、1300、600);
contentPane=newjpanel();
setboorder(新的EmptyBorder(5,5,5,5));
setLayout(新的BorderLayout(0,0));
frame.setContentPane(contentPane);
UIManager.put(“TabbedPane.selected”,Color.lightGray);
JTabbedPane tabbedPane=新的JTabbedPane();
tabbedPane.setboorder(新的EmptyBorder(10,10,10,10));
frame.add(选项卡窗格);
panel=新的JPanel();
addTab(“表”,null,panel,null);
tabbedPane.setFont(新字体(“对话框”,Font.BOLD | Font.ITALIC,16));
面板.立根背景(颜色.白色);
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
JPanel panel_1=新的JPanel();
tabbedPane.addTab(“图形”,null,panel_1,null);
面板1.立根背景(颜色:白色);
JTable table=新的JTable();
面板。添加(表);
表.setFillsViewPerthweight(真);
createDBConnection();
}
私有静态void createDBConnection()引发SQLException{
试一试{
Class.forName(“org.h2.Driver”);
}catch(classnotfounde异常){
e、 printStackTrace();
}
试一试{
conn=DriverManager.getConnection(“jdbc:h2:file:G:/hs_data/h2_db/test”、“sa”、“sa”);
}捕获(SQLE异常){
System.out.println(“无法与数据库建立连接”);
e、 printStackTrace();
}
创建分页按钮(conn);
}
私有静态void createPaginationButtons(连接连接)引发SQLException{
语句stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(“从cdr中选择计数(*));
while(rs.next()){
totalRows=rs.getInt(1);
}
//INTV=totalRows%recordPerPage==0?0:1;
totalPages=totalRows/recordPerPage;
createButton(totalPages);
}
私有静态void createButton(int totalPages)引发SQLException{
fButton=新的JButton(“第一”);
lButton=新JButton(“最后”);
pButton=新的JButton(“先前”);
nButton=新的JButton(“下一个”);
PaginInput=新的JTextField(10);
Font-bigFont=paginput.getFont().deriveFont(Font.PLAIN,17f);
paginput.setFont(bigFont);
fButton.addActionListener(buttonlistener);
lButton.addActionListener(buttonlistener);
pButton.addActionListener(buttonlistener);
addActionListener(buttonlistener);
PaginInput.addActionListener(inputlistener);
挫折背景(新颜色(26,82,118));
lButton.setBackground(新颜色(26,82,118));
挫折背景(新颜色(26,82,118));
挫折背景(新颜色(26,82,118));
fButton.setForeground(颜色:白色);
b按钮。设置前景(颜色。白色);
设置前景(颜色为白色);
设置前景(颜色为白色);
fButton.setEnabled(假);
pButton.setEnabled(假);
JPanel buttonPanel=新的JPanel();
按钮面板。添加(fButton);
按钮面板添加(pButton);
按钮面板。添加(分页输入);
按钮面板添加(n按钮);
按钮面板添加(lButton);
面板。添加(按钮面板);
创建表(偏移);
}
静态ActionListener inputlistener=新ActionListener(){
已执行的公共无效操作(操作事件e){
inputValue=PaginInput.getText();
试一试{
buttonID=Integer.parseInt(inputValue);
偏移量=(buttonID*recordPerPage)+1;
currentPage=buttonID;
可填充(偏移);
}捕获(NumberFormatException e2){
JOptionPane.showMessage