You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
importio.ebean.annotation.Sql;
importjavax.persistence.Entity;
importjava.util.List;
@Sql@EntitypublicclassClasseSql {
publicStringid;
publicintidade;
publicStringnome;
publicStringalgumaCoisa;
publicIntegeroqueEuquiser;
// Exemplos de como coletar os dadospublicstaticClasseSqlfindById(Longid) {
returngetData().where().eq("uma_coluna", id).findOne();
}
// Escrevendo SQL na mãopublicstaticQuery<ClasseSql> getData() {
RawSqlrawSql = getRawSql();
returnEbean.find(ClasseSql.class)
.setRawSql(rawSql);
}
privatestaticRawSqlgetRawSql() {
// Fazendo uma query e alterando o valor das variáveisreturnRawsqlBuilder.parse("select * from alguma_tabela")
.columnMapping("coluna_idade", "idade")
.columnMapping("coluna_nome", "nome")
.columnMapping("coluna_alguma_coisa", "algumaCoisa")
.columnMapping("coluna_oque_eu_quiser", "oqueEuQuiser")
}
}
SQL
Com Ebean
Na classe de query .java
@Entity@Table(name = "nome_da_tabela")
publicclassUserextendsModel {
// Marca como coluna de id// Linka a variável ao valor da coluna@Id@Column(name = "coluna_id")
publicLongid;
// Não deixa ser nula@Column(name = "coluna_nome", nullabel = false)
publicStringnome;
@Column(name = "coluna_password")
publicStringpassword;
// Não deixa alterar seu valor@Column(name = "alguma_coluna", updatable = false)
publicstringalgumaCoisa;
// Rodando alguma query com o ebeanpublicstaticUserauthenticate(Stringlogin, StringclearPassword) {
returnFINDER.query().where()
.and(Expr.ieq("coluna_nome", nome),
Expr.eq("coluna_password", DigestUtils.md5Hex(clearPassword)))
.findOne();
}
}
No controller
Useruser = newUser();
user.nome = "Ronaldo";
user.password = "123456";
user.algumaCoisa = "algo";
// Com isso salvo os dadosuser.save();
@funcao(parametro:Int,parametro2:Int)= @{// Posso alterar um parâmetro da páginavarfilter=parametroDaPagina// Chamando uma função de um controllerroutes.controllerDeAlgo.list(parametro,parametro2,filter)}
importjava.sql.Connection;
importjava.util.concurrent.CompletableFuture;
importjava.util.concurrent.CompletionStage;
importjavax.inject.Inject;
importplay.mvc.Controller;
importplay.db.NamedDatabase;
importplay.db.Database;
classJavaJdbcConnection {
privateDatabasedb;
privateDatabaseExecutionContextexecutionContext;
@InjectpublicJavaJdbcConnection(Databasedb, DatabaseExecutionContextexecutionContext) {
this.db = db;
this.executionContext = executionContext;
}
publicCompletionStage<Void> updateSomething() {
returnCompletableFuture.runAsync(() -> {
// get jdbc connectionConnectionconnection = db.getConnection();
// do whatever you need with the db connectionreturn;
}, executionContext);
}
}
Comunicação com banco de dados (base de dados):
Coloco no application.conf.
só acrescentar isso para criar um banco default:
db.default.driver=org.h2.Driver
db.default.url=”jdbc:h2:mem:play” #banco de teste dentro da memória
db.default.user=sa
db.default.password=""
# linkando para bancos de dados diferentes
#db.default.url="jdbc:h2:/path/to/db-file" banco padrão do play
# postgreSQL
#db.default.driver=org.postgresql.Driver no caso do postgres
#db.default.url="jdbc:postgresql:/path/to/db-file" no caso do postgres
# mySQL
#db.default.driver=com.mysql.jdbc.Driver no caso do postgres
#db.default.url="jdbc:mysql:/path/to/db-file" no caso do postgres
# NÃO ESQUECER DE COLOCAR PASSWORD E USUÁRIO
#posso setar mais quantos bancos eu quiser
db.myCustom.driver=org.h2.Driver
db.myCustom.url=”jdbc:h2:mem:play”
ebean.default="models.*"
Isso indica ao Play! qual o banco que ele deve usar e também que ele pode criar automaticamente os comandos de banco de dados que geram as tabelas do modelo.
Configuramos também o Ebean, implementação ORM que vem por padrão com o Play!, para procurar os modelos no pacote models.
Acessando o banco de dados default
packagejavaguide.sql;
importjavax.inject.Inject;
importjavax.inject.Singleton;
importplay.mvc.Controller;
importplay.db.NamedDatabase;
importplay.db.Database;
// inject "orders" database instead of "default"@javax.inject.SingletonclassJavaNamedDatabase {
privateDatabasedb;
privateDatabaseExecutionContextexecutionContext;
@InjectpublicJavaNamedDatabase(@NamedDatabase("orders") Databasedb, DatabaseExecutionContextexecutionContext) {
this.db = db;
this.executionContext = executionContext;
}
// do whatever you need with the db using supplyAsync(() -> { ... }, executionContext);
}
Respondendo uma requisição:
Uso a classe CompletableFuture, que retorna o sucesso ou falha da requisição
StringsqlCommand = “select \* fromtest”;
// play.db é a API para acessar o banco de dados jdbcConnectionconnect = play.db.DB.createConnection();
try{
Statementstmt = connect.createStatement();
try{
stmt.execute(sql);
} finally {
stmt.close();
}
} finally {
connect.close();
}
Atribuindo valores em variáveis apartir de um comando SQL
Comentário a pensar sobre USAR ou NÃO USAR playframework
An interesting article with some very good points, although a bit too pro Play for my liking.
Play Framework is a mess, the documentation is inconsistent or just missing for some versions and it's overly complicated for what it actually does, I would not recommend using it from Java or Scala.
A few additions to the Bad bullet points for Scala...
Breaking changes across versions
Tooling (IDE plugins are a million miles away from compared with those for Java)
Compilation - it's slow, very slow
Syntax - too complicated and inconsistent
Static typing (especially when rendering HTML and building frontend apps)
SBT - possibly the worst build tool I've ever used
For REST APIs or backend services I think Clojure/Java/JaxRs/DropWizard/Scala/Play are a good fit but I think they should be avoided when rendering HTML and building frontend apps.
POST api/diretorio @controllers.funcaoControlador(dado1: String, dado2:String ?= "")
Controller do POST
Rodando assincronamente
importcontrollers.api.SQLController;
...
publicCompletionStage<Result> funcao(Stringdado1, Stringdado2) {
@InjectHttpExecutionContextcontext;
returnCompletableFuture.supplyAsync(() -> {
ObjectNodejson = Json.newObject();
// Controlando os dados da requisição// json.put("nome da variável", "dados da variável")// Assim posso colocar um erro e já retornar um erroif(condicionalDeErro){
// Retorno em Arrayjson.put("code", "dados de erro");
returnbadRequest(json);
}
if(algumOutroErro){
DebugUtil.w(String.format("Enviando dados dinamicamente para debug (%d - %s) \"%s\".", dado1, dado2, dado3));
errorAsJson(json, 20, String.format("Enviando dados dinamicamente como resposta \"%s\".", dado1));
returnbadRequest(json);
}
// Retorno em Objetojson.put("code", 0);
json.put("dado1", this.dado1);
json.put("dado2", this.dado2);
returnok(json);
}, this.context.current());
}
Setando o json
json.set(ListDeNomes, ListDeValores);
Controller para retornar os dados de algo
JPA + Ebean
importio.ebean.Finder;
importio.ebean.Model;
importio.ebean.annotation.WhenCreated;
// Esses @ são chamados de anotations// Os anotations servem para referenciar à colunas e tabelas do banco.@Entity@Table(name="nome_da_tabela")
publicclassClasseCriadaextendsModel {
// isso linka o FINDER à classe, logo posso chamar ele para chamar as coisasprivatestaticfinalFinder<Long, ClasseCriada> FINDER = newFinder<Long, ClasseCriada>(ClasseCriada.class){};
@Id@Column(name="nome_da_coluna_id")
publicLongid;
@Columns(name="outro_dado")
publicStringoutroDado;
// Graças à extender Model, posso usar o byId para procurar os dados pelo idpublicClasseCriadafindById(Longid) {
ClasseCriadadados = FINDER.byId(id);
// Assim uso os dados:// dados.outroDadoreturndados;
}
// Existem várias funções no Model, como:publicList<ClasseCriada> listaDeAlgo(Longid) {
returnFINDER.query().where().eq(propertyName: "algum_valor_unico", id).findList();
}
// Pegando todos os dadospublicList<ClasseCriada> listaComTudo() {
returnFINDER.query().where().eq(propertyName: "coluna_da_tabela", true).findList();
}
// Chamando para receber esta lista:// listaDealgo(3).stream.map(elemento -> elemento.outroDado).collect(Collectors.toList());
}