public long update(UpdateOperation update) throws SQLException {
		Assert.isNotNull(update);
		ParsedRestriction temp = MysqlRestrictionParser.parseRestriction(update.getRestriction());
		List<Property> columns = update.getColumns();
		// 组装SQL语句
		StringBuilder sb = new StringBuilder("UPDATE ");
		sb.append('`'+update.getTableName()+'`').append(" SET ");
		for(int i=0, size=columns.size(); i<size; i++){
			if(i!=0)
				sb.append(", ");
			sb.append('`' + columns.get(i).getColumn() + '`').append("=?");
		}
		sb.append(temp.getSql());
		LOGGER.debug("EXECUTE UPDATE: {}", sb);
		PreparedStatement ps = update.getConn().prepareStatement(sb.toString());
		// 设置更新参数
		int index = 0, size = 0;
		for(index=0, size=columns.size(); index<size; index++){
			Property p = columns.get(index);
			Object o = p.getter(update.getTarget());
			try{
				if(p.getColumnType() == Types.BLOB){
					ps.setBinaryStream(index+1, (InputStream)o, ((InputStream)o).available());
				}else if(p.getColumnType() == Types.CLOB){
					ps.setAsciiStream(index+1, (InputStream)o, ((InputStream)o).available());
				}else{
					ps.setObject(index+1, o);
				}
			}catch(IOException e){
				throw new RuntimeException("Exception occurs when write big data.", e);
			}
		}
		// 设置查询参数
		size=temp.getColumnValues().size();
		for(int i=0; i<size; i++){
			Property p = temp.getColumns().get(i);
			Object o = temp.getColumnValues().get(i);
			if(p.getColumnType() == Types.OTHER){
				ps.setObject(++index, o);
			}else{
				ps.setObject(++index, o, p.getColumnType());
			}
		}
		int lines = ps.executeUpdate();
		ps.close();
		LOGGER.debug("EXECUTE UPDATE: rows={}", lines);

		return lines;
	}