将SQL与Java代码分开

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

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

public void insertData (String db, String table, ) { //generic SQL INSERT statement and execution } public ResultSet retrieveData (String db, String table, ) { //generic retrieval of data } 

有没有办法实现这个目标? 或者我们应该只为不同风格的插入,查询等添加function?

谢谢!

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

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

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

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

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

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

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

最好的方法是使用Hibernate ,它现在是行业标准。

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

对于getter,您的代码可能看起来像例如:

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

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

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

你应该使用一些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 list = new ArrayList(); list = trans.getAll(); for (Trans element : list) { count+= element.getData(); } ... 

过冬

 double count = 0; Session session = null; List list = new ArrayList(); list = HibernateUtil.getSessionFactory().openSession(); list = (List) 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

Hibernate:MySQL:init – 27406,avg – 23728 MS SQL:init – 28605(+ 250%),avg – 24912

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