如何解决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 举报,一经查实,本站将立刻删除。