|
1、在平台中使用KSQL——推荐
在X5的Java开发中,可以使用KSQL进行数据操作。KSQL与SQL在语法上相近,区别在于KSQL操作的是“概念”,SQL操作的是“数据库表”。KSQL使用平台事务,因此不需要关心事务。
在Java中,使用KSQL进行查询数据操作,使用select方法,例如:- import Java.util.Iterator;
- import com.justep.system.data.KSQL;
- import com.justep.system.data.Row;
-
- public class DynamicFun {
- static public String getCustomerMaxCode(){
- try {
- //定义查询ksql,在KSQL中必须使用别名,概念标识和关系标识是大小写敏感的
- String kSql="select max(X5_Customer.fCustomerCode) as fCustomerCode from X5_Customer X5_Customer";
- //执行select取得数据。Table是返回的数据集
- com.justep.system.data.Table table = KSQL.select(kSql, null, "/x5demo/baseDemo/data", null);
- Iterator<Row> rows = table.iterator();
- Row row;
- row = rows.next();
- int result = Integer.parseInt(row.getString("fCustomerCode")) + 1;
- return "" + result;
- } catch (Exception e) {
- throw new RuntimeException (e.getMessage());
- }
- }
- }
复制代码 在Java中,使用KSQL进行更新数据操作,使用executeUpdate方法,例如:- public static void costRequestProcessAfterFinish() {
- try {
- String key = com.justep.system.process.ProcessUtils.getProcessData1();
- // 定义更新ksql,由于概念没有主键关系,所以使用概念别名作为概念的主键
- String kSql = "update X5_CostRequest a set a.fState='已审批' where a='" + key + "'";
- KSQL.executeUpdate(kSql,null,"/x5demo/bizDemo/data",null);
- }
- catch (Exception e) {
- throw new RuntimeException (e.getMessage());
- }
- }
复制代码 2、在平台中使用SQL
使用SQL方式访问数据表时,和标准Java的方法相同。关于事务,即可以使用平台的自动事务,也可以自己控制事务。
(1)、使用平台事务。
使用com.justep.model.ModelUtils.getConnectionInTransaction("data模块路径")方法,获得指定数据模块的数据库连接。这个连接已经在平台的事务中,回滚和提交平台自动处理。连接不必手动关闭,平台会关闭。- System.out.println("##平台负责事务");
- java.sql.Connection conn = null;
- java.sql.PreparedStatement pstmt = null;
- try {
- // 取得数据库连接
- conn = com.justep.model.ModelUtils.getConnectionInTransaction("/x5demo/bDemo/data");
- // 更新一个字段
- pstmt = conn.prepareStatement("update DE_JKSQD set fJE = fJE+1 where fID = ?");
- pstmt.setString(1, com.justep.system.process.ProcessUtils.getProcessData1());
- pstmt.execute();
- // 更新另一个字段
- pstmt = conn.prepareStatement("update DE_JKSQD set fBZ = '审批中' where fID = ?");
- pstmt.setString(1, com.justep.system.process.ProcessUtils.getProcessData1());
- pstmt.execute();
- } catch (NamingException e) {
- throw new RuntimeException(e);
- } catch (SQLException e) {
- //手工回滚事务或者抛出异常都可以
- //ContextHelper.getTransaction().rollback();
- throw new RuntimeException(e);
- } finally {
- try {
- if (pstmt != null) {
- pstmt.close();
- }
- } catch (SQLException e) {
- System.out.println("##close.SQLException");
- }
- }
复制代码 (2)、自己控制事务
使用com.justep.system.data.Transaction() 方法,获得一个新的事务,使用getConnection("data模块路径")方法,获得指定数据模块的数据库连接。这个事务不在平台的事务中,因此回滚和提交都需要处理。这个连接需要手动关闭。
开始事务——begin()
提交事务——commit()
回滚事务——rollback()- System.out.println("##自己控制事务");
- java.sql.Connection conn = null;
- java.sql.PreparedStatement pstmt = null;
- com.justep.system.data.Transaction tx = null;
- try {
- // 取得数据库连接
- tx = new com.justep.system.data.Transaction();
- conn = tx.getConnection(DataModel);
- tx.begin();
- // 更新一个字段
- pstmt = conn.prepareStatement("update DE_JKSQD set fJE = fJE+1 where fID = ?");
- pstmt.setString(1, com.justep.system.process.ProcessUtils.getProcessData1());
- pstmt.execute();
- // 更新另一个字段
- pstmt = conn.prepareStatement("update DE_JKSQD set fBZ = '审批中' where fID = ?");
- pstmt.setString(1, com.justep.system.process.ProcessUtils.getProcessData1());
- pstmt.execute();
- tx.commit();
- } catch (NamingException e) {
- throw new RuntimeException(e);
- } catch (SQLException e) {
- tx.rollback();
- throw new RuntimeException(e);
- } finally {
- try {
- if (pstmt != null) {
- pstmt.close();
- }
- if (conn != null) {
- conn.close();
- }
- } catch (SQLException e) {
- System.out.println("##close.SQLException");
- }
- }
复制代码 |
|