通过类的java sql连接
我有以下代码:
import java.sql.*; import java.net.*; public class binsz { public void dbConnect(String db_connect_string, String username, String password) { try { Class.forName("net.sourceforge.jtds.jdbc.Driver"); Connection conn = DriverManager.getConnection(db_connect_string, username, password); // System.out.println("connected"); } catch (Exception e) { e.printStackTrace(); } } public void dbQuery(String query) { try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { String db_name = "sqlserver.local"; String username = "sa"; String password = "passwordforsa"; String connection = "jdbc:jtds:sqlserver://" + db_name; Connection conn = null; binsz db = new binsz(); db.dbConnect(connection, username, password); String query = "SELECT TOP 2 * FROM aux..table_name"; db.dbQuery(query); } }
并在编译时出错:
binsz.java:20: cannot find symbol symbol : variable conn location: class sip_bins Statement stmt = conn.createStatement(); ^ 1 error
我怎样才能使用binsz db = new binsz();
执行查询并检索它的值。
谢谢
PS:与数据库的连接正在工作..(如果我取消注释该行,则打印“已连接”)
这是非常糟糕的代码 – 没有写的。 你有很多工作要做。
我建议你学习这个并抛弃你的代码:
package persistence; import java.sql.*; import java.util.*; /** * util.DatabaseUtils * User: Michael * Date: Aug 17, 2010 * Time: 7:58:02 PM */ public class DatabaseUtils { private static final String DEFAULT_DRIVER = "oracle.jdbc.driver.OracleDriver"; private static final String DEFAULT_URL = "jdbc:oracle:thin:@host:1521:database"; private static final String DEFAULT_USERNAME = "username"; private static final String DEFAULT_PASSWORD = "password"; /* private static final String DEFAULT_DRIVER = "org.postgresql.Driver"; private static final String DEFAULT_URL = "jdbc:postgresql://localhost:5432/party"; private static final String DEFAULT_USERNAME = "pgsuper"; private static final String DEFAULT_PASSWORD = "pgsuper"; */ /* private static final String DEFAULT_DRIVER = "com.mysql.jdbc.Driver"; private static final String DEFAULT_URL = "jdbc:mysql://localhost:3306/party"; private static final String DEFAULT_USERNAME = "party"; private static final String DEFAULT_PASSWORD = "party"; */ public static void main(String[] args) { long begTime = System.currentTimeMillis(); String driver = ((args.length > 0) ? args[0] : DEFAULT_DRIVER); String url = ((args.length > 1) ? args[1] : DEFAULT_URL); String username = ((args.length > 2) ? args[2] : DEFAULT_USERNAME); String password = ((args.length > 3) ? args[3] : DEFAULT_PASSWORD); Connection connection = null; try { connection = createConnection(driver, url, username, password); DatabaseMetaData meta = connection.getMetaData(); System.out.println(meta.getDatabaseProductName()); System.out.println(meta.getDatabaseProductVersion()); String sqlQuery = "SELECT PERSON_ID, FIRST_NAME, LAST_NAME FROM PERSON ORDER BY LAST_NAME"; System.out.println("before insert: " + query(connection, sqlQuery, Collections.EMPTY_LIST)); connection.setAutoCommit(false); String sqlUpdate = "INSERT INTO PERSON(FIRST_NAME, LAST_NAME) VALUES(?,?)"; List parameters = Arrays.asList("Foo", "Bar"); int numRowsUpdated = update(connection, sqlUpdate, parameters); connection.commit(); System.out.println("# rows inserted: " + numRowsUpdated); System.out.println("after insert: " + query(connection, sqlQuery, Collections.EMPTY_LIST)); } catch (Exception e) { rollback(connection); e.printStackTrace(); } finally { close(connection); long endTime = System.currentTimeMillis(); System.out.println("wall time: " + (endTime - begTime) + " ms"); } } public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException { Class.forName(driver); if ((username == null) || (password == null) || (username.trim().length() == 0) || (password.trim().length() == 0)) { return DriverManager.getConnection(url); } else { return DriverManager.getConnection(url, username, password); } } public static void close(Connection connection) { try { if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static void close(Statement st) { try { if (st != null) { st.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static void close(ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static void rollback(Connection connection) { try { if (connection != null) { connection.rollback(); } } catch (SQLException e) { e.printStackTrace(); } } public static List
Connection conn
当前位于方法dbConnect
中的Connection conn
声明为实例变量。 您收到此错误,因为conn
在方法dbQuery
是未知的。
你应该连接一个实例变量this.conn = DriverManager...
我还建议使用一个良好的连接池。
还记得在完成它们之后关闭语句,结果集和连接。
UPDATE
try { ... } finally { if (rs != null) rs.close(); if (st != null) st.close(); //if (conn != null) conn.close(); // depends on wheter you need it again, or whil retrieve a new one }
什么是骗局?
Statement stmt = conn.createStatement();
在方法中
public void dbQuery(String query)
如果希望类的多个方法访问它,则需要将conn声明为实例变量。
你有:
public void dbConnect(String db_connect_string, String username, String password)
和电话:
db.dbConnect(connection, username, password);
您应该将其更改为:
public void dbConnect(Connection conn, String username, String password) { ... conn = DriverManager.getConnection(db_connect_string, username, password); ... }
和用法:
db.dbConnect(conn, username, password);
您还应该将方法的签名更改为:
public void dbQuery(String query, Connection conn);
和用途:
db.dbQuery(query, conn);