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

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: Masion

[分享] baasData手写查询保存(简单数据)

  [复制链接]

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2017-1-20 16:51:19 | 显示全部楼层
主从数据一个事务中保存
  1. //前台

  2.         Model.prototype.userDataCustomSave = function(event) {
  3.                 // 主表与子表数据在一个请求内同时保存
  4.                 var userData = event.source;
  5.                 var orderData = this.comp("orderData");
  6.                 var params = {
  7.                         "userData" : userData.toJson(true),
  8.                         "orderData" : orderData.toJson(true)
  9.                 };
  10.                 var success = function(resultData) {
  11.                         // 这里应该先支持从表,后执行主表
  12.                         orderData.applyUpdates();
  13.                         userData.applyUpdates();
  14.                 };
  15.                 Baas.sendRequest({
  16.                         "url" : "/demo",
  17.                         "action" : "saveMasterDetail",
  18.                         "params" : params,
  19.                         "success" : success
  20.                 });
  21.         };
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2017-1-20 16:54:07 | 显示全部楼层
后台
  1.         private static void saveMasterDetail(ServletRequest request, ServletResponse response) throws ParseException, SQLException, NamingException {
  2.                 // 参数序列化
  3.                 JSONObject params = (JSONObject) JSONObject.parse(request.getParameter("params"));
  4.                 // 获取参数
  5.                 JSONObject userData = params.getJSONObject("userData");
  6.                 JSONObject orderData = params.getJSONObject("orderData");

  7.                 // 转换Table
  8.                 Table userTable = Transform.jsonToTable(userData);
  9.                 Table orderTable = Transform.jsonToTable(orderData);

  10.                 Connection conn = Util.getConnection(DATASOURCE_TAKEOUT);
  11.                 try {
  12.                         conn.setAutoCommit(false);
  13.                         try {
  14.                                 // 排除不能保存的列
  15.                                 Collection<String> userColumns = userTable.getColumnNames();
  16.                                 userColumns.remove("orderCount");

  17.                                 // 一个事务内同时保存多张表
  18.                                 Util.saveData(conn, userTable, TABLE_TAKEOUT_USER, userColumns);
  19.                                 Util.saveData(conn, orderTable, TABLE_TAKEOUT_ORDER);
  20.                                
  21.                                 conn.commit();
  22.                         } catch (SQLException e) {
  23.                                 conn.rollback();
  24.                                 throw e;
  25.                         }
  26.                 } finally {
  27.                         conn.close();
  28.                 }
  29.         }
  30.        
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

30

主题

114

帖子

1044

积分

金牌会员

Rank: 6Rank: 6

积分
1044
QQ
发表于 2017-1-20 17:45:16 | 显示全部楼层
多谢分享
回复

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2017-1-20 17:49:36 | 显示全部楼层
  1. /**
  2.          * SQL数据查询,按ResultSet的列定义转换并返回Table,支持分页。应从前端传入完整列定义(Baas.getDataColumns(data)), 以解决oracle等数据库不区分date、time、datetime,导致的数据格式转换问题;兼容了以前只传入列名字符串(data.getColumnIDs())的写法,但是已不再推荐。
  3.          * @param conn
  4.          * @param sql
  5.          * @param params SQL中问号对应的参数值,按顺序匹配
  6.          * @param columns 列定义
  7.          * @param offset 偏移行,null则不分页
  8.          * @param limit 行数,null则不分页
  9.          * @return
  10.          * @throws SQLException
  11.          */
  12.         public static Table queryData(Connection conn, String sql, List<Object> params, Object columns, Integer offset, Integer limit) throws SQLException {
  13.                 if (limit != null && offset != null) {
  14.                         if (isMysql(conn)) {
  15.                                 sql += " LIMIT " + offset + "," + limit;
  16.                         } else if (isOracle(conn)) {
  17.                                 sql = String.format("SELECT * FROM (SELECT rownum no___, A___.* FROM (%s) A___ WHERE rownum <= %d) WHERE no___ > %d", sql, offset + limit, offset);
  18.                         }
  19.                 }
  20. //                System.out.println(sql);
  21.                
  22.                 PreparedStatement pstat = conn.prepareStatement(sql);
  23.                 try {
  24.                         if (params != null) {
  25.                                 for (int i = 0, len = params.size(); i < len; i++) {
  26.                                         pstat.setObject(i + 1, params.get(i));
  27.                                 }
  28.                         }
  29.                         ResultSet rs = pstat.executeQuery();
  30.                         if (limit != null && offset != null && !isMysql(conn) && !isOracle(conn)) {
  31.                                 for (int i = 0; i < offset; i++) {
  32.                                         rs.next();
  33.                                 }
  34.                         }
  35.                         Table table = null;
  36.                         if (columns instanceof JSONObject) {
  37.                                 table = Transform.createTableByColumnsDefine((JSONObject) columns);
  38.                         } else {
  39.                                 table = Transform.createTableByResultSet(rs, (String) columns);
  40.                         }  
  41.                         Transform.loadRowsFromResultSet(table, rs, limit);
  42.                         return table;
  43.                 } finally {
  44.                         pstat.close();
  45.                 }
  46.         }
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2017-1-20 18:13:32 | 显示全部楼层
有几个函数有助于深入了解baas结构
也放在这里


  1. public static Table queryData(Connection conn, String sql, List<Object> params, Object columns, Integer offset, Integer limit) threw SQLException{

  2.         if(limit!=null $ offset!=null){
  3.                 if(isMysql(conn)){
  4.                         sql=sql+ "limit "+offset + "," + limit ;
  5.                 }else if(isOracle(conn)){
  6.                         sql = String.format("SELECT * FROM (SELECT rownum no___, A___.* FROM (%s) A___ WHERE rownum <= %d) WHERE no___ > %d", sql, offset + limit, offset);
  7.                 }
  8.         }


  9.         PreparedStatement pstat=conn.prepareStatement(sql);
  10.         try{
  11.                 if(params!=null){
  12.                         for(int i=0;i<params.size();i++){
  13.                                 pstat.setObject(i+1,params.get(i));
  14.                         }
  15.                 }
  16.                 ResultSet rs=pstat.executeQuery();
  17.                 if(limit!=null&&offset!=null&&!isMysql(conn)&& !isOracle(conn)){
  18.                         for(int i=0;i<offset;i++){
  19.                                 rs.next();
  20.                         }
  21.                 };
  22.                
  23.                 Table table=null;
  24.                 if(columns instanceof JSONObject){
  25.                         table=Transform.createTableByColumnsDefine((JSONObject) columns);
  26.                 }else{
  27.                         table=Transform.createTableByResultSet(rs,(String) columns);
  28.                 }
  29.                 Transform.loadRowsFromResultSet(table,rs,limit);
  30.                
  31.                 return table;
  32.                
  33.         }finally{
  34.                 pstat.close();
  35.         }
  36. }

  37. public static void saveData(Connection conn, Table table, String tableName, Collection<String> columns) threw SQLException{

  38.         if(columns==null){
  39.                 columns=new ArrayList<String>();
  40.                 columns.addAll(table.getColumnNames());
  41.         }
  42.         String IDColumn = table.getIDColumn();
  43.        
  44.         PreparedStatement newStat=conn.prepareStatement(createNewSQL(table,tableName,columns));
  45.         try{
  46.                 for(Row row : table.getRows(RowState.NEW)){
  47.                                 int i = 1;
  48.                                 for (String column : columns) {
  49.                                         newStat.setObject(i, row.getValue(column));
  50.                                         i++;
  51.                                 }
  52.                                 newStat.execute();
  53.         }finally{
  54.          newStat.close();       
  55.         }

  56.         PreparedStatement editStat = conn.prepareStatement(createUpdateSQL(table, tableName, columns));
  57.         try {
  58.                 for (Row row : table.getRows(RowState.EDIT)) {
  59.                         int i = 1;
  60.                         for (String column : columns) {
  61.                                 editStat.setObject(i, row.getValue(column));
  62.                                 i++;
  63.                         }
  64.                         editStat.setObject(columns.size() + 1, row.isChanged(idColumn) ? row.getOldValue(table.getIDColumn()) : row.getValue(idColumn));
  65.                                 editStat.execute();
  66.                         }
  67.         } finally {
  68.                         editStat.close();
  69.         }
  70.         PreparedStatement deleteStat = conn.prepareStatement(createDeleteSQL(table, tableName));
  71.         try {
  72.                         for (Row row : table.getRows(RowState.DELETE)) {
  73.                                 deleteStat.setObject(1, row.isChanged(idColumn) ? row.getOldValue(table.getIDColumn()) : row.getValue(idColumn));
  74.                                 deleteStat.execute();
  75.                         }
  76.         } finally {
  77.                         deleteStat.close();
  78.         }
  79.                
  80.        
  81. }

  82.         private static String createNewSQL(Table table, String tableName, Collection<String> columns) {
  83.                 StringBuffer sql = new StringBuffer();
  84.                 sql.append("INSERT INTO " + tableName);
  85.                 sql.append(" (" + arrayJoin(columns.toArray(), "%s", ",") + ") ");
  86.                 sql.append(" VALUES (" + arrayJoin(columns.toArray(), "?", ",") + ") ");
  87.                 return sql.toString();
  88.         }

  89.         private static String createUpdateSQL(Table table, String tableName, Collection<String> columns) {
  90.                 StringBuffer sql = new StringBuffer();
  91.                 sql.append("UPDATE " + tableName);
  92.                 sql.append(" SET " + arrayJoin(columns.toArray(), "%s=?", ",") + " ");
  93.                 sql.append(" WHERE " + table.getIDColumn() + "=? ");
  94.                 return sql.toString();
  95.         }

  96.         private static String createDeleteSQL(Table table, String tableName) {
  97.                 StringBuffer sql = new StringBuffer();
  98.                 sql.append("DELETE FROM " + tableName);
  99.                 sql.append(" WHERE " + table.getIDColumn() + "=? ");
  100.                 return sql.toString();
  101.         }

复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2017-1-20 18:32:28 | 显示全部楼层
  1.         /**
  2.          * 将一个数组连接为格式化字符串
  3.          * @param objects
  4.          * @param format 对数组元素的格式化,例如:'%s'为每个数组元素增加单引号、(%s = ?)将每个数组元素格式化为括号中等于问号
  5.          * @param separator 分隔符,例如:,、OR、AND
  6.          * @return
  7.          */
  8.         public static String arrayJoin(Object[] objects, String format, String separator) {
  9.                 StringBuffer buf = new StringBuffer();
  10.                 for (Object o : objects) {
  11.                         if (buf.length() > 0) {
  12.                                 buf.append(separator);
  13.                         }
  14.                         buf.append(String.format(format, o.toString()));
  15.                 }
  16.                 return buf.toString();
  17.         }
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

53

主题

928

帖子

1730

积分

金牌会员

Rank: 6Rank: 6

积分
1730
发表于 2017-1-24 09:47:37 | 显示全部楼层
get!!!!
承接wex5开发web项目、微信页面等;
低费用进行零散功能开发(java、JS、微信各种接口、阿里云接口等)
QQ:459349489
回复

使用道具 举报

0

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
QQ
发表于 2017-4-27 15:33:13 | 显示全部楼层
本帖最后由 1123165 于 2017-4-27 15:34 编辑

不错,看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-1-30 22:50 , Processed in 0.054661 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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