code: protected DaoResult update(Connection conn, T bo) {
          if (bo == null) {
              return new DaoResult(DaoOperationStatus.NOT_FOUND);
          }
          Savepoint savepoint = null;
          try {
              try {
                  String[] bindColumns = ArrayUtils.addAll(rowMapper.getUpdateColumns(),
                          rowMapper.getPrimaryKeyColumns());
                  String colChecksum = rowMapper.getChecksumColumn();
                  if (!StringUtils.isBlank(colChecksum)) {
                      bindColumns = ArrayUtils.add(bindColumns, colChecksum);
                  }
                  savepoint = conn.getAutoCommit() ? null : conn.setSavepoint();
                  int numRows = execute(conn, calcSqlUpdateOne(bo),
                          rowMapper.valuesForColumns(bo, bindColumns));
                  DaoResult result = numRows > 0 ? new DaoResult(DaoOperationStatus.SUCCESSFUL, bo)
                          : new DaoResult(DaoOperationStatus.NOT_FOUND);
                  if (numRows > 0) {
                      invalidateCache(bo, CacheInvalidationReason.UPDATE);
                  }
                  return result;
              } catch (DuplicatedValueException dke) {
                  if (savepoint != null) {
                      conn.rollback(savepoint);
                  }
                  return new DaoResult(DaoOperationStatus.DUPLICATED_VALUE);
              }
          } catch (SQLException e) {
              throw new DaoException(e);
          }
      }
docs: Update an existing BO.
  
  @param conn
  @param bo
  @return
  @since 0.8.1