将SQL与Java代码分离

时间:2012-06-03 18:45:25

标签: java sql database

当我必须连接到数据库时,这是我经常遇到的问题;如何将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 个答案:

答案 0 :(得分:6)

如果你想要一个完善的体系结构,你至少需要几层才能解决问题。

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

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

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

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

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

答案 1 :(得分:2)

Izza, 这里有关于将SQL与java代码分离的讨论:Java - Storing SQL statements in an external file 你的解决方案是可以理解的,但是如果查询不是标准的话会有一些问题(例如,不仅仅是a = 10,而是包含在(...)或group by中,所以我建议你避免使用它。 要在Java中使用DB时最小化样板代码,您应该使用Spring JDBC。你也可以使用Hibernate,如果它在你的情况下是可以接受的,它允许你避免使用sql的一些用法。

答案 2 :(得分:1)

最好的方法是使用Hibernate,这是行业标准。

简而言之,它生成所需的SQL,代码处理表示行的java对象。如果你调用setter,Hibernate会找出完成更新所需的SQL。

对于getter,您的代码可能如下所示:

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

hibernate通过shopping_cart表计算出从country表到customer表所需的SQL连接。

这真的很棒,值得过渡到。

答案 3 :(得分:1)

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


<强> EasyORM

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(至10)和为什么更快?通过插入层之间肯定不能去提高吞吐量。这只是一个测试,我也有其他测试。 所以对我来说,我建议您创建自己的ORM,这里也有一些缺点,例如时间消耗或使用有问题的更改DMS但是作为对生成的命令的完全控制的优点,您可以使用特定于特别是DMS(ORDM,特殊命令等)。所以我不认为Hibernate是最好的,真的没有。