Happy3w

NC访问数据库的几种方式

2017.02.16

1、用模板方式访问数据进行增删改查操作

主要操作对象:聚合VO,agg访问方式。 1)InsertBPTemplate 描述:新增一张单据 全路径:nc.impl.pubapp.pattern.data.bill.template.InsertBPTemplate 代码示例:
  /**
     * 执行业务对象数据库插入。
     * 
     * @param vos
     * @return 保存后的vos。
     */
    public AggObjVO[] insert(AggbjVO[] vos) {
        InsertBPTemplate<AggObjVO> bp = new InsertBPTemplate<AggObjVO>(ObjPluginPoint.INSERT);
        this.addBeforeRule(bp.getAroundProcesser());
        this.addAfterRule(bp.getAroundProcesser());
        return bp.insert(vos);
    }
2)UpdateBPTemplate 描述:修改一张单据 全路径:nc.impl.pubapp.pattern.data.bill.template.UpdateBPTemplate 代码示例:
 /**
     * 执行数据库更新及业务逻辑检测。
     * 
     * @param mergedVos 待更新数据。
     * @param originVos 更前数据。
     * @return 更新后数据。
     */
    public AggObjVO[] update(AggObjVO[] mergedVos, AggObjVO[] originVos) {
        UpdateBPTemplate<AggObjVO> bp = new UpdateBPTemplate<AggObjVO>(ObjPluginPoint.UPDATE);
        this.addBeforeRule(bp.getAroundProcesser());
        this.addAfterRule(bp.getAroundProcesser());
        return bp.update(mergedVos, originVos);
    }
3)DeleteBPTemplate 描述:删除一张单据 全路径:nc.impl.pubapp.pattern.data.bill.template.DeleteBPTemplate 代码示例:
/**
     * 执行业务检测和数据库删除。
     * 
     * @param vos 待删除数据。
     */
    public void delete(AggObjVO[] vos) {
        DeleteBPTemplate<AggObjVO> bp = new DeleteBPTemplate<AggObjVO>(ObjPluginPoint.DELETE);
        // 增加执行前规则
        this.addBeforeRule(bp.getAroundProcesser());
        // 增加执行后业务规则
        this.addAfterRule(bp.getAroundProcesser());
        bp.delete(vos);
    }
4)、BillLazyQuery 描述:以懒加载方式查询单据,底层是基于VOQuery 全路径:nc.impl.pubapp.pattern.data.bill.BillLazyQuery 代码示例:
 public AggObjVO[] queryByPks(String[] pks) throws BusinessException {
        BillQuery<AggObjVO> query = new BillQuery<AggObjVO>(AggObjVO.class);
        AggObjVO[] vos = query.query(pks);
        if (null == vos) {
            vos = new AggObjVO[0];
        }
        return vos;
    }

2、对单个对象进行数据库访问增删改查

主要对像:ISuperVO 1)VOInsert 全路径:nc.impl.pubapp.pattern.data.vo.VOInsert 代码示例:
        VOInsert<TaskLogVO> operator = new VOInsert<TaskLogVO>();
        operator.insert(logs.toArray(new TaskLogVO[0]));
2)VOUpdate/VODelete 跟VOInsert类似,不再详解。 3)VOQuery 描述:根据相关的查询条件以及连接表来查询某个实体的值,据说是默认最大能查询30万行,否则需要配置。 全路径:nc.impl.pubapp.pattern.data.vo.VOQuery 代码示例:
   String condition = conditionBuilder.build(feilds);
    String order = this.getOrderSql(clazz);
    VOQuery query = new VOQuery(clazz);
    ISuperVO[] vos = query.queryWithWhereKeyWord(condition, order);

3、DataAccessUtils方式访问

描述:此类是对数据访问的底层API进行了包装,提供了一些按照sql访问的api方式。 全路径:nc.impl.pubapp.pattern.database.DataAccessUtils 访问方法:
DataAccessUtils()
DataAccessUtils(boolean)
query(String)
setMaxRows(int)
update(String)
update(String, JavaType[], List>)

4、用DBTool工具及JDBC底层API

描述:DBTool工具具有 全路径:nc.impl.pubapp.pattern.database.DBTool 代码示例:
 /**
   * 用参数sql语句更新数据库
   * 
   * @param sql 参数化的更新sql语句
   * @param types 参数类型
   * @param data 参数值列表
   */
  public void update(String sql, JavaType[] types, List<List<Object>> data) {
    DBTool tool = new DBTool();
    CrossDBConnection connection = null;
    PreparedStatement stmt = null;
    try {
      connection = (CrossDBConnection) tool.getConnection();
      connection.setAddTimeStamp(this.autoSetTS);

      stmt = connection.prepareStatement(sql);
      this.boundleValue(stmt, types, data);
      stmt.executeBatch();
    }
    catch (SQLException ex) {
      TransferSqlException e = new TransferSqlException(ex, sql);
      ExceptionUtils.wrappException(e);
    }
    finally {
      if (stmt != null) {
        try {
          stmt.close();
        }
        catch (SQLException ex) {
          Log.error(ex);
        }
      }
      if (connection != null) {
        try {
          connection.close();
        }
        catch (SQLException ex) {
          Log.error(ex);
        }
      }
    }
  }

5、BaseDAO访问数据库

描述:数据库访问帮助类封装了常用的持久层访问操作,是NC自己研发的JDBC层。 全路径:nc.bs.dao.BaseDAO 代码示例:
 BaseDAO dao = new BaseDAO(this.dataSource);
        try {
            Object result = dao.executeQuery(sql, new ColumnProcessor());
            if (null != result) {
                pkConstraint = String.valueOf(result);
            }
        }
        catch (DAOException e) {
            ExceptionUtils.wrappException(e);
        }

6、PersistenceManager

描述:底层代码,是一个抽象类,实例类JdbcPersistenceManager,BaseDAO调用,一般业务开发不直接使用。 全路径:nc.jdbc.framework.PersistenceManager 代码示例:
/**
	 * 根据SQL 执行数据库查询,并返回ResultSetProcessor处理后的对象 (非 Javadoc)
	 * 
	 * @param sql
	 *            查询的SQL
	 * @param processor
	 *            结果集处理器
	 */
	public Object executeQuery(String sql, ResultSetProcessor processor)
			throws DAOException {
		PersistenceManager manager = null;
		Object value = null;
		try {
			manager = createPersistenceManager(dataSource);
			JdbcSession session = manager.getJdbcSession();
			value = session.executeQuery(sql, processor);

		} catch (DbException e) {
			Logger.error(e.getMessage(), e);
			throw new DAOException(e.getMessage());
		} finally {
			if (manager != null)
				manager.release();
		}
		return value;
	}

7、DDLExecutorUtil

描述:执行DDL语句,执行创建、修改表结构等sql定义性语句。 全路径:nc.jdbc.framework.ddl.DDLExecutorUtil 代码示例:
 /**
     * 创建表。
     * 
     * @param param
     */
    private void processSingleTable(CreateTableParam param) {
        String[] sqls = this.sqlBuilder.buildSql(param);
        try {
            this.stageSql.addAll(Arrays.asList(sqls));
            Connection conn = ConnectionFactory.getConnection(this.dataSource);
            for (String sql : sqls) {
                DDLExecutorUtil.ddlExecute(this.dataSource, conn, sql);
            }
        }
        catch (Exception e) {
            ExceptionUtils.wrappException(e);
        }
    }