java RESTful webservice + DAO + JDBC最佳实践

时间:2016-01-17 18:41:24

标签: java web-services

我的目标是为CRUD数据构建一个RESTful Web服务到Oracle和MySQL数据库。

请您为CRUD数据库提供RESTful Web服务的最佳实践吗?

  1. 我是否需要使用DAO或直接在Web服务类中直接实现JDBC?如果可以通过示例提供一些有用的链接将会有所帮助。

  2. 我使用连接池!它没关系还是......?

  3. 在哪里/如何保留一些配置值,例如数据库连接字符串,数据库凭据等?是否可以将config.properties文件用于所有这些?这样的事情:

    config.properties
    db_url = JDBC:MySQL的://本地主机/
    数据库=测试
    DB_USER = my_user
    db_password = my_password

    InputStream input = new FileInputStream(config.properties);
    属性prop = new Properties();
    prop.load(输入);

  4. 要CRUD数据库,我打算使用PreparedStatement。你重新编写:在java代码中直接使用SQL语句(select * from ...,update ... set,delete ...)或构建一些存储过程来查询,插入,更新,删除数据?

  5. 我希望该应用程序能够使用不同的数据库。我想从MySQL和Oracle开始。实施此类方法的最佳做法是什么?用DAO?如何将配置保存到不同类型的数据库?

  6. 以下是我开始的一些代码:

    package com.crunchify.restjersey;
    
    import java.sql.Connection;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    @Path("/testws")
    public class TestWS {
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String currentDate() {
            Date dt = Calendar.getInstance().getTime();
            SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss");
            return df.format(dt);
        }
    
        @GET
        @Path("/getTables")
        @Produces(MediaType.TEXT_PLAIN)
        public String getTables() {
            return "Noroc";
        }
    
        @GET
        @Path("/getConnection")
        @Produces(MediaType.TEXT_PLAIN)
        public String getConnection() {
    
            String result = "";
            Connection conn = null;
    
            try {
                Context initialContext = new InitialContext();
                Context environmentContext = (Context) initialContext.lookup("java:comp/env");
                String dataResourceName = "jdbc/MySQLDB_db";
                DataSource dataSource = (DataSource) environmentContext.lookup(dataResourceName);
                conn = dataSource.getConnection();
    
                if (!conn.isClosed())
                    result += "Connection established!";
                else
                    result += "Cannot establish connection!";
    
    
    
                conn.close();
            }
            catch(Exception ex) {
                result += ex.getMessage();
            }
    
            return result;
    
        }
    }
    

1 个答案:

答案 0 :(得分:4)

看起来您更喜欢在某种应用服务器上使用JAX-RS等标准JEE技术(因为您通过JNDI查找数据源)。

  1. 我建议将DAO用于DB-Access。 DAO通常会减少样板代码,例如获取数据库连接,将查询结果映射到POJOS等。此外,我建议您为DB-Access使用某种O / R映射器。 JPA和“普通”Hibernate是最常见的(JPA使用App服务器提供的实现或Tomcat上的Hibernate)。
  2. 是的,你绝对应该使用连接池。
  3. 保持配置值的位置在某种程度上取决于环境。通常,配置不应打包在工件(WAR,JAR,EAR)中,除非有某种机制来覆盖您的配置值。常见选项是Java-System-Properties和Command Line Arguments。
  4. 如上所述,我建议使用一些O / R映射器。如果使用纯SQL,准备好的语句是个好主意。准备好的语句确保您不会受到SQL注入攻击的攻击,如果您在SQL语句中将未转义的用户输入作为参数,可能会发生这种情况。
  5. 我再次建议使用O / R映射器(JPA或Hibernate)。配置取决于您的环境。您将在Jboss / Glassfish / Websphere等应用程序服务器上配置数据源。其他环境将使用配置文件,java系统属性或环境变量。
  6. 对于你个人的任务,我会使用春季启动,因为它相对容易上手。相关指南是:

    在您选择的应用程序服务器或Dropwizard上,可以选择JEE(JAX-RS,JPA)。

    顺便说一下。稍后将要讨论的其他方面是验证,身份验证和授权,事务管理等。