Banco de Dados
Foi criada biblioteca de banco de dados no VSet Chameleon com intuído de abstrair a sua complexidade de manipular os dados do banco de dados, garantir o contexto transacional, aumentar a produtividade do desenvolvimento e padronização do processo como todo.
CRUD
Foram criadas duas classes, CRUDDAOWrapper e CRUDDAOSAOWrapper, para manipular os dados do padrão CRUD (Create, Read, Update, Delete). Essas classes são herdadas os métodos e as anotações da classe BusinessProcessWrapper.
Anotações
Classe
| Anotação | Descrição | Parâmetro |
|---|---|---|
@AutoCommit | Informa para VSet Chameleon que essas operações, UPDATE, INSERT ou DELETE, serão comitadas automaticamente independentemente do contexto transacional | |
@AuditTable | Informa para VSet Chameleon gravar os dados das operações UPDATE, INSERT e DELETE no repositório de auditoria | name - nome do schema e tabela do banco de dados id - Chave primária para pesquisar no processo de auditoria |
@Table | Informa o nome do schema e tabela do banco de dados. Ex: schema.table | name - nome do schema e tabela do banco de dados |
Exemplo
@AutoCommit
@AuditTable(name="core.Tag", id="Id")
@Table(name="core.Tag")
public class TagDAO extends CRUDDAOSQLWrapper {
// any code
}
Estrutura de dados
| Anotação | Descrição | Parâmetro |
|---|---|---|
@ColumnCRUDDAO | Descreve as propriedades do campo | name(1) - nome do campo que está na tabela de banco de dados description - descrição do campo orderInsert(2) - posição da coluna na operação insert orderUpdate(2) - posição da coluna na operação update orderDelete(2) - posição da coluna na operação delete orderSelect(2) - posição da coluna na operação select primaryKey - informa se o campo é primary key autoIncrement - informa se o campo é auto incremento required - informa se o campo é obrigatório |
@Internal | Informa que este campo não é disponibilizado para os canais | |
@ReadOnly | Informa que este campo é somente leitura para os canais | |
@Confidential | Informa que este campo é informação sensível. Aparece no log como asterisco |
(1) A propriedade name tem que ser igual o nome que está no banco de dados.
(2) O processo de execução das operações são feitas no modo Preparation, ou seja, antes da execução da operação é preparada o plano de execução por uma vez e servirá para demais execuções. Neste modo, para aumentar a sua performance, os valores das colunas são preenchidas por sua posição.
Exemplo
/**
* @author generated by VSet Chameleon 11/11/2018 12:54:18
*
*/
public class Tag {
@ColumnCRUDDAO(name="IdOrganization", description="Organization Name", orderInsert=1, orderUpdate=5, orderDelete=1, orderSelect=1, primaryKey=true)
@Internal
private int idOrganization;
@ColumnCRUDDAO(name="IdComponent", description="Component Identification", orderInsert=2, orderUpdate=6, orderDelete=2, orderSelect=2, primaryKey=true)
private int idComponent;
@ColumnCRUDDAO(name="ComponentType", description="Component Type", orderInsert=3, orderUpdate=7, orderDelete=3, orderSelect=3, primaryKey=true)
private ComponentType componentType;
@ColumnCRUDDAO(name="Id", description="Tag Identification", orderUpdate=8, orderDelete=4, orderSelect=4, autoIncrement=true, primaryKey=true)
@Confidential
private int id;
@ColumnCRUDDAO(name="Label", description="Label", orderInsert=4, orderUpdate=1)
private String label;
@ColumnCRUDDAO(name="Description", description="Description", orderInsert=5, orderUpdate=2)
private String description;
@ColumnCRUDDAO(name="Color", description="Color", orderInsert=6, orderUpdate=3)
private String color;
@ColumnCRUDDAO(name="LastUpdateDate", description="Last Update Date", orderInsert=7, orderUpdate=4)
@ReadOnly
private Timestamp lastUpdateDate;
public int getIdOrganization() {
return idOrganization;
}
public void setIdOrganization(String idOrganization) throws ValidationException {
if (idOrganization != null && !idOrganization.trim().isEmpty()) {
try {
this.idOrganization = Integer.parseInt(idOrganization);
}
catch (Exception e) {throw new ValidationException(10, "campo IdOrganization inválido --- " + idOrganization);}
}
}
public void setIdOrganization(int idOrganization) {
this.idOrganization = idOrganization;
}
public int getIdComponent() {
return idComponent;
}
public void setIdComponent(String idComponent) throws ValidationException {
if (idComponent != null && !idComponent.trim().isEmpty()) {
try {
this.idComponent = Integer.parseInt(idComponent);
}
catch (Exception e) {throw new ValidationException(10, "campo IdComponent inválido --- " + idComponent);}
}
}
public void setIdComponent(int idComponent) {
this.idComponent = idComponent;
}
public void setIdComponent(int idComponent) {
this.idComponent = idComponent;
}
public ComponentType getComponentType() {
return componentType;
}
public void setComponentType(String componentType) throws ValidationException {
if (componentType != null && !componentType.trim().isEmpty()) {
try {
this.componentType = ComponentType.valueOf(Byte.parseByte(componentType));
}
catch (Exception e) {throw new ValidationException(10, "campo ComponentType inválido --- " + componentType);}
}
}
public void setComponentType(int componentType) throws ValidationException {
this.componentType = ComponentType.valueOf(componentType);
}
public void setComponentType(ComponentType componentType) {
this.componentType = componentType;
}
public int getId() {
return id;
}
public void setId(String id) throws ValidationException {
if (id != null && !id.trim().isEmpty()) {
try {
this.id = Integer.parseInt(id);
}
catch (Exception e) {throw new ValidationException(10, "campo Id inválido --- " + id);}
}
}
public void setId(int id) {
this.id = id;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Timestamp getLastUpdateDate() {
return lastUpdateDate;
}
public void setLastUpdateDate(String lastUpdateDate) throws ValidationException {
if (lastUpdateDate != null && !lastUpdateDate.trim().isEmpty()) {
try {
Object obj = Format.parseDateTime(lastUpdateDate, Format.DATETIME);
this.lastUpdateDate = new Timestamp(((Date) obj).getTime());
}
catch (Exception e) {throw new ValidationException(10, "campo LastUpdateDate inválido --- " + lastUpdateDate);}
}
}
public void setLastUpdateDate(Timestamp lastUpdateDate) {
this.lastUpdateDate = lastUpdateDate;
}
}
Nota: As anotações ditas acima são aplicadas para as classes CRUDDAOWrapper e CRUDDAOSAOWrapper
Classe DAO (CRUDDAOWrapper e CRUDDAOSAOWrapper)
Implementa a estrutura dados e método para manipular os dados. A única diferença entre CRUDDAOWrapper e CRUDDAOSAOWrapper é que na segunda precisa de implementar sintaxe de SQL para manipulação por meio das operações Insert, Update, Delete, Select e List. É utilizada em caso excepcional. Recomendamos sempre utilizar a classe CRUDDAOWrapper. 8
Método da classe
| Método | Tipo | Descrição | |
|---|---|---|---|
getInput() | Object – classe estrutura de dados da tabela de dados | Estrutura de dados da entrada que serão inseridos na tabela de banco de dados | |
getOutput() | Object – classe estrutura de dados da tabela de dados | Estrutura de dados da saída que serão retornados na tabela de banco de dados | |
getAlias() | String | Nome da alias que está configurado no arquivo de configuração do VSet Chameleon vsetchameleonConfig.xml na seção alias-database | |
getNotFound() | void | Nome da mensagem que será disponibilizado para os canais caso não encontrou o registro | |
getSQL(String operation) | String | Implementa a querie de acordo com a operação. Só será necessário implementar se houver uma incompatibilidade com query SQL padrão (standard) ou uma querie complexa | Opcional |
validate() | void | Implementa validações necessárias | Opcional |
beforeProcess() | void | Implementa alguma atividade antes de processar a operação do banco de dados | Opcional |
afterProcess() | void | Implementa alguma atividade ou rotina após a execução da operação do banco de dados | Opcional |
finalize() | void | Implementa alguma atividade ou rotina para finalização | Opcional |
rollback() | void | Implementa alguma atividade ou rotina de desfazimento caso houver alguma exceção da operação do banco de dados | Opcional |
Exemplo
Classe CRUDDAOWrapper
O método getSQL(String operation) é opcional. Só é reescrita caso tenha alguma particularidade de um banco de dados ou queries complexas.
Padrão (Sem método getSQL(String operation))
@BusinessProcessName(name="TagDAO", description=" CRUD tabela - Tag", channel=true)
@AuditTable(name="core.Tag", id="Id")
@Table(name="core.Tag")
public class TagDAO extends CRUDDAOSQLWrapper {
private Tag input = new Tag();
private ArrayList<Tag> output = new ArrayList<Tag>();
public TagDAO() {
super();
}
public TagDAO(CRUDDAOAbstract parent, String primaryKey, String foreignKey) {
super(parent, primaryKey, foreignKey);
}
@Override
protected String getAlias() {
return "PLATFORM_MANAGEMENT_SUITE";
}
@Override
protected String getNotFound() {
return "There is no Tag.";
}
public Tag getInput() {
return input;
}
public ArrayList<Tag> getOutput() {
return output;
}
public void beforeProcess() throws Exception {
if (getOperation().equalsIgnoreCase("insert") ||
getOperation().equalsIgnoreCase("update"))
input.setLastUpdateDate(new Timestamp(System.currentTimeMillis()));
}
public void afterProcess() throws Exception {
// any code if necessary
}
}
Reescrevendo método getSQL(String operation)
- Queries complexas
....
@Override
protected String getSQL(String operation) throws Exception {
if (operation.equalsIgnoreCase("select"))
return "select * from (select a.IdBusinessOrganization,a.Id,a.InternalCode,ProductStatus,MaterialType,a.Description,BriefDescription,FullDescription,IdCategory,a.IdNCM,IdManufacturer,IdBrand,IdFamily,IdDivision,QuickCodePlu,TabedSalePrice,ThreeDecimals,DaysToleranceExpiration,DaysExpiration,IdCollectionFashion,IdMaterialFashion,IdProductModel,IdPublicTarget,ColorFashion,SizeFashion,ReferenceCodeFashion,IdActivePrincipleMedicine,ControlTypeMedicine,VarQuantityWeight,ControlLotValidity,Flammable,TemperatureControl,Toxic,ControlNSeries,ProductionLotControl,ProhibitedForMinors,ControlledSale,Fuel,MerchandiseOrigin,IdGrid,GridType,Segment,MaterialModality,IdProductCloned,IsCloned,GradeCode,HasNutritionalTable,HasTransformation,ServiceTreatment,ServiceProject,ServiceMeasurement,ServiceContract,ServiceProduct,NbsCode,ServicePurchaseUnit,ServiceSaleUnit,a.IdCest,a.OperationalCost,a.ObjectiveMargin,a.Commission,a.LastUpdateDate,b.Description as CategoryName,c.Description as NCMName,d.Name as BrandName,e.Name as FamilyName,f.Name as ManufacturerName, g.Path as ImageDefault,h.Description as NbsDescription,i.Name as ProductModelName,j.Name as PublicTargetName,k.Name as ActivePrincipleMedicineName from material.Product a left join material.Category b on a.IdCategory = b.Id left join fiscal.Ncm c on a.IdNCM = c.Id left join material.Brand d on a.IdBrand = d.InternalCode and a.IdBusinessOrganization = d.IdBusinessOrganization left join material.Family e on a.IdFamily = e.Id and a.IdBusinessOrganization = e.IdBusinessOrganization left join erp.Manufacturer f on a.IdManufacturer = f.Id left join material.ProductImage g on a.Id = g.IdProduct and g.DefaultPhoto = 1 left join fiscal.Nbs h on a.NbsCode = h.Code left join material.ProductModel i on a.IdProductModel = i.Id left join material.PublicTargetProduct j on a.IdPublicTarget = j.Id left join material.ActivePrincipleMedicine k on a.IdActivePrincipleMedicine = k.Id) a where IdBusinessOrganization = ? and Id = ?";
else if (operation.equalsIgnoreCase("list") || operation.equalsIgnoreCase("filter"))
return "select * from (select a.IdBusinessOrganization,a.Id,a.InternalCode,ProductStatus,MaterialType,a.Description,BriefDescription,FullDescription,IdCategory,a.IdNCM,IdManufacturer,IdBrand,IdFamily,IdDivision,QuickCodePlu,TabedSalePrice,ThreeDecimals,DaysToleranceExpiration,DaysExpiration,IdCollectionFashion,IdMaterialFashion,IdProductModel,IdPublicTarget,ColorFashion,SizeFashion,ReferenceCodeFashion,IdActivePrincipleMedicine,ControlTypeMedicine,VarQuantityWeight,ControlLotValidity,Flammable,TemperatureControl,Toxic,ControlNSeries,ProductionLotControl,ProhibitedForMinors,ControlledSale,Fuel,MerchandiseOrigin,IdGrid,GridType,Segment,MaterialModality,IdProductCloned,IsCloned,GradeCode,HasNutritionalTable,HasTransformation,ServiceTreatment,ServiceProject,ServiceMeasurement,ServiceContract,ServiceProduct,NbsCode,ServicePurchaseUnit,ServiceSaleUnit,a.IdCest,a.OperationalCost,a.ObjectiveMargin,a.Commission,a.LastUpdateDate,b.Description as CategoryName,c.Description as NCMName,d.Name as BrandName,e.Name as FamilyName,f.Name as ManufacturerName, g.Path as ImageDefault,h.Description as NbsDescription,i.Name as ProductModelName,j.Name as PublicTargetName,k.Name as ActivePrincipleMedicineName from material.Product a left join material.Category b on a.IdCategory = b.Id left join fiscal.Ncm c on a.IdNCM = c.Id left join material.Brand d on a.IdBrand = d.InternalCode and a.IdBusinessOrganization = d.IdBusinessOrganization left join material.Family e on a.IdFamily = e.Id and a.IdBusinessOrganization = e.IdBusinessOrganization left join erp.Manufacturer f on a.IdManufacturer = f.Id left join material.ProductImage g on a.Id = g.IdProduct and g.DefaultPhoto = 1 left join fiscal.Nbs h on a.NbsCode = h.Code left join material.ProductModel i on a.IdProductModel = i.Id left join material.PublicTargetProduct j on a.IdPublicTarget = j.Id left join material.ActivePrincipleMedicine k on a.IdActivePrincipleMedicine = k.Id) a where IdBusinessOrganization = ?";
return super.getSQL(operation);
}
....
- Particularidade de um banco de dados
....
@Override
protected String getSQL() {
String boolTrue = getDatabaseType() == DatabaseType.POSTGRESQL ? "true" : "1";
return "select * from (select a.IdBusinessOrganization,a.IdBusinessUnit,a.IdStockInventory,a.IdPackaging,ControlType,LotSerie,ManufacturingIncomingDate,ExpirationDate,g.LocalStockAmount as StockBalance,InventoriedQuantity,InventoriedQuantityReCount,DifferenceQuantity,a.Status,a.Message,a.LastUpdateDate,b.Plu,b.IdUnitMeasure,b.Description as PackagingDescription,c.Id as IdProduct,c.Description as ProductDescription,c.VarQuantityWeight,d.Measure,d.Description as MeasureDescription,f.Name as LocalStockName from stock.StockInventoryPackaging a inner join material.Packaging b on a.IdPackaging = b.Id inner join material.Product c on b.IdProduct = c.Id left join material.UnitMeasure d on b.IdUnitMeasure = d.Id inner join stock.StockInventory e on a.IdStockInventory = e.Id left join stock.LocalStock f on e.IdLocalStock = f.Id left join material.Kardex g on a.IdBusinessUnit = g.IdBusinessUnit and e.IdLocalStock = g.IdLocalStock and a.IdPackaging = g.IdPackaging and a.IdStockInventory = g.IdStockInventory and g.Frozen = " + boolTrue + " ) a where IdBusinessOrganization = ? and IdBusinessUnit = ? and IdStockInventory = ?";
}
....
Classe CRUDDAOSQLWrapper
Observe a única diferença com relação da classe CRUDDAOWrapper, que essa você é obrigado a escrever queries das operações para funcionar conforme mostra no método getSQL(String operation).
@BusinessProcessName(name="TagDAO", description=" CRUD tabela - Tag", channel=true)
@AuditTable(name="core.Tag", id="Id")
@Table(name="core.Tag")
public class TagDAO extends CRUDDAOSQLWrapper {
private Tag input = new Tag();
private ArrayList<Tag> output = new ArrayList<Tag>();
public TagDAO() {
super();
}
public TagDAO(CRUDDAOAbstract parent, String primaryKey, String foreignKey) {
super(parent, primaryKey, foreignKey);
}
@Override
protected String getAlias() {
return "PLATFORM_MANAGEMENT_SUITE";
}
@Override
protected String getNotFound() {
return "There is no Tag.";
}
@Override
protected String getSQL(String operation) throws Exception {
if (operation.equalsIgnoreCase("insert")) {
if (getDatabaseType() == DatabaseType.ORACLE)
return "insert into core.Tag(IdOrganization,IdComponent,ComponentType,Label,Description,Color,LastUpdateDate) values (?,?,?,?,?,?,?)";
else if (getDatabaseType() == DatabaseType.SQL_SERVER)
return "insert into core.[Tag](IdOrganization,IdComponent,ComponentType,Label,Description,Color,LastUpdateDate) values (?,?,?,?,?,?,?)";
else if (getDatabaseType() == DatabaseType.POSTGRESQL)
return "insert into core.\"Tag\"(\"IdOrganization\",\"IdComponent\",\"ComponentType\",\"Label\",\"Description\",\"Color\",\"LastUpdateDate\") values (?,?,?,?,?,?,?)";
else if (getDatabaseType() == DatabaseType.MYSQL)
return "insert into VPlatformManagement.core_Tag(IdOrganization,IdComponent,ComponentType,Label,Description,Color,LastUpdateDate) values (?,?,?,?,?,?,?)";
else
throw new ValidationException(5, "Banco de dados inválido.");
}
else if (operation.equalsIgnoreCase("select")) {
if (getDatabaseType() == DatabaseType.ORACLE)
return "select IdOrganization,IdComponent,ComponentType,Id,Label,Description,Color,LastUpdateDate from core.Tag where IdOrganization = ? and IdComponent = ? and ComponentType = ? and Id = ?";
else if (getDatabaseType() == DatabaseType.SQL_SERVER)
return "select IdOrganization,IdComponent,ComponentType,Id,Label,Description,Color,LastUpdateDate from core.[Tag] where IdOrganization = ? and IdComponent = ? and ComponentType = ? and Id = ?";
else if (getDatabaseType() == DatabaseType.POSTGRESQL)
return "select \"IdOrganization\",\"IdComponent\",\"ComponentType\",\"Id\",\"Label\",\"Description\",\"Color\",\"LastUpdateDate\" from core.\"Tag\" where \"IdOrganization\" = ? and \"IdComponent\" = ? and \"ComponentType\" = ? and \"Id\" = ?";
else if (getDatabaseType() == DatabaseType.MYSQL)
return "select IdOrganization,IdComponent,ComponentType,Id,Label,Description,Color,LastUpdateDate from VPlatformManagement.core_Tag where IdOrganization = ? and IdComponent = ? and ComponentType = ? and Id = ?";
else
throw new ValidationException(5, "Banco de dados inválido.");
}
else if (operation.equalsIgnoreCase("update")) {
if (getDatabaseType() == DatabaseType.ORACLE)
return "update core.Tag set Label = ?,Description = ?,Color = ?,LastUpdateDate = ? where IdOrganization = ? and IdComponent = ? and ComponentType = ? and Id = ?";
else if (getDatabaseType() == DatabaseType.SQL_SERVER)
return "update core.[Tag] set Label = ?,Description = ?,Color = ?,LastUpdateDate = ? where IdOrganization = ? and IdComponent = ? and ComponentType = ? and Id = ?";
else if (getDatabaseType() == DatabaseType.POSTGRESQL)
return "update core.\"Tag\" set \"Label\" = ?,\"Description\" = ?,\"Color\" = ?,\"LastUpdateDate\" = ? where \"IdOrganization\" = ? and \"IdComponent\" = ? and \"ComponentType\" = ? and \"Id\" = ?";
else if (getDatabaseType() == DatabaseType.MYSQL)
return "update VPlatformManagement.core_Tag set Label = ?,Description = ?,Color = ?,LastUpdateDate = ? where IdOrganization = ? and IdComponent = ? and ComponentType = ? and Id = ?";
else
throw new ValidationException(5, "Banco de dados inválido.");
}
else if (operation.equalsIgnoreCase("delete")) {
if (getDatabaseType() == DatabaseType.ORACLE)
return "delete from core.Tag where IdOrganization = ? and IdComponent = ? and ComponentType = ? and Id = ?";
else if (getDatabaseType() == DatabaseType.SQL_SERVER)
return "delete from core.[Tag] where IdOrganization = ? and IdComponent = ? and ComponentType = ? and Id = ?";
else if (getDatabaseType() == DatabaseType.POSTGRESQL)
return "delete from core.\"Tag\" where \"IdOrganization\" = ? and \"IdComponent\" = ? and \"ComponentType\" = ? and \"Id\" = ?";
else if (getDatabaseType() == DatabaseType.MYSQL)
return "delete from VPlatformManagement.core_Tag where IdOrganization = ? and IdComponent = ? and ComponentType = ? and Id = ?";
else
throw new ValidationException(5, "Banco de dados inválido.");
}
else if (operation.equalsIgnoreCase("list") || operation.equalsIgnoreCase("report")) {
if (getDatabaseType() == DatabaseType.ORACLE)
return "select IdOrganization,IdComponent,ComponentType,Id,Label,Description,Color,LastUpdateDate from core.Tag";
else if (getDatabaseType() == DatabaseType.SQL_SERVER)
return "select IdOrganization,IdComponent,ComponentType,Id,Label,Description,Color,LastUpdateDate from core.[Tag]";
else if (getDatabaseType() == DatabaseType.POSTGRESQL)
return "select \"IdOrganization\",\"IdComponent\",\"ComponentType\",\"Id\",\"Label\",\"Description\",\"Color\",\"LastUpdateDate\" from core.\"Tag\"";
else if (getDatabaseType() == DatabaseType.MYSQL)
return "select IdOrganization,IdComponent,ComponentType,Id,Label,Description,Color,LastUpdateDate from VPlatformManagement.core_Tag";
else
throw new ValidationException(5, "Banco de dados inválido.");
}
throw new ValidationException(5, "tipo de operação inválido.");
}
public Tag getInput() {
return input;
}
public ArrayList<Tag> getOutput() {
return output;
}
public void beforeProcess() throws Exception {
if (getOperation().equalsIgnoreCase("insert") ||
getOperation().equalsIgnoreCase("update"))
input.setLastUpdateDate(new Timestamp(System.currentTimeMillis()));
}
public void afterProcess() throws Exception {
// code if necessary
}
}
Execução de operações
| Método | Tipo | Descrição | |
|---|---|---|---|
insert() | void | Executa o processo inclusão de dados na tabela de dados | |
update() | void | Executa o processo alteração de dados na tabela de dados | |
delete() | void | Executa o processo exclusão de dados na tabela de dados | |
select() | void | Executa o processo seleção de dados na tabela de dados | |
list()(1) | void | Executa o processo lista de dados na tabela de dados | |
execute() veja filtro | void | Executa o processo de filtro | |
executeModeRecord()(2) | void | Informa o modo execução da operação listar que será por registro. | |
nextRecord() | Object | Recupera o registro da execução da operação listar do modo por registro (executeModeRecord()) |
(2) Informa ao executar a operação não irá popular a lista de array da estrutura de dados da saída. Para recuperar cada registro, deverá rexecutar o método nextRecord(). Quando não tem mais registro a ser lido, retornará o valor null. Recomendado utilizar essa opção para leitura de tabela com grande quantidade de registros.
Exemplo
- Inclusão
// create object TagDAO
TagDAO tagDAO = new TagDAO();
// reference data structure input
Tag tag = tagDAO.getInput();
// fill values
tag.setIdOrganization(123);
tag.setIdComponent(1);
tag.setComponentType(ComponentType.CONTENT);
tag.setDescription("description");
tag.setLabel("label");
tag.setColor("#03BB85");
// insert data
tagDAO.insert();
- Alteração
// create object TagDAO
TagDAO tagDAO = new TagDAO();
// reference data structure input
Tag tag = tagDAO.getInput();
// fill values primary key
tag.setIdOrganization(123);
tag.setIdComponent(1);
tag.setComponentType(ComponentType.CONTENT);
tag.setId(1);
// change content
tag.setDescription("change description");
tag.setLabel("label tag");
// update data
tagDAO.update();
- Exclusão
// create object TagDAO
TagDAO tagDAO = new TagDAO();
// reference data structure input
Tag tag = tagDAO.getInput();
// fill values primary key
tag.setIdOrganization(123);
tag.setIdComponent(1);
tag.setComponentType(ComponentType.CONTENT);
tag.setId(1);
// delete data
tagDAO.delete();
- Seleção
// create object TagDAO
TagDAO tagDAO = new TagDAO();
// reference data structure input
Tag tag = tagDAO.getInput();
// fill values primary key
tag.setIdOrganization(123);
tag.setIdComponent(1);
tag.setComponentType(ComponentType.CONTENT);
tag.setId(1);
// select data
tagDAO.select();
// get record
Tag tago = (Tag) tagDAO.getOutputOnlyRecord();
System.out.println("rec:: " + tag.getId() + " *** " tag.getDescription());
- Lista
// create object TagDAO
TagDAO tagDAO = new TagDAO();
// list
tagDAO.list();
// list all records
for (Tag tag : tagDAO.getOutput())
System.out.println("rec:: " + tag.getId() + " *** " tag.getDescription());
- Lista por registro
// create object TagDAO
TagDAO tagDAO = new TagDAO();
// list
tagDAO.executeModeRecord();
// list all records by nextRecord()
Tag tag = null;
while ((tag = (Tag) tagDAO.nextRecord()) != null) {
System.out.println("rec:: " + tag.getId() + " *** " tag.getDescription());
}
Processamento em lote
| Método | Tipo | Descrição | Parâmetro | |
|---|---|---|---|---|
beginBatch(String operation, int cutoff) | void | Inicia o processamento de lote | operation - nome da operação (insert, update, delete) cutoff(1) - ponto de corte | |
addBatch() | void | Adiciona o registro no lote | ||
endBatch() | void | Finaliza o processamento de lote | ||
flushBatch() | void | Força atualização do lote no banco de dados |
Exemplo
// create object TagDAO
TagDAO tagDAO = new TagDAO();
// reference data structure input
Tag tag = tagDAO.getInput();
// begin mode batch execution operation insert
tagDAO.beginBatch("insert", 100);
// insert 1000 new records
for (int i = 0; i < 1000; i++) {
// fill values
tag.setIdOrganization(123);
tag.setIdComponent(1);
tag.setComponentType(ComponentType.CONTENT);
tag.setDescription("description - " + i);
tag.setLabel("label - " + i);
tag.setColor("#03BB85");
// insert data
tagDAO.addBatch();
}
// end mode batch execution operation insert
tagDAO.endBatch();
Nota: Aplica também para demais operações tais como update e delete
Filtro
| Método | Tipo | Descrição | Parâmetro | |
|---|---|---|---|---|
clearFilter() | void | Limpa os critérios do filtro | ||
setFilterSyntax(String syntax) | void | Campos que fazem parte do critério do filtro | syntax - critério do filtro | |
addFilter(int order, Object value) | void | Adiciona os valores dos campos que fazem parte do critério do filtro | ||
isFindBy() | boolean | Informa que a operação de filtro é para retornar apenas um registro |
Exemplo
- Pesquisar um registro com os campos que não são chaves primárias
// create object TagDAO
TagDAO tagDAO = new TagDAO();
// filter parameters
tagDAO.clearFilter();
tagDAO.setFilterSyntax("Label = ? and Color = ?");
tagDAO.addFilter(1, "Label");
tagDAO.addFilter(2, "#03BB85");
try {
// execute filter
tagDAO.execute();
Tag tago = (Tag) tagDAO.getOutputOnlyRecord();
System.out.println("rec:: " + tag.getId() + " *** " tag.getDescription());
}
catch (NotFoundException e) {}
- Listar registros com os campos que não são chaves primárias
// create object TagDAO
TagDAO tagDAO = new TagDAO();
// filter parameters
tagDAO.clearFilter();
tagDAO.setFilterSyntax("Label = ?");
tagDAO.addFilter(1, "Label");
try {
// execute filter
tagDAO.execute();
// list all records
for (Tag tag : tagDAO.getOutput())
System.out.println("rec:: " + tag.getId() + " *** " tag.getDescription());
}
catch (NotFoundException e) {}
Apoio
| Método | Tipo | Descrição | Parâmetro | |
|---|---|---|---|---|
getOutputOnlyRecord()(1) | Object | Retorna somente um registro | ||
getOperation()(2) | String | Retorna a operação que está sendo executada | ||
getDatabaseType()(3) | DatabaseType | Retorna o tipo de banco de dados | ||
setNoProcess() | void | Informa para ignorar a execução de uma operação | ||
getLastKey() | long | Recupera ultimo valor da chave primária | ||
getIdAutoIncrem() | int | Retorna o valor do campo auto incremento | ||
getIdAutoIncremLong() | long | Retorna o valor tipo long do campo auto incremento | ||
clearInput() | void | Limpa os valores dos campos da estrutura de entrada | ||
moveCorr(Object from, Object target)(4) | void | Move os valores dos atributos do objeto de origem para objeto destino | from - Objeto origem to - Objeto destino | |
| ```` | void |
(2) Tipo de operações: insert, update, delete, select, list e filter
(3) Enumeração DatabaseType: SQL_SERVER, ORACLE, POSTGRESQL, MYSQL, DB2, SYBASE
(4) Move os valores se os atributos da origem e destino tenham os atributos com mesmo nome e mesmo tipo.
Query genérica
Implementa a estrutura dados e método para manipular os dados.
Precisa de implementar sintaxe de SQL para manipulação por meio das operações Insert, Update, Delete, Select e List. Essas classes são herdadas os métodos e as anotações da classe BusinessProcessWrapper.
Anotações
| Anotação | Descrição | Parâmetro |
|---|---|---|
@AutoCommit | Informa para VSet Chameleon que essas operações, UPDATE, INSERT ou DELETE, serão comitadas automaticamente independentemente do contexto transacional |
Exemplo
@AutoCommit
public class TagListDAO extends SQLDAOWrapper {
// any code
}
Estrutura de dados
| Anotação | Descrição | Parâmetro |
|---|---|---|
@ColumnSQLDAO | Descreve as propriedades do campo | name(1) - nome do campo que está na tabela de banco de dados description - descrição do campo order(2) - posição da coluna na operação required - informa se o campo é obrigatório |
@Internal | Informa que este campo não é disponibilizado para os canais | |
@ReadOnly | Informa que este campo é somente leitura para os canais | |
@Confidential | Informa que este campo é informação sensível. Aparece no log como asterisco |
(2) O processo de execução das operações são feitas no modo Preparation, ou seja, antes da execução da operação é preparada o plano de execução por uma vez e servirá para demais execuções. Neste modo, para aumentar a sua performance, os valores das colunas são preenchidas por sua posição. Só se aplica para estrutura de entrada. Tem caso que pode ter na sintaxe SQL tem o mesmo campo em vários lugares.
Exemplo:
- Listar as tags com nome da cor:select Name, ColorName from core.Tag a inner join core.Color b on a.IdOrganization = ? and a.IdColor = b.Idwhere a.IdOrganization = ?. Observe o campo IdOrganization está em dois lugares da sintaxe do exemplo acima.@ColumnSQLDAO(name="IdOrganization", order="1;2")É separado por ponto e vírgula
Exemplo
- Estrutura de entrada:
public class UserIssueInput {
@ColumnSQLDAO(name="IdUser", order="1;2")
@Internal
private int idUser;
@ColumnSQLDAO(name="IdOrganization", order="3")
@Internal
private int idOrganization;
public int getIdUser() {
return idUser;
}
public void setIdUser(int idUser) {
this.idUser = idUser;
}
public int getIdOrganization() {
return idOrganization;
}
public void setIdOrganization(int idOrganization) {
this.idOrganization = idOrganization;
}
}
- Estrutura de saída:
public class UserIssueOutput {
@ColumnSQLDAO(name="Id")
private int id;
@ColumnSQLDAO(name="IdParent")
private Integer idParent;
@ColumnSQLDAO(name="IdComponent")
private Integer idComponent;
@ColumnSQLDAO(name="ComponentType")
private ComponentType componentType;
@ColumnSQLDAO(name="Name")
private String name;
@ColumnSQLDAO(name="Description")
private String description;
@ColumnSQLDAO(name="Modality")
private IssueModality modality;
@ColumnSQLDAO(name="IdIssueBoard")
private Integer idIssueBoard;
@ColumnSQLDAO(name="IdIssueStage")
private Integer idIssueStage;
public int getId() {
return id;
}
public void setId(String id) throws ValidationException {
if (id != null && !id.trim().isEmpty()) {
try {
this.id = Integer.parseInt(id);
}
catch (Exception e) {throw new ValidationException(10, "campo Id inválido --- " + id);}
}
}
public void setId(int id) {
this.id = id;
}
public Integer getIdParent() {
return idParent;
}
public void setIdParent(String idParent) throws ValidationException {
if (idParent != null && !idParent.trim().isEmpty()) {
try {
this.idParent = Integer.parseInt(idParent);
}
catch (Exception e) {throw new ValidationException(10, "campo IdParent inválido --- " + idParent);}
}
}
public void setIdParent(int idParent) {
this.idParent = idParent;
}
public void setIdParent(Integer idParent) {
this.idParent = idParent;
}
public Integer getIdComponent() {
return idComponent;
}
public void setIdComponent(String idComponent) throws ValidationException {
if (idComponent != null && !idComponent.trim().isEmpty()) {
try {
this.idComponent = Integer.parseInt(idComponent);
}
catch (Exception e) {throw new ValidationException(10, "campo IdComponent inválido --- " + idComponent);}
}
}
public void setIdComponent(int idComponent) {
this.idComponent = idComponent;
}
public void setIdComponent(Integer idComponent) {
this.idComponent = idComponent;
}
public ComponentType getComponentType() {
return componentType;
}
public void setComponentType(String componentType) throws ValidationException {
if (componentType != null && !componentType.trim().isEmpty()) {
try {
this.componentType = ComponentType.valueOf(Byte.parseByte(componentType));
}
catch (Exception e) {throw new ValidationException(10, "campo ComponentType inválido --- " + componentType);}
}
}
public void setComponentType(int componentType) throws ValidationException {
this.componentType = ComponentType.valueOf(componentType);
}
public void setComponentType(ComponentType componentType) {
this.componentType = componentType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public IssueModality getModality() {
return modality;
}
public void setModality(String modality) throws ValidationException {
if (modality != null && !modality.trim().isEmpty()) {
try {
this.modality = IssueModality.valueOf(Byte.parseByte(modality));
}
catch (Exception e) {throw new ValidationException(10, "campo Modality inválido --- " + modality);}
}
}
public void setModality(int modality) throws ValidationException {
this.modality = IssueModality.valueOf(modality);
}
public void setModality(IssueModality modality) {
this.modality = modality;
}
public Integer getIdIssueBoard() {
return idIssueBoard;
}
public void setIdIssueBoard(String idIssueBoard) throws ValidationException {
if (idIssueBoard != null && !idIssueBoard.trim().isEmpty()) {
try {
this.idIssueBoard = Integer.parseInt(idIssueBoard);
}
catch (Exception e) {throw new ValidationException(10, "campo IdIssueBoard inválido --- " + idIssueBoard);}
}
}
public void setIdIssueBoard(int idIssueBoard) {
this.idIssueBoard = idIssueBoard;
}
public void setIdIssueBoard(Integer idIssueBoard) {
this.idIssueBoard = idIssueBoard;
}
}
Nota: Só foi extraído uma parte da estrutura output para como exemplo.
Classe SQLDAOWrapper
Método da classe
| Método | Tipo | Descrição | |
|---|---|---|---|
getInput() | Object – classe estrutura de dados da tabela de dados | Estrutura de dados da entrada que serão inseridos na tabela de banco de dados | |
getOutput() | Object – classe estrutura de dados da tabela de dados | Estrutura de dados da saída que serão retornados na tabela de banco de dados | |
getAlias() | String | Nome da alias que está configurado no arquivo de configuração do VSet Chameleon vsetchameleonConfig.xml na seção alias-database | |
getNotFound() | void | Nome da mensagem que será disponibilizado para os canais caso não encontrou o registro | |
getSQL() | String | Implementa a querie de acordo com a operação. Só será necessário implementar se houver uma incompatibilidade com query SQL padrão (standard) ou uma querie complexa | Opcional |
validate() | void | Implementa validações necessárias | Opcional |
beforeProcess() | void | Implementa alguma atividade antes de processar a operação do banco de dados | Opcional |
afterProcess() | void | Implementa alguma atividade ou rotina após a execução da operação do banco de dados | Opcional |
finalize() | void | Implementa alguma atividade ou rotina para finalização | Opcional |
rollback() | void | Implementa alguma atividade ou rotina de desfazimento caso houver alguma exceção da operação do banco de dados | Opcional |
Exemplo
@BusinessProcessName(name="UserIssue", description="User Issue", channel=true)
public class UserIssue extends SQLDAOWrapper {
private UserIssueInput input = new UserIssueInput();
private ArrayList<UserIssueOutput> output = new ArrayList<UserIssueOutput>();
@Override
protected String getAlias() {
return "PLATFORM_MANAGEMENT_SUITE";
}
@Override
protected String getNotFound() {
return "There is no User Issue";
}
@Override
protected String getSQL() {
return "select * from (select a.IdOrganization,a.Id,IdParent,a.IdComponent,a.ComponentType,a.Name,a.Description,Modality,IdIssueBoard,IdIssueStage,IdOwner,IdUserAssignee,IdIssueType,IdIssuePriority,IdIssueComplexity,IdIssueRelevance,CreatedByDate,UpdatedByDate,ResolvedByDate,ExpectedResolvedDate,Payload,a.Status,Tag,Progress,Dependency,a.LastViewingDate,a.ExpectedStartDate,a.LastUpdateDate,b.Name as IssueTypeName,b.Icon as IssueTypeIcon,b.Color as IssueTypeColor,c.Name as IssuePriorityName,c.Icon as IssuePriorityIcon,c.Color as IssuePriorityColor,c.Weight as IssuePriorityWeight,d.Name as OwnerName,d.Photo as OwnerImage,e.Name as UserAssigneeName,e.Photo as UserAssigneeNameImage,f.Name as IssueRelevanceName,f.Icon as IssueRelevanceIcon,f.Color as IssueRelevanceColor,f.Weight as IssueRelevanceWeight,g.Name as IssueComplexityName,g.Icon as IssueComplexityIcon,g.Color as IssueComplexityColor,g.Weight as IssueComplexityWeight, 0 as UserAssignee from issue.Issue a inner join core.Watcher h on a.Id = h.IdComponent and h.ComponentType = 3 left join issue.IssueType b on a.IdIssueType = b.Id left join issue.IssuePriority c on a.IdIssuePriority = c.Id left join control.UserAccess d on a.IdOwner = d.Id left join control.UserAccess e on a.IdUserAssignee = e.Id left join issue.IssueRelevance f on a.IdIssueRelevance = f.Id left join issue.IssueComplexity g on a.IdIssueComplexity = g.Id where h.IdUser = ? union select a.IdOrganization,a.Id,IdParent,a.IdComponent,a.ComponentType,a.Name,a.Description,Modality,IdIssueBoard,IdIssueStage,IdOwner,IdUserAssignee,IdIssueType,IdIssuePriority,IdIssueComplexity,IdIssueRelevance,CreatedByDate,UpdatedByDate,ResolvedByDate,ExpectedResolvedDate,Payload,a.Status,Tag,Progress,Dependency,a.LastViewingDate,a.ExpectedStartDate,a.LastUpdateDate,b.Name as IssueTypeName,b.Icon as IssueTypeIcon,b.Color as IssueTypeColor,c.Name as IssuePriorityName,c.Icon as IssuePriorityIcon,c.Color as IssuePriorityColor,c.Weight as IssuePriorityWeight,d.Name as OwnerName,d.Photo as OwnerImage,e.Name as UserAssigneeName,e.Photo as UserAssigneeNameImage,f.Name as IssueRelevanceName,f.Icon as IssueRelevanceIcon,f.Color as IssueRelevanceColor,f.Weight as IssueRelevanceWeight,g.Name as IssueComplexityName,g.Icon as IssueComplexityIcon,g.Color as IssueComplexityColor,g.Weight as IssueComplexityWeight, 1 as UserAssignee from issue.Issue a left join issue.IssueType b on a.IdIssueType = b.Id left join issue.IssuePriority c on a.IdIssuePriority = c.Id left join control.UserAccess d on a.IdOwner = d.Id left join control.UserAccess e on a.IdUserAssignee = e.Id left join issue.IssueRelevance f on a.IdIssueRelevance = f.Id left join issue.IssueComplexity g on a.IdIssueComplexity = g.Id where IdUserAssignee = ?) a where IdOrganization = ?";
}
public UserIssueInput getInput() {
return input;
}
public ArrayList<UserIssueOutput> getOutput() {
return output;
}
public void beforeProcess() throws Exception {
input.setIdUser(getSessionPropertyInt("IdUser"));
input.setIdOrganization(getSessionPropertyInt("IdOrganization"));
}
public void afterProcess() throws Exception {
for (UserIssueOutput uio : getOutput()) {
if (uio.getLastViewingDate() != null)
uio.setReadIssue(true);
}
}
}
Execução de operações
| Método | Tipo | Descrição | |
|---|---|---|---|
execute() | void | Executa o processo da query definido pelo método getSQL() | |
executeModeRecord()(1) | void | Informa o modo execução da operação listar que será por registro. | |
nextRecord() | Object | Recupera o registro da execução da operação listar do modo por registro (executeModeRecord()) |
Exemplo
- Execução da classe (veja classe UserIssue)
// create object UserIssue
UserIssue userIssue = new UserIssue();
// insert values into input
userIssue.getInput().setIdOrganization(1);
userIssue.getInput().setIdUser(2);
// execute query
userIssue.execute();
Processamento em lote
| Método | Tipo | Descrição | Parâmetro | |
|---|---|---|---|---|
beginBatch(int cutoff) | void | Inicia o processamento de lote para operações insert, update e delete | cutoff(1) - ponto de corte | |
addBatch() | void | Adiciona o registro no lote | ||
endBatch() | void | Finaliza o processamento de lote | ||
flushBatch() | void | Força atualização do lote no banco de dados |
Exemplo
- classe UpdateIssueReadUserAssigneeDAO
public class UpdateIssueReadUserAssigneeDAO extends SQLDAOWrapper {
private UpdateIssueReadUserAssigneeDAOInput input = new UpdateIssueReadUserAssigneeDAOInput();
@Override
protected String getAlias() {
return "PLATFORM_MANAGEMENT_SUITE";
}
@Override
protected String getNotFound() {
return "There is no user assignee";
}
@Override
protected String getSQL() {
return "update issue.Issue set LastViewingDate = ? where IdOrganization = ? and IdComponent = ? and ComponentType = ? and Id = ?";
}
public UpdateIssueReadUserAssigneeDAOInput getInput() {
return input;
}
public Object getOutput() {
return null;
}
public void beforeProcess() throws Exception {
input.setIdOrganization(getSessionPropertyInt("IdOrganization"));
}
public void afterProcess() throws Exception {
}
}
- Execução da classe
// create object UpdateIssueReadUserAssigneeDAO
UpdateIssueReadUserAssigneeDAO uirua = new UpdateIssueReadUserAssigneeDAO();
// reference data structure input
UpdateIssueReadUserAssigneeDAOInput uiruai = uirua.getInput();
// begin mode batch execution operation insert
uirua.beginBatch(100);
// insert 1000 new records
for (int i = 0; i < 1000; i++) {
// fill values
uiruai.setIdOrganization(123);
uiruai.setIdComponent(1);
uiruai.setComponentType(ComponentType.CONTENT);
uiruai.setId(input.getIdIssue());
uiruai.setLastViewingDate(input.getLastViewingDate());
// add data
uirua.addBatch();
}
// end mode batch execution operation insert
uirua.endBatch();
Filtro
| Método | Tipo | Descrição | Parâmetro | |
|---|---|---|---|---|
clearFilter() | void | Limpa os critérios do filtro | ||
setFilterSyntax(String syntax) | void | Campos que fazem parte do critério do filtro | syntax - critério do filtro | |
addFilter(int order, Object value) | void | Adiciona os valores dos campos que fazem parte do critério do filtro | ||
isFindBy() | boolean | Informa que a operação de filtro é para retornar apenas um registro |
Exemplo
- Listar registros com os campos que não são chaves primárias
// create object UserIssue
UserIssue userIssue = new UserIssue();
// filter parameters
userIssue.clearFilter();
userIssue.setFilterSyntax("IdComponent = ? and ComponetType = ?");
userIssue.addFilter(1, 1);
userIssue.addFilter(2, ComponentType.CONTENT);
try {
// execute filter
userIssue.execute();
// list all records
for (UserIssueOutput uio : userIssue.getOutput())
System.out.println("rec:: " + uio.getId() + " *** " uio.getName());
}
catch (NotFoundException e) {}
Store Procedure
Implementa a estrutura dados e método para manipular os dados por meio de store procedure.
Essas classes são herdadas os métodos e as anotações da classe BusinessProcessWrapper.
Anotações
| Anotação | Descrição | Parâmetro |
|---|---|---|
@AutoCommit | Informa para VSet Chameleon que essas operações, UPDATE, INSERT ou DELETE, serão comitadas automaticamente independentemente do contexto transacional |
Exemplo
@AutoCommit
public class ProjectionSummaryDAO extends StoredProcedureDAOWrapper {
// any code
}
Estrutura de dados
| Anotação | Descrição | Parâmetro |
|---|---|---|
@ColumnSPDAO | Descreve as propriedades do campo | name(1) - nome do campo que está na tabela de banco de dados description - descrição do campo order(2) - posição da coluna na operação outParameter informa se é um parâmetro OUTPUT required - informa se o campo é obrigatório |
@Internal | Informa que este campo não é disponibilizado para os canais | |
@ReadOnly | Informa que este campo é somente leitura para os canais | |
@Confidential | Informa que este campo é informação sensível. Aparece no log como asterisco |
(2) O processo de execução das operações são feitas no modo Preparation, ou seja, antes da execução da operação é preparada o plano de execução por uma vez e servirá para demais execuções. Neste modo, para aumentar a sua performance, os valores das colunas são preenchidas por sua posição. Só se aplica para estrutura de entrada.
Exemplo
- Estrutura de entrada
public class ProjectionSummaryDAOInput {
@ColumnSPDAO(name="IdNet", description="IdNet", order="1", outParameter=false, required=false)
private byte idNet;
public byte getIdNet() {
return idNet;
}
public void setIdNet(int idNet) {
this.idNet = (byte) idNet;
}
public void setIdNet(byte idNet) {
this.idNet = idNet;
}
}
- Estrutura de saída
public class ProjectionSummaryDAOOutput {
@ColumnSPDAO(name="IdGasStation", description="Id Gas Station", order="1", outParameter=false, required=false)
private int idGasStation;
@ColumnSPDAO(name="GasStationName", description="Gas Station Name", order="2", outParameter=false, required=false)
private String gasStationName;
@ColumnSPDAO(name="MarginDay", description="Margin Day", order="3", outParameter=false, required=false)
private double marginDay;
@ColumnSPDAO(name="AmountLiters", description="Amount Liters", order="4", outParameter=false, required=false)
private double amountLiters;
public int getIdGasStation() {
return idGasStation;
}
public void setIdGasStation(int idGasStation) {
this.idGasStation = idGasStation;
}
public String getGasStationName() {
return gasStationName;
}
public void setGasStationName(String gasStationName) {
this.gasStationName = gasStationName;
}
public double getMarginDay() {
return marginDay;
}
public void setMarginDay(double marginDay) {
this.marginDay = marginDay;
}
public double getAmountLiters() {
return amountLiters;
}
public void setAmountLiters(double amountLiters) {
this.amountLiters = amountLiters;
}
}
Classe StoredProcedureDAOWrapper
Método da classe
| Método | Tipo | Descrição | |
|---|---|---|---|
getInput() | Object – classe estrutura de dados da tabela de dados | Estrutura de dados da entrada que serão inseridos na tabela de banco de dados | |
getOutput() | Object – classe estrutura de dados da tabela de dados | Estrutura de dados da saída que serão retornados na tabela de banco de dados | |
getAlias() | String | Nome da alias que está configurado no arquivo de configuração do VSet Chameleon vsetchameleonConfig.xml na seção alias-database | |
getNotFound() | void | Nome da mensagem que será disponibilizado para os canais caso não encontrou o registro | |
getSQL() | String | Implementa a querie de acordo com a operação. Só será necessário implementar se houver uma incompatibilidade com query SQL padrão (standard) ou uma querie complexa | Opcional |
validate() | void | Implementa validações necessárias | Opcional |
beforeProcess() | void | Implementa alguma atividade antes de processar a operação do banco de dados | Opcional |
afterProcess() | void | Implementa alguma atividade ou rotina após a execução da operação do banco de dados | Opcional |
finalize() | void | Implementa alguma atividade ou rotina para finalização | Opcional |
rollback() | void | Implementa alguma atividade ou rotina de desfazimento caso houver alguma exceção da operação do banco de dados | Opcional |
Exemplo
public class ProjectionSummaryDAO extends StoredProcedureDAOWrapper {
private ProjectionSummaryDAOInput input = new ProjectionSummaryDAOInput();
private ArrayList<ProjectionSummaryDAOOutput> output = new ArrayList<ProjectionSummaryDAOOutput>();
@Override
public ProjectionSummaryDAOInput getInput() {
return input;
}
@Override
public ArrayList<ProjectionSummaryDAOOutput> getOutput() {
return output;
}
@Override
protected String getAlias() {
return "SISPOS";
}
@Override
protected String getNotFound() {
return "There is no projection in this period";
}
@Override
protected String getSQL() throws Exception {
return "{call sp_profit_list(?)}";
}
}
Execução de operações
| Método | Tipo | Descrição | |
|---|---|---|---|
execute() | void | Executa o processo da query definido pelo método getSQL() | |
executeModeRecord()(1) | void | Informa o modo execução da operação listar que será por registro. | |
nextRecord() | Object | Recupera o registro da execução da operação listar do modo por registro (executeModeRecord()) |
(1) Informa ao executar a operação não irá popular a lista de array da estrutura de dados da saída. Para recuperar cada registro, deverá rexecutar o método nextRecord(). Quando não tem mais registro a ser lido, retornará o valor null. Recomendado utilizar essa opção para leitura de tabela com grande quantidade de registros.
Exemplo
- Execução da classe (veja classe ProjectionSummaryDAO)
// create object ProjectionSummaryDAO
ProjectionSummaryDAO psDAO = new ProjectionSummaryDAO();
// insert values into input
psDAO.getInput().setIdNet(1);
psDAO.execute();
for (ProjectionSummaryDAOOutput out : psDAO.getOutput()) {
System.out.println("PROJ::: " + out.getMarginDay());
}
Apoio
| Método | Tipo | Descrição | Parâmetro | |
|---|---|---|---|---|
getCharsetName() | String | Recupera o valor charsetName | ||
setCharsetName(String charsetName) | void | Insere o valor charsetName | ||
getFilename() | String | Recupera o nome do arquivo | ||
setEmbedDelimiter(String delimiter, String delimiterChange) | void | Informa se tem o delimitador embutido | ||
isHasHeader() | boolean | Verifica se tem cabeçalho dos campos | ||
setHasHeader(boolean hasHeader) | void | Informa se o arquivo tem cabeçalho dos campos |