Possivelmente use a apresentação JDBI - Evoluindo um projeto de código aberto para algum material
Observações da migração de um pequeno projeto:
Classes renomeadas (não tão simples quanto excluir importações e deixar o IDE corrigi-las):
DBI
-> Jdbi
IDBI
-> Jdbi
DBIException
-> JdbiException
Os construtores para Jdbi
foram substituídos por um método de fábrica create()
.
ResultSetMapper
é substituído por RowMapper
e o método map
não tem mais o índice de linha. Uma classe chamada ResultSetMapper
existe no Jdbi 3, mas serve a um propósito diferente. @Mapper
é substituído por @UseRowMapper
. registerMapper()
em Jdbi
é substituído por registerRowMapper()
.
@BindIn
é substituído por @BindList
e não requer mais StringTemplate.
Com o modelo Jdbi padrão, os colchetes angulares não são citados, o que significa que o IntelliJ entende a sintaxe depois que você configura o Parameter Pattern em Tools -> Database -> User Patterns .
Query
não tem mais um tipo padrão de Map
e, portanto, list()
não pode ser chamado diretamente. Ligue mapToMap()
antes de ligar para list()
.
TransactionStatus
não existe mais.
TransactionConsumer.useTransaction()
leva apenas Handle
agora, então o argumento TransactionStatus
precisa ser removido ao usar isso com os métodos useTransaction()
em Jdbi
ou Handle
.
TransactionCallback.inTransaction()
só aceita Handle
agora, então o argumento TransactionStatus
precisa ser removido ao usar isso com os métodos inTransaction()
em Jdbi
ou Handle
.
CallbackFailedException
não existe mais. As várias interfaces funcionais, como HandleConsumer
, HandleCallback
, TransactionalConsumer
e TransactionalCallback
, agora podem lançar qualquer tipo de exceção (mas restritas usando genéricos para evitar verificação desnecessária manipulação de exceção).
O suporte a objetos SQL não está mais disponível por padrão. Ele deve ser registrado a cada instância Jdbi
criada.
O Migrate Refactor do IntelliJ foi útil para iniciar a migração.
Obrigado @electrum por montar isso! Esta será uma grande ajuda
Algumas notas adicionais da revisão da minha apresentação:
java.lang.reflect.Type
, enquanto a v2 usa java.lang.Class
. Isso significa que a v3 é capaz de lidar com assinaturas de tipo genérico complexas que a v2 não conseguia.@Bind
nos parâmetros do método SQL Object podem se tornar opcionais, compilando seu código com o sinalizador -parameters
habilitado.StatementLocator
foi removida do núcleo. Todas as instruções principais esperam receber o SQL real agora. Um conceito semelhante, SqlLocator
foi adicionado, mas apenas no domínio dos Objetos SQL.Outra: StatementRewriter
foi refatorado em TemplateEngine
e SqlParser
.
Muito importante adicionar à lista é o comportamento do select. Partiu disso:
List<Map<String, Object>> rs = h.select("select id, name from something");
Para isso:
List<Map<String, Object>> rs = h.select("select id, name from something").mapToMap().list();
Eu gostaria que o poder extra, flexibilidade e segurança da v3 não viesse com o preço da verbosidade.
Oi @javajosh , não consideramos esse particular muito ruim porque estamos tentando desencorajar o mapeamento para objetos Map
. Se nada mais, as regras sobre diferenciação de maiúsculas e minúsculas para as chaves são confusas. Existe algum motivo para você emitir um Map
em vez de criar seu próprio tipo definido? Eu, pessoalmente, sempre escreverei pequenas classes de resultado (usando mapeadores e fichários construtor/campo/propriedade) e sempre evito usar Map
. Você tem algum caso de uso em que é muito conveniente?
Oi @stevenschlansker - Estou chegando na perspectiva da "primeira experiência dos desenvolvedores". O código acima foi retirado do seu próprio tutorial v2, que eu acho admiravelmente minimalista. E, de fato, com uma linguagem hospedada em JVM como Groovy, que possui um mapa semelhante a javascript embutido, você provavelmente veria um resultado não digitado com mais frequência.
@javajosh o que você acha de https://github.com/jdbi/jdbi/pull/925 ?
@stevenschlansker Você quis dizer #928?
@stevenschlansker Definitivamente uma melhoria! Mas ainda é mais detalhado que a v2. :) Isso é além da maior verbosidade no maven, etc. Eu só não quero ver o JDBI seguir o caminho do JUnit, que lutou para que as pessoas adotassem a v4 porque tinha alguns recursos interessantes, mas era muito mais complicado do que v3 e v3 foi "bom o suficiente". Eu tenho esse mesmo sentimento sobre a sintaxe "withHandle" (embora eu entenda seu instinto de eliminar todas as alças pendentes).
@javajosh Você ainda tem Jdbi.open()
se quiser maior controle, embora recomendemos que você o use dentro de um bloco try-with-resources por segurança.
Iniciando o trabalho nos documentos de migração de v2 para v3.
@javajosh Voltando ao método ResultBearing.list()
que retorna um List<Map<String,Object>>
: não tenho certeza se adicionar isso foi uma boa ideia, especialmente no final do ciclo de lançamento.
Tenho empatia com suas preocupações sobre a verbosidade, mas essa verbosidade serve ao propósito de esclarecer a intenção do desenvolvedor:
handle.createQuery(sql)
.mapToMap()
.list()
é mais claro para o leitor do que:
handle.createQuery(sql)
.list()
É uma coisa delicada, e não invejo sua posição tendo que escolher. JDBI é uma boa biblioteca, e estou feliz por simplesmente ter registrado minhas preocupações sobre verbosidade; se faz sentido adicionar um método de conveniência neste caso específico, não tenho certeza e tenderia a confiar em seu julgamento sobre o meu, já que não estou seriamente envolvido no projeto! Obrigado por ouvir!
Por favor, deixe-nos saber se você encontrar um exemplo concreto de como é melhor com um nome mais curto ou uma demonstração de como podemos melhorá-lo 😄
Comentários muito úteis
Observações da migração de um pequeno projeto:
Classes renomeadas (não tão simples quanto excluir importações e deixar o IDE corrigi-las):
DBI
->Jdbi
IDBI
->Jdbi
DBIException
->JdbiException
Os construtores para
Jdbi
foram substituídos por um método de fábricacreate()
.ResultSetMapper
é substituído porRowMapper
e o métodomap
não tem mais o índice de linha. Uma classe chamadaResultSetMapper
existe no Jdbi 3, mas serve a um propósito diferente.@Mapper
é substituído por@UseRowMapper
.registerMapper()
emJdbi
é substituído porregisterRowMapper()
.@BindIn
é substituído por@BindList
e não requer mais StringTemplate.Com o modelo Jdbi padrão, os colchetes angulares não são citados, o que significa que o IntelliJ entende a sintaxe depois que você configura o Parameter Pattern em Tools -> Database -> User Patterns .
Query
não tem mais um tipo padrão deMap
e, portanto,list()
não pode ser chamado diretamente. LiguemapToMap()
antes de ligar paralist()
.TransactionStatus
não existe mais.TransactionConsumer.useTransaction()
leva apenasHandle
agora, então o argumentoTransactionStatus
precisa ser removido ao usar isso com os métodosuseTransaction()
emJdbi
ouHandle
.TransactionCallback.inTransaction()
só aceitaHandle
agora, então o argumentoTransactionStatus
precisa ser removido ao usar isso com os métodosinTransaction()
emJdbi
ouHandle
.CallbackFailedException
não existe mais. As várias interfaces funcionais, comoHandleConsumer
,HandleCallback
,TransactionalConsumer
eTransactionalCallback
, agora podem lançar qualquer tipo de exceção (mas restritas usando genéricos para evitar verificação desnecessária manipulação de exceção).O suporte a objetos SQL não está mais disponível por padrão. Ele deve ser registrado a cada instância
Jdbi
criada.O Migrate Refactor do IntelliJ foi útil para iniciar a migração.