我在移动 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
来获取其他行,您必须执行另一个查询。
一般来说,您永远不需要所有行(代码表除外)。您应该查询您想要查看的行。
要更新一行,您有两种选择:
- 执行
UPDATE
SQL 语句。 - 使用可更新的
ResultSet
对要更新的行执行SELECT
语句,设置值并调用updateRow()
。<
要插入新行,请执行 INSERT
SQL 语句。您不想为此使用可更新的 ResultSet
,因为您必须先执行一个虚拟 SELECT
,这样效率很低。
此外,您还可以查看 CachedRowSet ,用于以断开连接的方式处理数据。
关于java - 如何将我的结果集移动到特定记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32102281/