数据库¶
数据库的种类¶
intra-mart Accel Platform 中使用了下述3种数据库。
系统数据库
用于保存系统数据的数据库。系统数据库供系统内部使用,请用户不要使用系统数据库。Tenant数据库
用于保存 Tenant 内使用数据的数据库。共享数据库
用于保存 intra-mart Accel Platform 系统以外数据的数据库。希望与外部系统联动时,请使用此数据库。
编程方法¶
事务¶
在此介绍事务处理的实现方法。通过将Transaction对象的begin方法传递给执行函数,事务处理结束时自动执行提交处理。// 事务处理 Transaction.begin(function() { // 执行查询 var result = new TeanantDatabase().execute(sql, param); if(result.error) { // 发生错误时,执行回滚处理。 Transaction.rollback(); } });如上所述,通过传递执行函数,处理正常结束时自动执行提交处理,发生异常时自动执行回滚处理,因此能够防止事务漏掉执行提交/回滚操作。
执行查询¶
查询处理的执行方法,因所连接数据库的种类而异。
Tenant数据库
// 对Tenant数据库执行查询。 var database = new TenantDatabase(); var result = database.execute("select * from b_m_account_b");共享数据库
// 对连接ID“sample”中设置的共享数据库执行查询。 var database = new SharedDatabase("sample"); var result = database.execute("select * from b_m_account_b");利用prepared statement时,使用DbParameter对象。// 利用 prepared statement ,执行查询。 var sql = "select * from b_m_account_b where user_cd = ? and login_failure_count = ?"; var result = new TenantDatabase().execute(sql, { DbParameter.string("aoyagi"), DbParameter.number(0) });
外部SQL的应用¶
外部SQL是指,将SQL语句设置在程序外部,通过程序执行该SQL语句的功能。使用外部SQL时,请在扩展名为“.sql”的文本文件中编写SQL,并将其配置在“<CONTEXT_PATH>/WEB-INF/jssp/src”下任意目录中。使用“<CONTEXT_PATH>/WEB-INF/jssp/src/sample/sql/get_sample_data.sql”的SQL文件时,可通过以下方式实现。// 利用外部SQL语句,执行查询处理。 var database = new TenantDatabase(); var result = database.executeByTemplate('sample/sql/get_sample_data', params);
被读取的文件¶
使用外部SQL时,可以按所连接数据库种别对SQL文件进行区分。
要按数据库种别区分SQL文件时,可在文件名后添加相应数据库种别作为后缀。
- 例如:数据库种别为Oracle,SQL文件名为“get_sample_data.sql”时,
- 要把SQL文件名改为“get_sample_data_oracle.sql”。
如上所述,若提供带有后缀的SQL文件,则当数据库种别为Oracle时,将执行“get_sample_data_oracle.sql”文件,为其他数据库时则执行“get_sample_data.sql”文件。对SQL文件名添加的各种数据库后缀如下所示。
数据库 后缀 Oracle _oracle SQLServer _sqlserver DB2 _db2 PostgreSQL _postgre
SQL文件编写示例¶
例1 2Way-SQL的应用
所谓2Way-SQL,是指通过用注释编写与程序之间的映射,也可以直接执行SQL*Plus等SQL工具的SQL语句。- SQL文件“sample.sql”
SELECT * FROM b_m_account_b WHERE user_cd = /*userCd*/'aoyagi'
- 程序“sample.js”
new TenantDatabase().executeByTemplate('sample', { userCd : DbParameter.string("harada") });
执行程序后,将取得 user_cd=’harada’ 的数据。若通过工具直接执行 “sample.sql” 文件,则将取得 user_cd=’aoyagi’ 的数据。执行程序时,将把WHERE语句的注释部分替换为 prepared statement。若在SQL文件的注释部分(/参数名/)添加“:数据类型”,则不必用 DbParameter,也可以使用 prepared statement。- SQL文件“sample.sql”
SELECT * FROM b_m_account_b WHERE user_cd = /*userCd:string*/'aoyagi'
- 程序“sample.js”
new TenantDatabase().executeByTemplate('sample', { userCd : "harada" });
例2 prepared statement的应用
在 SQL 文件中编写prepared statement (包含?的SQL语句)时,将按出现顺序将在参数中指定属性名为$1, $2, …, $N的对象。- SQL文件“sample.sql”
SELECT * FROM b_m_account_b WHERE user_cd = ? AND login_failure_count = ?
- 程序“sample.js”
new TenantDatabase().executeByTemplate('sample', { $1 : DbParameter.string('aoyagi'), $2 : DbParameter.number(0) });
例3 字符串的替换
希望动态替换在 SQL 文件中编写的查询字符串后执行 SQL 语句时,可在注释中添加“$”以指定参数名。- SQL文件“sample.sql”
SELECT * FROM b_m_account_b ORDER BY /*$order*/'user_cd'
- 程序“sample.js”
new TenantDatabase().executeByTemplate('sample', { order : "user_cd" });
可以使用于如ORDER BY语句一样,希望替换无法使用 prepared statement 的部分字符串的场合。例4 条件分支
希望动态变更按特定条件执行的SQL语句时,使用/IF/ /END/。- SQL文件“sample.sql”
SELECT * FROM b_m_account_b WHERE /*IF userCd != null*/ user_cd LIKE /*userCd:string*/'aoyagi' /*END*/ /*IF predicate()*/ AND login_failure_count = /*failureCount:number*/0 /*END*/
- 程序“sample.js”
new TenantDatabase().executeByTemplate('sample', { userCd : "harada", failureCount : 0, predicate : function() { return true; } });
由于条件分支WHERE语句会变成空白等,可能执行错误的SQL语句时,需要用/BEGIN/ /END/将WHERE语句括起来。使用/BEGIN/ /END/后,将进行以下处理,由此防止执行错误的SQL语句。- 所有条件均不成立时,将从SQL语句中删除WHERE。
- 最初成立条件的检索字符串以AND开始时,将删除AND。
- SQL文件“sample.sql”
SELECT * FROM b_m_account_b /*BEGIN*/ WHERE /*IF userCd != null*/ user_cd LIKE /*userCd:string*/'aoyagi' /*END*/ /*IF predicate()*/ AND login_failure_count = /*failureCount:number*/0 /*END*/ /*END*/