Com MentaBean você faz o mapeamento objeto-relacional diretamente com código Java. Veja o exemplo abaixo:
BeanManager mgr = new BeanManager(); // "Users" é o nome da tabela BeanConfig userCfg = new BeanConfig(User.class, "Users"); // chave primária com autoincremento userCfg.pk("id", DBTypes.AUTOINCREMENT); // o nome da coluna é o mesmo nome do atributo userCfg.field("username", DBTypes.STRING); // o nome da coluna no banco é diferente: "bd" userCfg.field("birthdate", "bd", DBTypes.DATE); // o status será salvo como VARCHAR no banco userCfg.field("status", DBTypes.ENUMVALUE.from(Status.class)); // 0 para falso e 1 para verdadeiro no banco userCfg.field("deleted", DBTypes.BOOLEANINT); // novamente o nome da coluna é diferente do nome do atributo userCfg.field("insertTime", "insert_time", DBTypes.NOW_ON_INSERT_TIMESTAMP); mgr.addBeanConfig(userCfg);
Ou o mesmo usando uma Fluent API:
BeanManager mgr = new BeanManager(); // "Users" é o nome da tabela BeanConfig userCfg = new BeanConfig(User.class, "Users") // chave primária com autoincremento .pk("id", DBTypes.AUTOINCREMENT) // o nome da coluna é o mesmo nome do atributo .field("username", DBTypes.STRING) // o nome da coluna no banco é diferente: "bd" .field("birthdate", "bd", DBTypes.DATE) // o status será salvo como VARCHAR no banco .field("status", DBTypes.ENUMVALUE.from(Status.class)) // 0 para falso e 1 para verdadeiro no banco .field("deleted", DBTypes.BOOLEANINT) // novamente o nome da coluna é diferente do nome do atributo .field("insertTime", "insert_time", DBTypes.NOW_ON_INSERT_TIMESTAMP); mgr.addBeanConfig(userCfg);
Ou o mesmo utilizando um proxy para facilitar a refatoração:
BeanManager mgr = new BeanManager(); User userProps = PropertiesProxy.create(User.class); BeanConfig userCfg = new BeanConfig(User.class, "Users") .pk(userProps.getId(), DBTypes.AUTOINCREMENT) .field(userProps.getUsername(), DBTypes.STRING) .field(userProps.getBirthdate(), "bd", DBTypes.DATE) // note that the database column name is different .field(userProps.getStatus(), DBTypes.ENUMVALUE.from(Status.class)) .field(userProps.isDeleted(), DBTypes.BOOLEANINT) .field(userProps.getInsertTime(), "insert_time", DBTypes.NOW_ON_INSERT_TIMESTAMP); mgr.addBeanConfig(userCfg);
MentaBean vem com vários campos prontos para uso (DBTypes) e você ainda pode criar os seus próprios. Abaixo vamos explicar cada um deles:
Campos que mapeiam números em Java para números no banco de dados. São eles:
NOTA: Se um número no banco possui o valor NULL e você quer refletir este NULL em seu bean, então você deve usar as classes Wrapper dos tipos primitivos (ex. java.lang.Integer). Se o campo é um primitivo (ex. int) então o valor NULL no banco será convertido para ZERO no atributo quanto o bean for carregado.
Os bancos de dados geralmente gravam tipos booleanos como inteiros (0 ou 1) ou enumerações ('T' ou 'F'). MentaBean suporta ambos:
Por padrão, o tipo BOOLEANSTRING assume 'T' e 'F' como verdadeiro e falso, respectivamente, mas você pode facilmente trocar de acordo com a sua necessidade como o exemplo abaixo:
userCfg.field("deleted", DBTypes.BOOLEANSTRING.values("SIM", "NAO"));
NOTA: Se o seu banco possui uma função específica para gerar a data e hora corrente (ex. now(), sysdate, etc.) esta será usada, então a data será a respectiva data e hora configuradas no banco. Caso contrário uma nova instância de java.util.Date é passada como padrão.
Se a coluna do banco de dados está configurada como um campo de auto-incremento, você pode usar o AutoIncrementType, então este não será incluído nos inserts.
NOTA:MentaBean automaticamente popula os campos de auto-incremento nos objetos conforme o valor gerado no banco, então depois que um insert é executado você pode facilmente chamar o getter do atributo para encontrar o valor que foi gerado.
Alguns bancos, tais como Oracle ou PostgreSQL, suportam tipos sequencias (sequences). Se você possui uma sequência criada em sua base de dados você pode configurá-la na sua bean de acordo com o tipo abaixo:
Por padrão, MentaBean assume o seguinte formato para os nomes das sequences: seq_<NOME_DA_COLUNA>_<NOME_DA_TABELA>. Contudo, você pode especificar o nome desejado conforme o exemplo:
.pk("id", DBTypes.SEQUENCE).seq("minha_sequence")
Você pode salvar uma propriedade enumerável (enum) no banco de acordo com seu valor em String ou conforme seu id usando um dos tipos abaixo:
Para ambos os tipos você deve usar a API fluente para informar o enum, conforme abaixo:
// Status.class é o seu enum config.field("status", DBTypes.ENUMVALUE.from(Status.class)); config.field("status", DBTypes.ENUMID.from(Status.class));
Para usar o tipo ENUMID, seu enum deve implementar dois métodos: getId() e fromId(). Exemplo:
public static enum Test { T1(1), T2(2), T3(3); private final int id; private Test(int id) { this.id = id; } public int getId() { return id; } public static Test fromId(int id) { for(Test t : Test.values()) { if (t.getId() == id) return t; } return null; } }
NOTA:O método fromId() deve ser estático.
O MentaBean oferece ainda um tipo genérico para cobrir os casos em que os tipos especificados não atendem.
NOTA: Este tipo não deverá ser usado para operações DDL (como create table, por exemplo), pois não existem tipos "genéricos" a nível de banco de dados. Desta forma, as operações com statement e result set são feitas em cima dos métodos set/getObject respectivamente, que dependerá da implementação do driver JDBC do seu dialeto específico.
Os tipos fornecidos pelo MentaBean devem ser suficiente para a maioria dos deus campos, mas você ainda pode codificar os seus próprios tipos implementando a interface DBType.