在 Java 中如何更高效地存储和管理 SQL 语句?

时间:2022-03-03 22:50:16

【编者按】还在为管理 Java 代码中的 SQL 语句而烦恼吗?让 Zemian 帮你摆脱困境吧!本文系 OneAPM 工程师编译整理

注意:使用java.util.Properties#loadFromXML其实会更简单!

在 Java 中如何更高效地存储和管理 SQL 语句?

如果使用的是普通的、没有任何外部类库的 Java JDBC,那么就必须得自己去管理 SQL 语句。很不幸的是,Java String 并不支持多行结构,所以开发者必须使用许多引号+连接符来拼接语句,这会使得 SQL 语句非常难于阅读和管理。同时,这也使得维护和测试(尝试从 Java 代码中 Copy 一条 SQL 语句到 SQL 客户端运行)更加困难。如果能保证整条 SQL 语句完好无缺,又避免了 Java 的干扰,那该有多好啊!

这里有个快速解决方案,把 SQL 查询语句存储在 XML 的 CDATA 里面:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sqlMap>
<sqls>
<entry>
<key>getUser</key>
<value><![CDATA[
SELECT *
FROM USERS
WHERE ID = ?
]]></value>
</entry>
<entry>
<key>getSpecialCodeByUserId</key>
<value><![CDATA[
SELECT u.EMAIL, p.ID as PROFILEID, p.SPECIALCODE, a.MANAGERID
FROM USERS u
LEFT JOIN PROFILE p ON p.USERID = u.ID
LEFT JOIN ACCOUNT a ON a.PROFILEID = p.ID
WHERE u.ID = ? ]]></value>
</entry> </sqls>
</sqlMap>

如果现在再去读 SQL 语句,开发者可以利用内建的 JAXB。

import javax.xml.bind.annotation.XmlRootElement;
import java.util.HashMap;
import java.util.Map;
@XmlRootElement
public class SqlMap {
Map<String, String> sqls = new HashMap<>();
public Map<String, String> getSqls() {
return sqls;
}
public void setSqls(Map<String, String> sqls) {
this.sqls = sqls;
}
public String getSql(String name) {
return sqls.get(name);
}
public static SqlMap load(String name) throws Exception {
String xml = Utils.loadString(name);
SqlMap sqlMap = unmarshallXML(xml );
return sqlMap;
}
}

原文链接:How to Store and Manage SQL Statements More Effectively With Java

本文系 OneAPM 工程师编译整理。想阅读更多技术文章,请访问 OneAPM 官方博客

在 Java 中如何更高效地存储和管理 SQL 语句?的更多相关文章

  1. JAVA中处理事务的程序--多条更新SQL语句的执行&lpar;包括回滚&rpar;

    在与数据库操作时,如果执行多条更新的SQL语句(如:update或insert语句),在执行第一条后如果出现异常或电脑断电, 则后面的SQL语句执行不了,这时候设定我们自己提交SQL语句,不让JDBC ...

  2. java中的基本数据类型一定存储在栈中吗?

    首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的. 下面让我们一起来分析一下原因: 基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型 ...

  3. (转载)总结一下SQL语句中引号&lpar;&&num;39&semi;&rpar;、quotedstr&lpar;&rpar;、&lpar;&&num;39&semi;&&num;39&semi;&rpar;、format&lpar;&rpar;在SQL语句中的用法

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法 总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中 ...

  4. 总结一下SQL语句中引号&lpar;&&num;39&semi;&rpar;、quotedstr&lpar;&rpar;、&lpar;&&num;39&semi;&&num;39&semi;&rpar;、format&lpar;&rpar;在SQL语句中的用法

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法 日期:2005年6月1日 作者:seasky212 总结一下SQL语句中引号(').quoted ...

  5. &lpar;转载&rpar;总结一下SQL语句中引号&lpar;&&num;39&semi;&rpar;、quotedstr&lpar;&rpar;、&lpar;&&num;39&semi;&&num;39&semi;&rpar;、format&lpar;&rpar;在SQL语句中的用法

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法以及SQL语句中日期格式的表示(#).('')在Delphi中进行字符变量连接相加时单引号用('' ...

  6. 从数据库中查询所有表及所有字段的SQL语句

    从数据库中查询所有表及所有字段的SQL语句 由于一个小项目的需要,近日完成一个从数据库中查询所有表及所有字段的方法,其实用两条SQL语句就可以完成. Sql Server版:列出当前DB中所有表:se ...

  7. 25个让Java程序员更高效的Eclipse插件

    Eclipse提供了一个可扩展插件的开发系统.这就使得Eclipse在运行系统之上可以实现各种功能.这些插件也不同于其他的应用(插件的功能是最难用代码实现的).拥有合适的Eclipse插件是非常重要的 ...

  8. 一些简单的例子让你在Java中能更好的学习并理解循环结构(1)!

    一.java中流程控制方式采用三种基本流程结构:顺序结构,选择(分支)结构,循环结构. 1.[if-else 结构] if(1>2){ system.out.println("if条件 ...

  9. Java中break、continue及标签等跳转语句的使用&lbrack;上&rsqb;

    java 中跳转语句使用break.continue和标签,各自或组合完成相应的功能. 今天做题时遇到关于标签命名规范,顺便将跳转语句语法都看了一遍,很有收获. 在<Java编程思想>一书 ...

随机推荐

  1. Java基础之反射和动态代理

    1,反射是依赖于Class对象,然后根据Class对象,去操作该类的资源的.Class对象是发射的基石! 问题1:人这类事物用什么表示?汽车这类事物用什么表示>计算机文件用什么表示?有如此多的事 ...

  2. Node&period;js开发环境搭建

    1.安装express npm install express -g 2.express33.6以后把express-generator分离出来了,所以还需安装express-generator,否则 ...

  3. bzoj roll题器(Py大法好)

    此roll题器能实现非权限号跳过权限题及所有号跳过已切题 点击下载rar文件(py2) 点击下载rar文件(py3)

  4. 227&period; Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  5. Dalvik虚拟机的运行过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8914953 在前面一篇文章中,我们分析了Dal ...

  6. Android使用Path实现仿最新淘宝轮播广告底部弧形有锯齿的问题以及解决办法

    在前面一篇博文<Android高仿京东淘宝自动无限循环轮播控件的实现思路和过程>中已经基本介绍了实现轮播广告的基本思路和过程,但是仔细观察淘宝的轮播广告栏,发现在轮播广告栏的底部有个小小的 ...

  7. Winform控件根据文字内容自动调整最合适大小

    private void AutoSizeControl(Control control, int textPadding) { // Create a Graphics object for the ...

  8. ReactiveCocoa源码解析&lpar;三&rpar; Signal代码的基本实现

    上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...

  9. ubuntu解压乱码

    乱码原因 问题一般出现在windows下压缩的在ubuntu中会出现这种情况. 其实就是windows和ubuntu下压缩的编码格式不同.windows下的编码格式为GBK,Ubuntu下的为UTF- ...

  10. Charles使用(一)

    Charles使用(一)   1.什么是Charles Charles是在MAC下常用的网络封包截取工具,在做移动开发时,是为了调试与服务端的网络通信协议,常常需要截取网络包来分析.Charles是通 ...