Java:连接到db以获取数据

时间:2011-04-15 19:57:59

标签: java database java-ee

我从Java获取数据时有一个关于Java的问题,比方说MySQL数据库。截至目前,我需要在获取数据时编写大量冗余代码。我想知道是否有更好的方法来做到这一点。

E.g。我有一个从表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

7 个答案:

答案 0 :(得分:1)

使用Spring,使用MyBatis或spring-jdbc进行数据访问而不是原始JDBC。

spring-jdbc是一个包装基本JDBC代码的库,您可以在其中提供回调以指定您希望结果集如何映射到对象等。 Mybatis更高级别,您在xml文件中指定查询。

使用Spring,最大的好处就是获得声明式事务,因此您没有代码启动和提交事务,您还可以获得数据访问对象的模板,并且设置连接池很容易。还有很多关于如何将各个部分放在一起的例子。

答案 1 :(得分:0)

您可以在那里创建一个具有静态方法的类,它会返回一个连接实例,如下所示:

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;
        }
    }
}

这样您就不需要创建不同的连接实例,并且只在一个地方进行更改(如果您想...)

答案 2 :(得分:0)

在某些时候,你最好自己写DAO来处理所有的管道。

答案 3 :(得分:0)

大多数情况下,当您编写使用数据库的程序时,每次要对其执行某些操作时都不会打开连接。而是在程序开始时打开一个连接,然后每次访问数据库时都使用它。

看看这个例子(伪代码!):

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
    }

}

答案 4 :(得分:0)

我认为您正在遭受基本代码组织的困扰。例如,您应该只创建一次连接,然后将其传递给任何需要它的方法。通常,人们使用连接池,因此数据库中只存在一定数量的连接(因为它们很昂贵),连接池管理器会根据需要将它们借出并跟踪它们的状态。 Java中有一些连接池库(Apache有一个),但我运气好:http://sourceforge.net/projects/c3p0/

我真的不喜欢像Hibernate这样的重型ORM,但我喜欢MyBatis。它让我怀疑SQL并且不会在我的域模型中注入自己:http://www.mybatis.org/java.html我认为通过拥有数据访问对象层(DAO)可以大大受益。该层抽象出与数据的通信,因此上面的层可以只获取数据集合,而不必担心生成该列表所需的基础SQL。

答案 5 :(得分:0)

我会做不同的事情取决于我是在单线程批处理作业还是在容器内。

对于单线程批处理作业:

  • 只创建一个连接并重复使用
  • 只创建一个预准备语句并重复使用
  • 优化提交调用

For J2EE

  • 使用容器托管数据源池

答案 6 :(得分:0)

自从我开始使用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();
        }

    }

你可以在更新/删除等时使用类似的方法