微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java:连接到db以获取数据

如何解决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();
        }

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?