我从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
。
答案 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();
}
}
你可以在更新/删除等时使用类似的方法