An open API service indexing awesome lists of open source software.

https://github.com/aledsz/rarframework-java

RAR Framework in Java
https://github.com/aledsz/rarframework-java

Last synced: 10 months ago
JSON representation

RAR Framework in Java

Awesome Lists containing this project

README

          

# RAR Framework in Java [![Build Status](https://travis-ci.org/aleDsz/rarframework-java.svg?branch=master)](https://travis-ci.org/aleDsz/rarframework-java)

## 1. Introdução

Após ter criado o mesmo framework, originalmente em [PHP](https://github.com/aleDsz/rarframework), percebi que eu teria a mesma necessidade de um ORM em outras linguagens. Assim como eu precisei quando comecei a utilizar o Java em ambiente profissional e, com a praticidade que eu tinha em PHP, resolvi adaptar para Java.

## 2. Como Funciona

Através do pacote `java.sql`, é possível realizar uma conexão com vários tipos de banco de dados. Além disso, por meio do `Generics`, é possível acessar o conteúdo de um objeto e obter todas as informações necessárias para criar uma instrução SQL.

Neste caso, uma classe deve seguir o seguinte modelo:

```java
package br.com.aledsz.rarframework;

import br.com.aledsz.rarframework.database.objects.DbColumnAttribute;
import br.com.aledsz.rarframework.database.objects.DbTableAttribute;

@DbTableAttribute(databaseName = "mysql", tableName = "contacts")
public class Contact {

@DbColumnAttribute(fieldName = "id", primaryKey = true, size = 11, type = "Integer")
public Integer id;

@DbColumnAttribute(fieldName = "name", primaryKey = false, size = 120, type = "String")
public String name;

@DbColumnAttribute(fieldName = "email", primaryKey = true, size = 120, type = "String")
public String email;

@DbColumnAttribute(fieldName = "phone", primaryKey = false, size = 30, type = "String")
public String phoneNumber;
}

```

## 3. Como Utilizar

Para que você possa utilizar todos as funcionalidades do framework no seu ambiente, você pode criar 1 (ou mais, dependendo da sua forma de trabalho) classe para acessar ao banco de dados de forma genérica.

```java
package br.com.aledsz.rarframework;

import br.com.aledsz.rarframework.database.DatabaseFactory;
import br.com.aledsz.rarframework.database.command.CommandContext;
import br.com.aledsz.rarframework.database.data.DataContext;
import br.com.aledsz.rarframework.database.enums.TiposSelect;
import br.com.aledsz.rarframework.database.objects.ObjectContext;
import br.com.aledsz.rarframework.database.sql.*;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

/**
* @author aleDsz
*/
public class ModelDataAccess {

public void create(T obj) throws Exception {
try {
ObjectContext objContext = new ObjectContext<>(obj);
DataContext dataContext = DatabaseFactory.getInstanceOfDataAccess(objContext.getDatabase());
SqlStatementInsert sqlStatement = new SqlStatementInsert<>(obj);

dataContext.begin();

CommandContext commandContext = new CommandContext(objContext.getDatabase(), sqlStatement.getSql());
commandContext.executeQuery();

dataContext.commit();
} catch (IOException | SQLException ex) {
throw ex;
}
}

public void save(T obj) throws Exception {
try {
ObjectContext objContext = new ObjectContext<>(obj);
DataContext dataContext = DatabaseFactory.getInstanceOfDataAccess(objContext.getDatabase());
SqlStatementUpdate sqlStatement = new SqlStatementUpdate<>(obj);

dataContext.begin();

CommandContext commandContext = new CommandContext(objContext.getDatabase(), sqlStatement.getSql());
commandContext.executeQuery();

dataContext.commit();
} catch (IOException | SQLException ex) {
throw ex;
}
}

public void remove(T obj) throws Exception {
try {
ObjectContext objContext = new ObjectContext<>(obj);
DataContext dataContext = DatabaseFactory.getInstanceOfDataAccess(objContext.getDatabase());
SqlStatementDelete sqlStatement = new SqlStatementDelete<>(obj);

dataContext.begin();

CommandContext commandContext = new CommandContext(objContext.getDatabase(), sqlStatement.getSql());
commandContext.executeQuery();

dataContext.commit();
} catch (IOException | SQLException ex) {
throw ex;
}
}

public T find(T obj) throws Exception {
try {
T object = null;

ObjectContext objContext = new ObjectContext<>(obj);
DataContext dataContext = DatabaseFactory.getInstanceOfDataAccess(objContext.getDatabase());
SqlStatementSelect sqlStatement = new SqlStatementSelect<>(obj);

dataContext.begin();

CommandContext commandContext = new CommandContext(objContext.getDatabase(), sqlStatement.getSql(TiposSelect.ByKey));
object = objContext.getObject(commandContext.executeReader());

dataContext.commit();

return object;
} catch (IOException | SQLException ex) {
throw ex;
}
}

public List findAll(T obj) throws Exception {
try {
List objects = null;

ObjectContext objContext = new ObjectContext<>(obj);
DataContext dataContext = DatabaseFactory.getInstanceOfDataAccess(objContext.getDatabase());
SqlStatementSelect sqlStatement = new SqlStatementSelect<>(obj);

dataContext.begin();

CommandContext commandContext = new CommandContext(objContext.getDatabase(), sqlStatement.getSql(TiposSelect.All));
objects = objContext.getObjects(commandContext.executeReader());

dataContext.commit();

return objects;
} catch (IOException | SQLException ex) {
throw ex;
}
}
}

```

**OBS.:** Você não precisa criar a classe de forma genérica, você pode criar uma classe de acesso a dados para cada entidade que você criar no modelo citado acima.

E para que o ORM consiga se conectar com o banco de dados, você precisa criar um arquivo de configuração com o nome: `config.properties` e ele deve seguir o modelo abaixo:

```java
mysql.host = localhost
mysql.port = 3306
mysql.type = mysql
mysql.user = root
mysql.pwd = 123
mysql.db = database_test
```

**OBS.:** Através da propriedade `databaseName` da anotação de classe, é possível utilizar inúmeros banco de dados diferentes, assim ele deve ser diferenciado no arquivo `config.properties`. Por exemplo, se você tiver um banco de dados `sqlite` e um `mysql`, seu arquivo deverá estar definido desta forma:

```java
mysql.host = localhost
mysql.port = 3306
mysql.type = mysql
mysql.user = root
mysql.pwd = 123
mysql.db = database_test

sqlite.host = data/testDb.db
sqlite.port =
sqlite.type = sqlite
sqlite.user =
sqlite.pwd =
sqlite.db =
```

## 4. Como Contribuir

Para contribuir, você pode realizar um **fork** do nosso repositório e nos enviar um Pull Request.

## 5. Doação

Caso queria fazer uma doação para o projeto, você pode realizar [aqui](https://twitch.streamlabs.com/aleDsz)

## 6. Suporte

Caso você tenha algum problema ou uma sugestão, você pode nos contatar [aqui](https://github.com/aleDsz/rarframework-net/issues).

## 7. Licença

Cheque [aqui](LICENSE)