Java:连接到db以获取数据

| 当从中获取数据时,我有一个关于Java的问题,可以说是MySQL数据库。到目前为止,在获取数据时,我需要编写很多冗余代码。我想知道是否有更好的方法可以做到这一点。 例如。我有一个从表A中获取数据的方法。那么该方法看起来像这样
public void readDataBase() throws Exception {
        try {
            Class.forName(\"com.mysql.jdbc.Driver\");
            connect = DriverManager
                    .getConnection(\"jdbc:mysql://localhost/feedback?\"
                            + \"user=sqluser&password=sqluserpw\");

            statement = connect.createStatement();
            resultSet = statement
                    .executeQuery(\"select * from FEEDBACK.COMMENTS\");
            writeResultSet(resultSet);              

        } catch (Exception e) {
            throw e;
        } finally {
            close();
        }

    }
我想知道是否有更好的方法来编写这样的方法。因为当您必须编写诸如此类的代码时,这变得很丑陋,即在从数据库中获取数据的每种方法中,始终必须将这些行写至
getConnection
。     
已邀请:
使用Spring和MyBatis或spring-jdbc进行数据访问,而不要使用原始JDBC。 spring-jdbc是一个包装基本JDBC代码的库,您可以在其中提供回调以指定将结果集映射到对象等的方式。 Mybatis更高一些,您可以在xml文件中指定查询。 使用Spring的最大好处是,您可以获得声明式事务,因此您无需启动和提交事务的代码,还可以获得用于数据访问对象的模板,并且建立连接池很容易。关于如何将各个部分组合在一起的例子很多。     
在某些时候,最好编写自己的DAO,该DAO为您处理所有管道。     
根据我是在单线程批处理作业中还是在容器中,我会做不同的事情。 对于单线程批处理作业: 仅创建一个连接并重复使用 只创建一个准备好的语句并重用它 优化提交调用 对于J2EE 使用容器管理的数据源池     
在大多数情况下,编写与数据库一起使用的程序时,并非每次要进行连接时都打开连接。而是在程序开始时打开一个连接,然后每次访问数据库时都使用它。 看一下这个例子(伪代码!):
class Database {

    private Connection conn;

    public Database() {
        connect();
    }

    private void connect() {
        Class.forName(\"com.mysql.jdbc.Driver\");
        conn = DriverManager.getConnection(dbUrl);
    }

    public void close() {
        conn.close();
    }

    private ResultSet readSth() {
        statement = conn.createStatement();
        return statement.executeQuery(\"select * from FEEDBACK.COMMENTS\");
    }

    private void doSth() {
        // do sth else with conn
    }

}
    
您可以在其中创建一个具有静态方法的类,该类将为您返回一个连接实例,如下所示:
import java.sql.*;
import java.util.Properties;

public class Getconnection{
    private static final String dbClassName = \"com.mysql.jdbc.Driver\";
    private static final String CONNECTION =\"jdbc:mysql://127.0.0.1/dbUserData\";
    private static Properties p = new Properties();
    public static Connection getConnection(){
        p.put(\"user\",\"root\");
        p.put(\"password\",\"library\");
        try{
            Class.forName(dbClassName);
            Connection con=DriverManager.getConnection(CONNECTION,p);
            return con;
        }
        catch(Exception ie){
            ie.printStackTrace();
            return null;
        }
    }
}
这样就无需创建其他连接实例,并且只需要在一个位置进行更改即可...     
我认为您正在遭受基本代码组织的困扰。例如,您应该只创建一次连接,然后将其传递给需要的任何方法。通常,人们使用连接池,以便与数据库之间仅存在一定数量的连接(因为它们很昂贵),并且连接池管理器将根据需要借出它们并跟踪其状态。 Java中有一些连接池库(Apache有一个),但是我使用以下方法很幸运:http://sourceforge.net/projects/c3p0/ 我真的不喜欢沉重的ORM,例如Hibernate,但我确实喜欢MyBatis。它使我无法使用SQL,并且不会在整个域模型中自我注入:http://www.mybatis.org/java.html我认为,拥有数据访问对象层(DAO)将使您受益匪浅。该层抽象出与您的数据的通信,因此上面的层可以仅获取数据集合,而不必担心生成该列表所用的基础SQL。     
自从开始使用ORM(例如Hibernate)以来,我就不再直接进行JDBC访问。 或者为什么不从数据库读取一些公开可用的静态方法:
public ResultSet readDataBase(String query) throws Exception {
        try {
            Class.forName(\"com.mysql.jdbc.Driver\");
            connect = DriverManager
                    .getConnection(\"jdbc:mysql://localhost/feedback?\"
                            + \"user=sqluser&password=sqluserpw\");

            statement = connect.createStatement();
            return statement.executeQuery(query);

        } catch (Exception e) {
            throw e;
        } finally {
            close();
        }

    }
并且在执行更新/删除等操作时可以使用类似的方法     

要回复问题请先登录注册