从Java代码中分离SQL

从Java代码中分离SQL,java,sql,database,Java,Sql,Database,这是我必须连接到数据库时经常遇到的问题;如何将SQL与普通java代码分开?我通常为数据库连接使用单独的类,但是,当您在每个数据库中有多个数据库和多个表时,总是很难做到100% 例如,如果我们想将所有java SQL放在一个名为DBConnector.java的类中,我们如何为不同的插入、删除、数据检索等编写通用代码?我认为理想的情况是,所有SQL语句都应该在同一个类中,并且应该与数据库应用程序范围内相同操作的不同风格兼容,从而提供了与其余代码的逻辑分离 public void insertDa

这是我必须连接到数据库时经常遇到的问题;如何将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
}
public void insertData(字符串数据库、字符串表)
{
//通用SQL INSERT语句及其执行
}
公共结果集retrieveData(字符串数据库、字符串表)
{
//数据的一般检索
}
有没有办法做到这一点?或者我们应该为不同的插入、查询等添加功能吗


谢谢大家!

最好的方法是使用,这是目前的行业标准

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

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

shoppingCart.getCustomer().getCountry().getCode();
hibernate通过
customer
表计算出从
shopping\u cart
表到
country
表所需的SQL联接

这真是太棒了,值得一试。

Izza, 这里讨论了如何将SQL与java代码分离: 您的解决方案是可以理解的,但如果查询不是standart(例如,不只是a=10,而是包含在(…)或groupby中,则会出现一些问题,因此我建议您避免使用它。
在Java中使用DB时,为了尽量减少样板代码,您应该使用Spring JDBC。此外,您还可以使用Hibernate,如果在您的情况下可以接受,它允许您避免使用sql。

如果您想要一个完善的体系结构,您至少需要几个层来分离关注点

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

然后,为所有模型类创建DAO(数据访问对象)(如果愿意,您可以构建一个要从中继承的GenericDao类)通过将模型对象作为参数的方法。这是特定于数据库后端的,但如果需要,可以插入与数据库无关的DAO层

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

以这种方式构造应用程序称为
MVC
(Model-View-Controller),因此,如果您需要更多信息,这就是谷歌的术语


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

您应该使用一些
DAOFactory
,此类用于获取连接。 为了在数据库中反映表,您应该创建表示实体的
DTO-Data-transfer对象。所以,如果您有表
User
,只需创建带有属性和getter和setter的
UserDTO.java
。用于与数据库通信的类是
DAO-数据访问对象
。您应该只在这里创建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;
TransDB trans=新的TransDB();
列表=新的ArrayList();
list=trans.getAll();
for(跨元素:列表)
{
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();
}
...
double count=0;
会话=空;
列表=新的ArrayList();
list=HibernateUtil.getSessionFactory().openSession();
列表=(列表)会话
.createQuery(“来自Trans”).list();
for(跨元素:列表)
{
count+=element.getData().doubleValue();
}
...
并进行比较???

评估(毫秒)

EasyORM: MySQL:init-6344,平均值-4868 MS SQL:init-8126,平均值-6752

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

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

我不认为休眠是最好的