起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 28634|回复: 6

KSQL、SQL使用说明

  [复制链接]

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
发表于 2010-12-31 14:56:12 | 显示全部楼层 |阅读模式
1、在平台中使用KSQL——推荐

在X5的Java开发中,可以使用KSQL进行数据操作。KSQL与SQL在语法上相近,区别在于KSQL操作的是“概念”,SQL操作的是“数据库表”。KSQL使用平台事务,因此不需要关心事务。

在Java中,使用KSQL进行查询数据操作,使用select方法,例如:
  1. import Java.util.Iterator;
  2. import com.justep.system.data.KSQL;
  3. import com.justep.system.data.Row;
  4.         
  5. public class DynamicFun {
  6.     static public String getCustomerMaxCode(){
  7.         try {
  8.               //定义查询ksql,在KSQL中必须使用别名,概念标识和关系标识是大小写敏感的
  9.               String kSql="select max(X5_Customer.fCustomerCode) as fCustomerCode from X5_Customer X5_Customer";
  10.               //执行select取得数据。Table是返回的数据集
  11.               com.justep.system.data.Table table = KSQL.select(kSql, null, "/x5demo/baseDemo/data", null);
  12.               Iterator<Row> rows = table.iterator();
  13.               Row row;
  14.               row = rows.next();
  15.               int result = Integer.parseInt(row.getString("fCustomerCode")) + 1;
  16.               return "" + result;
  17.         } catch (Exception e) {
  18.               throw new RuntimeException (e.getMessage());
  19.         }
  20.     }
  21. }
复制代码
在Java中,使用KSQL进行更新数据操作,使用executeUpdate方法,例如:
  1.         public static void costRequestProcessAfterFinish() {
  2.                   try {
  3.                         String key = com.justep.system.process.ProcessUtils.getProcessData1();
  4.                         // 定义更新ksql,由于概念没有主键关系,所以使用概念别名作为概念的主键
  5.                         String kSql = "update X5_CostRequest a set a.fState='已审批' where a='" + key + "'";
  6.                         KSQL.executeUpdate(kSql,null,"/x5demo/bizDemo/data",null);
  7.                 }
  8.                 catch (Exception e) {
  9.                         throw new RuntimeException (e.getMessage());
  10.                 }               
  11.         }
复制代码
2、在平台中使用SQL

使用SQL方式访问数据表时,和标准Java的方法相同。关于事务,即可以使用平台的自动事务,也可以自己控制事务。
(1)、使用平台事务。
使用com.justep.model.ModelUtils.getConnectionInTransaction("data模块路径")方法,获得指定数据模块的数据库连接。这个连接已经在平台的事务中,回滚和提交平台自动处理。连接不必手动关闭,平台会关闭。
  1. System.out.println("##平台负责事务");
  2. java.sql.Connection conn = null;
  3. java.sql.PreparedStatement pstmt = null;
  4. try {
  5.         // 取得数据库连接
  6.         conn = com.justep.model.ModelUtils.getConnectionInTransaction("/x5demo/bDemo/data");
  7.         // 更新一个字段
  8.         pstmt = conn.prepareStatement("update DE_JKSQD set fJE = fJE+1 where fID = ?");
  9.         pstmt.setString(1, com.justep.system.process.ProcessUtils.getProcessData1());
  10.         pstmt.execute();
  11.         // 更新另一个字段
  12.         pstmt = conn.prepareStatement("update DE_JKSQD set fBZ = '审批中' where fID = ?");
  13.         pstmt.setString(1, com.justep.system.process.ProcessUtils.getProcessData1());
  14.         pstmt.execute();

  15. } catch (NamingException e) {
  16.                 throw new RuntimeException(e);
  17. } catch (SQLException e) {
  18.         //手工回滚事务或者抛出异常都可以
  19.         //ContextHelper.getTransaction().rollback();
  20.         throw new RuntimeException(e);
  21. } finally {
  22.         try {
  23.                 if (pstmt != null) {
  24.                         pstmt.close();
  25.                 }
  26.         } catch (SQLException e) {
  27.                         System.out.println("##close.SQLException");
  28.         }
  29. }
复制代码
(2)、自己控制事务

使用com.justep.system.data.Transaction() 方法,获得一个新的事务,使用getConnection("data模块路径")方法,获得指定数据模块的数据库连接。这个事务不在平台的事务中,因此回滚和提交都需要处理。这个连接需要手动关闭。
开始事务——begin()
提交事务——commit()
回滚事务——rollback()
  1. System.out.println("##自己控制事务");
  2. java.sql.Connection conn = null;
  3. java.sql.PreparedStatement pstmt = null;
  4. com.justep.system.data.Transaction tx = null;
  5. try {
  6.         // 取得数据库连接
  7.         tx = new com.justep.system.data.Transaction();
  8.         conn = tx.getConnection(DataModel);
  9.         tx.begin();
  10.         // 更新一个字段
  11.         pstmt = conn.prepareStatement("update DE_JKSQD set fJE = fJE+1 where fID = ?");
  12.         pstmt.setString(1, com.justep.system.process.ProcessUtils.getProcessData1());
  13.         pstmt.execute();
  14.         // 更新另一个字段
  15.         pstmt = conn.prepareStatement("update DE_JKSQD set fBZ = '审批中' where fID = ?");
  16.         pstmt.setString(1, com.justep.system.process.ProcessUtils.getProcessData1());
  17.         pstmt.execute();
  18.         tx.commit();
  19. } catch (NamingException e) {
  20.         throw new RuntimeException(e);
  21. } catch (SQLException e) {
  22.         tx.rollback();
  23.         throw new RuntimeException(e);
  24. } finally {
  25.         try {
  26.                 if (pstmt != null) {
  27.                         pstmt.close();
  28.                 }
  29.                 if (conn != null) {
  30.                         conn.close();
  31.                 }
  32.         } catch (SQLException e) {
  33.                 System.out.println("##close.SQLException");
  34.         }
  35. }
复制代码

36

主题

140

帖子

344

积分

中级会员

Rank: 3Rank: 3

积分
344
QQ
发表于 2014-5-30 16:54:48 | 显示全部楼层
sql使用平台事务的代码卸载什么地方呢?

4

主题

16

帖子

34

积分

新手上路

Rank: 1

积分
34
QQ
发表于 2016-4-20 20:29:06 | 显示全部楼层
吕巍 发表于 2014-5-30 16:54
sql使用平台事务的代码卸载什么地方呢?

同问,应该写在什么地方?

53

主题

313

帖子

1134

积分

金牌会员

Rank: 6Rank: 6

积分
1134
QQ
发表于 2016-5-28 10:44:01 | 显示全部楼层
这个好啊!!!
点评回复

使用道具 举报

0

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
QQ
发表于 2017-7-5 17:53:48 | 显示全部楼层
我在自己控制事物时 进行了如下操作
try {
        if (conn != null &&!conn.isClosed()) {
                conn.close();
        }
} catch (SQLException e) {
                e.printStackTrace();
}
仍然会报连接已经关闭的异常

111

主题

609

帖子

731

积分

高级会员

Rank: 4

积分
731
QQ
发表于 2017-8-10 16:42:31 | 显示全部楼层
(2)、自己控制事务
使用这个代码会报数据库连接已关闭异常,请优化
跟着起步走

157

主题

600

帖子

937

积分

高级会员

Rank: 4

积分
937
QQ
发表于 2019-7-11 16:56:48 | 显示全部楼层
平台事务是否应该有关闭连接:
添加:
if (conn != null) { //
                               conn.close();
                               System.out.println("##conn--close");
                           }


其他代码如下:
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();
                }

   
????是否应该添加关闭连接的代码conn:

        } catch (SQLException e) {
                        System.out.println("##close.SQLException");
        }
}
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-3-29 18:38 , Processed in 0.061765 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表