当我必须连接到数据库时,这是我经常遇到的问题;如何将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
}
有没有办法实现这个目标?或者我们应该只为不同风格的插入,查询等添加功能吗?
谢谢!
答案 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
是最好的,真的没有。