小编Adr*_*ian的帖子

Java编程 - SQL语句应该存储在哪里?

JDBC兼容的应用程序应该在哪里存储其SQL语句?为什么?

到目前为止,我设法确定了以下选项:

  • 在业务对象中硬编码
  • 嵌入在SQLJ子句中
  • 封装在单独的类中,例如 数据访问对象
  • 元数据驱动(将对象模式与数据模式分离 - 描述元数据中它们之间的映射)
  • 外部文件(例如属性或资源文件)
  • 存储过程

每个人的"优点"和"缺点"是什么?

SQL代码应该被视为"代码"还是"元数据"?

存储过程是否应仅用于性能优化,还是数据库结构的合法抽象?

性能是决定的关键因素吗?供应商锁定怎么样?

什么是更好的 - 松耦合或紧耦合,为什么?

编辑:谢谢大家的答案 - 这是一个总结:

元数据驱动即对象关系映射(ORM)

优点:

  • 非常抽象 - 无需更改模型即可切换数据库服务器
  • 广泛传播 - 实际上是一个标准
  • 减少所需的SQL数量
  • 可以将SQL存储在资源文件中
  • 表现(通常)是可以接受的
  • 元数据驱动的方法
  • (数据库)供应商独立性

缺点:

  • 隐藏SQL和真正的开发人员的意图
  • DBA很难对SQL进行审核/更改
  • 对于奇怪的情况,可能仍然需要SQL
  • 可以强制使用专有查询语言,例如HQL
  • 不适合优化(抽象)
  • 可能缺乏参照完整性
  • 替代缺乏SQL知识或缺乏对DB中代码的关注
  • 永远不会匹配本机数据库性能(即使它接近)
  • 模型代码与数据库模型非常紧密

硬编码/封装在DAO层中

优点:

  • SQL保存在访问数据的对象中(封装)
  • SQL很容易编写(开发速度)
  • 当需要更改时,SQL很容易跟踪
  • 简单的解决方案(没有凌乱的架构)

缺点:

  • DBA无法查看/更改SQL
  • SQL很可能成为特定于数据库的
  • SQL可能变得难以维护

存储过程

优点:

  • SQL保存在数据库中(靠近数据)
  • SQL由DBMS解析,编译和优化
  • DBA可以轻松地查看/更改SQL
  • 减少网络流量
  • 提高安全性

缺点:

  • SQL与数据库绑定(供应商锁定)
  • SQL代码更难维护

外部文件(例如属性或资源文件)

优点

  • 无需重建应用程序即可更改SQL
  • 将SQL逻辑与应用程序业务逻辑分离
  • 所有SQL语句的中央存储库 - 更易于维护
  • 更容易理解

缺点:

  • SQL代码可能变得无法维护
  • 更难检查SQL代码的(语法)错误

嵌入在SQLJ子句中 …

java sql

104
推荐指数
8
解决办法
3万
查看次数

Log4J:创建Logger实例的策略

我决定将Log4J日志框架用于新的Java项目.我想知道我应该使用什么策略来创建/管理Logger实例以及为什么?

  • 每个类的一个Logger实例,例如

    class Foo {
        private static final Logger log = Logger.getLogger(Foo.class);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 每个线程一个Logger实例
  • 每个应用程序的一个Logger实例
  • 水平切片:应用程序每层中的一个Logger实例(例如视图层,控制器层和持久层)
  • 垂直切片:应用程序功能分区中的一个Logger实例

注意:在这些文章中已经在某种程度上考虑了这个问题:

什么是创建Log4j记录器的开销

java logging log4j

69
推荐指数
4
解决办法
6万
查看次数

Java - 将SQL语句存储在外部文件中

我正在寻找一种在外部文件中存储SQL语句的Java库/框架/技术.支持团队(包括DBA)应该能够(略微)更改语句,以便在数据库架构更改或调整目的时保持它们同步.

以下是要求:

  • 该文件必须可从Java应用程序读取,但也必须由支持团队编辑,而无需花哨的编辑器
  • 理想情况下,文件应采用纯文本格式,但XML也可以
  • 允许存储/检索DML以及DDL语句
  • 可以在稍后阶段添加新语句(应用程序足够灵活,可以选择并执行它们)
  • 语句可以分组(并由应用程序作为一个组执行)
  • 声明应该允许参数

笔记:

  • 一旦检索到,语句将使用Spring的JDBCTemplate执行
  • 不会使用Hibernate或Spring的IOC容器

到目前为止,我设法找到以下Java库,它们使用外部文件来存储SQL语句.但是,我主要对存储而不是隐藏所有JDBC"复杂性"的库感兴趣.

  • Axamol SQL库

    示例文件内容:

    <s:query name="get_emp">
      <s:param name="name" type="string"/>
      <s:sql databases="oracle">
        select    *
        from      scott.emp
                  join scott.dept on (emp.deptno = dept.deptno)
        where     emp.ename = <s:bind param="name"/>
      </s:sql>
    </s:query>
    
    Run Code Online (Sandbox Code Playgroud)
  • iBATIS的

    示例文件内容:

    <sqlMap namespace="Contact"">
        <typeAlias alias="contact"
            type="com.sample.contact.Contact"/">
        <select id="getContact"
            parameterClass="int" resultClass="contact"">
                select CONTACTID as contactId,
                       FIRSTNAME as firstName,
                       LASTNAME as lastName from
                       ADMINISTRATOR.CONTACT where CONTACTID = #id#
        </select>
    </sqlMap>
    <insert id="insertContact" parameterClass="contact">
    INSERT INTO ADMINISTRATOR.CONTACT( CONTACTID,FIRSTNAME,LASTNAME)
            VALUES(#contactId#,#firstName#,#lastName#);
     </insert>
    <update id="updateContact" parameterClass="contact"> …
    Run Code Online (Sandbox Code Playgroud)

java sql jdbc

46
推荐指数
6
解决办法
5万
查看次数

Eclipse:最有用的重构

我不时地使用Eclipse重构功能.有些技术比其他技术更明显,有些我从未尝试过.

什么重构对您最有用,为什么?

注意:我觉得这个演示文稿非常有用,也许是因为它是示例驱动因此很容易理解:

" 为每个人重构 - 如何以及为什么使用Eclipse的自动重构功能 "

编辑:这篇文章也很有用(谢谢抖动)

探索Eclipse JDT中的重构函数

java eclipse refactoring

44
推荐指数
5
解决办法
3万
查看次数

ANSI SQL手册

任何人都可以推荐一个好的ANSI SQL参考手册?

当您需要基本或更深入的解释或示例时,我没有必要指一个教程,而是一个适当的参考文档来查找.

目前我正在使用W3Schools SQL教程SQL教程,但是我觉得它们"不够深入".

当然,每个主要的RDBMS制作人都会有一些针对他们自己的产品的参考手册,但他们往往有偏见,有时会使用专有扩展.

编辑:问题的目的是关注数据库引擎的共同点,即SQL根源.但理解这些差异也可能是一件好事 - 非常有趣.

sql reference manual ansi-sql

43
推荐指数
4
解决办法
4万
查看次数

JavaScript函数声明

下面给出了某些函数声明的JavaScript代码片段吗?如果不是,有人可以概述一下它们是什么吗?

some_func = function(value) {
    // some code here
}
Run Code Online (Sandbox Code Playgroud)

show:function(value){
   // some code here
}
Run Code Online (Sandbox Code Playgroud)

javascript function-declaration

27
推荐指数
2
解决办法
2万
查看次数

登录页面上"记住我"功能的含义是什么?

我想在登录页面上包含"记住我"功能,但我不知道它的实际含义(它的工作原理).我在许多网站上看到了不同的用途,但我没有得到它的实际意义.

security cookies login remember-me session-cookies

23
推荐指数
2
解决办法
3万
查看次数

Java:将电子邮件发送到非ASCII电子邮件地址

我想发送一封电子邮件到非ASCII电子邮件地址,我不确定使用JDK8的推荐程序是什么.

我该如何处理以下电子邮件地址?

  1. Dörte@example.com
  2. test@Sörensen.de
  3. Dörte@Sörensen.de

是否有任何安全注意事项需要注意?

这个示例代码是否足够?

import java.net.IDN;


public class IDNMailHelper {

    public static String toIdnAddress(String mail) {
        if (mail == null) {
            return null;
        }
        int idx = mail.indexOf('@');
        if (idx < 0) {
            return mail;
        }
        return localPart(mail, idx) + "@" + IDN.toASCII(domain(mail, idx));
    }

    private static String localPart(String mail, int idx) {
        return mail.substring(0, idx);
    }

    private static String domain(String mail, int idx) {
        return mail.substring(idx + 1);
    }

}
Run Code Online (Sandbox Code Playgroud)

java email jakarta-mail internationalization java-8

18
推荐指数
2
解决办法
1407
查看次数

是否可以递归地要求Ruby中的目录中的所有文件?

我正在开发一个API,需要加载当前目录和所有子目录中的所有.rb文件.目前,我正在为我添加的每个文件输入一个新的require语句,但我想把它放在我只需要将文件放在其中一个子目录中并自动添加的地方.

是否有标准命令来执行此操作?

ruby recursion file

17
推荐指数
2
解决办法
1万
查看次数

Java编程 - Spring和JDBCTemplate - 使用query,queryForList还是queryForRowSet?

My Java(JDK6)项目使用SpringJDBCTemplate进行所有数据库访问.我们最近从Spring 2.5升级到Spring 3(RC1).该项目不使用像HibernateEJB这样的ORM .

如果我需要读取一堆记录,并用它们做一些内部处理,似乎有几个(重载)方法:query,queryForList和queryForRowSet

使用一个而不是另一个的标准应该是什么?有任何性能差异吗?最佳做法?

您是否可以推荐一些外部参考资料以进一步研究该主题?

java spring recordset jdbctemplate

15
推荐指数
1
解决办法
3万
查看次数