4

这是我必须连接数据库时经常遇到的问题;如何将 SQL 与普通的 java 代码分开?我通常为数据库连接使用单独的类,但是,当您有多个数据库和每个数据库中的多个表时,总是很难做到 100%

举个例子,如果我们想把所有的 java SQL 放在一个名为 DBConnector.java 的类中,我们如何为不同的插入、删除、数据检索等进行通用编码?我认为理想情况是所有 SQL 语句都应该在同一个类中,并且应该与数据库应用程序范围内的不同风格的相同操作兼容,从而提供与其余代码的逻辑分离。

public void insertData (String db, String table, <Whatever Fields to be Inserted>)
{
  //generic SQL INSERT statement and execution 
}

public ResultSet retrieveData (String db, String table, <Whatever Fields Relevant>) 
{
  //generic retrieval of data
}

有没有办法做到这一点?还是我们应该只为不同风格的插入、查询等添加功能?

谢谢!

4

4 回答 4

7

如果你想要一个健全的架构,你至少需要几层来分离关注点。

首先,从模型类开始(大多数时候,您需要为数据库中的每个表创建一个)。自己编写它们,或者使用 ORM(例如 EclipseLink、Hibernate)自动生成它们。这些应该是 POJO(普通旧 Java 对象),这意味着它们是simple具有属性的对象(例如Name字符串Id类型、整数类型等)。您的模型对象应该是数据的载体,仅此而已(当然没有逻辑或处理)。

然后,为所有模型类创建 DAO(数据访问对象)(如果需要,您可以构建一个 GenericDao 类来继承)。在这里,您将通过将模型对象作为参数的方法提供 CRUD 操作(插入、更新、删除) 。这是特定于数据库后端的,尽管您可以根据需要插入与数据库无关的 DAO 层。

第三,为每个逻辑类组有一个服务管理层(这是所有前端和控制器代码应该为所有想要的功能与之交谈的层)。可以调用一个典型的方法registerCustomer(...)(可能使用不同的 DAO 类)。或者findCustomerByName()等等。

以这种方式构建应用程序称为MVC(模型 - 视图 - 控制器),如果您想了解更多信息,这就是谷歌的术语。

这样,您通常不会有比 DAO 层更高的 SQL 查询,这意味着您的应用程序 a) 可维护 b) 以后更容易更改后端。

于 2012-06-03T18:57:13.737 回答
3

Izza,这里有一个关于将 SQL 与 java 代码分离的讨论:Java - 在外部文件中存储 SQL 语句 您的解决方案是可以理解的,但如果查询不是标准的(例如,不仅仅是 a = 10,但包含在 (...) 或 group by 所以我建议你避免它。为了在 Java 中使用 DB 时最小化样板代码,你应该使用 Spring JDBC。如果你的情况可以接受,你也可以使用 Hibernate ,它可以让你避免一些 sql 的用法。

于 2012-06-03T18:54:51.867 回答
1

您应该使用 some DAOFactory,此类用于获取连接。为了反映数据库中的表,您应该创建DTO - Data Tranfer Objects表示实体的表。因此,如果您有 table User,只需UserDTO.java使用属性、getter 和 setter 进行创建。与数据库通信的类是DAO - Data Access Object. 您应该只在此处创建用于从数据库中获取数据的 SQL 语句和方法。首先是精心设计的结构。然后你的代码会变得更干净、更快速、更安全。我建议您创建自己的ORM. 所以,看看和一些不同框架的测试


易ORM

double count = 0;
TransDB trans = new TransDB() ;
List<Trans> list = new ArrayList<Trans>();
list = trans.getAll();
for (Trans element : list)
{
count+= element.getData();
}
...

休眠

double count = 0;
Session session = null;
List<Trans> list = new ArrayList<Trans>();
list = HibernateUtil.getSessionFactory().openSession();
list = (List<Trans>) session
.createQuery("from Trans").list();
for (Trans element : list)
{
count += element.getData().doubleValue();
}
...

并比较??

评估(以毫秒为单位)

EasyORM:MySQL:init - 6344,avg - 4868 MS SQL:init - 8126,avg - 6752

休眠: MySQL:init - 27406,avg - 23728 MS SQL:init - 28605(+250%),avg - 24912

所以你自己的ORM实际生成SQL script的顺序比 Hibernate(to 10) 快,为什么?通过在层间插入肯定不能去提高吞吐量。这只是一项测试,我还有其他测试。所以对我来说,我建议您创建自己的ORM,这里还有一些缺点,例如时间消耗或使用的有问题的更改,DMS但作为对生成的命令的完全控制的优点,您可以使用特定于特定的功能DMS(ORDM、特殊命令等)。所以我认为这不是Hibernate最好的,真的不是。

于 2012-06-03T19:15:26.267 回答
1

The best approach is to use Hibernate, which is now the industry standard.

In a nutshell, it generates the SQL needed and the code deals with java objects that represent rows. If you call setters, Hibernate figures out the SQL needed to accomplish the update.

For getters, your code might look like for example:

shoppingCart.getCustomer().getCountry().getCode();

And hibernate figures out the SQL joins needed to get from the shopping_cart table to the country table via the customer table.

It is really awesome and worth transitioning to.

于 2012-06-03T18:52:19.240 回答