java - 如何将我的结果集移动到特定记录

标签 java mysql jdbc

我在移动 ResultSet 当前记录时遇到一些问题。

我正在学习 JDBC,我来自 Clipper 和 Delphi。因此,我曾经有某种“引用”,例如记录号或对“标记”记录的引用,因此我可以保存此引用并稍后移回该位置。 在尝试使用 JDBC 和 MySql 执行相同操作时,我尝试使用 select/where 语句来获取我想要的记录。没关系。但是,当我尝试获取记录的行时,结果集中总是只有一行(我意识到甚至在编写代码之前就可能发生这种情况,但我必须进行测试,因为这就是您学习的方式。 :))。

所以,长话短说。我需要一种方法来通过某个值(例如主键)“查找”记录(可能带有选择/位置)并“保存”该位置。因此,我可以将数据库移动到同一记录,但包含大量数据(不仅仅是过滤后的数据)。 我可以花一些时间(next())或解决一些sql代码,使我的表单以不同的方式工作。但这不是我的目标。

所以。有人知道如何做到这一点吗?这就是我的 DAO 类(class)。我希望方法“findCod”将我的结果集移动到 rsConsulta 中的同一记录。

DAO 类:

    package control;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import javax.sql.rowset.FilteredRowSet;
    import javax.swing.JOptionPane;
    import model.Pais;

    /**
     *
     * @author X8
     */
    public class PaisDAO extends GenericDAO<Pais> {

        private Connection conn;
        private PreparedStatement ps;
        private ResultSet rollRs;

        private final String SELECT_QUERY="select * from paises";

        public PaisDAO() {
        }

        /**
         * Cria a conexao e retorna a mesma.
         * @return
         * @throws SQLException 
         */
        @Override
        public Connection getConnection() {
            return conn;
        }

        /**
         * @param conn 
         */
        @Override
        public void startConnection(Connection conn)  {
            this.conn=conn;

        } //startConnection

        /**
         * @throws SQLException 
         */
        @Override
        public void startDataSet() throws SQLException{
            ps=conn.prepareStatement(SELECT_QUERY, 
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            rollRs=ps.executeQuery();
        }


        @Override
        public void novo(Pais p) throws SQLException{

            try {

                rollRs.moveToInsertRow(); //nova linha
                rollRs.updateInt("pais", p.getPais());
                rollRs.updateString("abreviado", p.getAbreviado());
                rollRs.updateString("descricao",p.getDescricao());
                rollRs.updateString("icone",p.getIcone());
                rollRs.insertRow(); //Salva as alteracoes.
                rollRs.moveToCurrentRow();


            } catch (SQLException e) {
                throw new SQLException(e.getMessage());
            }

        } //fim novo pais

        @Override
        public void altera(Pais p) throws SQLException{
            try {

                rollRs.updateInt("pais", p.getPais());
                rollRs.updateString("abreviado", p.getAbreviado());
                rollRs.updateString("descricao",p.getDescricao());
                rollRs.updateString("icone",p.getIcone());
                rollRs.updateRow();
                rollRs.moveToCurrentRow();
            } catch (SQLException e) {
                throw new SQLException(e.getMessage());
            }

        }

        public void filtra(String filtro) throws SQLException{
            rollRs=ps.executeQuery(SELECT_QUERY+" where "+filtro);

        }

        public String filtraPais(int ...pais) throws SQLException{
            String query="(";
            int cont=0;
            for (int p:pais){
                query+="(pais="+Integer.toString(p)+") ";
                cont++;
                if (cont<pais.length)
                    query+="or ";
            }
            query+=")";
            filtra(query);
            return query;
        }


        @Override
        public void exclui() throws SQLException{
            rollRs.deleteRow();
            rollRs.moveToCurrentRow();
        }

        /**
         *
         * @return
         * @throws SQLException
         */
        @Override
        public int getRow() throws SQLException{
            return rollRs.getRow();
        }
        /**
         * 
         * @param row
         * @return
         * @throws SQLException 
         */
        @Override
        public int goToRow(int row) throws SQLException{
            int oldRow=getRow();
            rollRs.absolute(row);
            return oldRow;
        }
        /**
         * 
         * @throws SQLException 
         */
        @Override
        public void first() throws SQLException{
            rollRs.first();
        }
        /**
         * 
         * @throws SQLException 
         */
        @Override
        public void last() throws SQLException {
            rollRs.last();
        }

        @Override
        public void previous() throws SQLException{
            if (rollRs.isBeforeFirst()){
                rollRs.first();
            } else {
                rollRs.previous();
            }
        }
        /**
         * 
         * @throws SQLException 
         */
        @Override
        public void next() throws SQLException{
            if (rollRs.isAfterLast()){
                rollRs.last();
            } else {
                rollRs.next();
            }
        }

        /**
         * Retorna objeto no registro atual
         * @return 
         * @throws java.sql.SQLException 
         */
        @Override
        public Pais getCurrent() throws SQLException {
            Pais p=new Pais();

            p.setPais(rollRs.getInt("Pais"));
            p.setDescricao(rollRs.getString("Descricao"));
            p.setAbreviado(rollRs.getString("Abreviado"));
            p.setIcone(rollRs.getString("Icone"));
            return p;
        }

        /**
         * Fecha todas as conexoes e datasets
         * @throws SQLException 
         */    
        @Override
        public void closeAll() throws SQLException {
            try {

                if (!rollRs.isClosed())
                    rollRs.close();
                if (!ps.isClosed())
                    ps.close();
                if (!conn.isClosed())
                    conn.close();

            } catch (SQLException e) {
                throw new SQLException(e.getMessage());

            }

        } //fim closeAll

        public ArrayList<Pais> asArrayList() throws SQLException{
            ArrayList <Pais> aPais=new ArrayList<>();
            first();
            aPais.add(getCurrent());
            while (rollRs.next()){
                aPais.add(getCurrent());

            }

            return aPais;
        }

        public String[] getColumnNames(){
            String[] nomes={"Pais","Abrev","Descrição","Icone"};


            return nomes;
        }

        public void findCod(Pais p) throws SQLException{
            int codPais=p.getPais();
            PreparedStatement psConsulta=conn.prepareStatement(SELECT_QUERY+" 
where pais=?", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            psConsulta.setInt(1, codPais);
            ResultSet rsConsulta=psConsulta.executeQuery();


            rsConsulta.first();
            //JOptionPane just for debug 
            JOptionPane.showMessageDialog(null, "Line 
number"+rsConsulta.getRow());
            //there we suposed to move the rollRs dataset to the same record  
of rsConsulta
            goToRow(rsConsulta.getRow());  //always go to line 1.




        }
    } //EOF

提前致谢。我希望我说得容易理解。

最佳答案

您的 ResultSet 将仅包含您执行的 SQL 查询选择的行。

如果查询是SELECT * FROM paises,则所有行都会从数据库传输到您的程序。

如果查询是SELECT * FROM paises WHERE pais=?,则仅选择与条件匹配的行。然后,您无法导航 ResultSet 来获取其他行,您必须执行另一个查询。

一般来说,您永远不需要所有行(代码表除外)。您应该查询您想要查看的行。

要更新一行,您有两种选择:

  1. 执行UPDATE SQL 语句。
  2. 使用可更新的 ResultSet 对要更新的行执行 SELECT 语句,设置值并调用 updateRow()。<

要插入新行,请执行 INSERT SQL 语句。您不想为此使用可更新的 ResultSet,因为您必须先执行一个虚拟 SELECT,这样效率很低。

此外,您还可以查看 CachedRowSet ,用于以断开连接的方式处理数据。

关于java - 如何将我的结果集移动到特定记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32102281/

相关文章:

php - 从 MYSQL 查询中删除数组中的重复项,然后插入到另一个表中

mysql - 有没有办法在 MySQL 中动态执行代码,类似于 Oracle 中的 "execute immediate"?

java - HPC + Oracle 连接 = 灾难的秘诀?

java - 在 IntelliJ 中自动为每个参数生成 `Objects.requireNonNull` 行?

java - 用jprogressbar显示剩余时间?

java - 删除 ArrayList 中的重复项 - Java

java - 通过 JDBC 连接到数据库

java - 将 mp3 转换为 LINEAR_16 或 FLAC 格式以用于谷歌云语音

php - MySQL 在特殊字符处截断字符串

javascript - 创建动态准备语句以插入数据库