Isso é útil. Mas isso não me mostra as consultas SQL reais.
Nicolas Barbulesco
6
@ Nicolas isso é verdade, no entanto, imediatamente após a consulta, ele dispersa os parâmetros vinculados.
Xtreme Biker
2
Estou usando grails 2.4.4 e hibernate 4. Alterar a configuração do log4j não funcionou para mim, mas o p6spy funcionou!
Champ
11
No Hibernate 5, podemos usar o org.hibernate.type.descriptor.sql.BasicBinderlogger. A ativação do logon org.hibernate.typeimprimiu muitas informações inúteis para mim ...
csharpfolk
5
org.hibernate.typee org.hibernate.loader.hqlnão funciona para mim para mostrar os parâmetros
Dherik
75
Apenas por conveniência, aqui está o mesmo exemplo de configuração para Logback (SLF4J)
O Log4JDBC é uma boa solução que imprime o SQL exato que vai para o banco de dados com parâmetros em vez da resposta mais popular aqui, que não faz isso. Uma grande conveniência disso é que você pode copiar o SQL diretamente para o front-end do banco de dados e executar como está.
Meu arquivo de configuração logback.xml é semelhante ao abaixo: isso gera todas as instruções SQL com parâmetros e as tabelas de conjunto de resultados para todas as consultas.
<?xml version="1.0" encoding="UTF-8"?><configuration><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern></encoder></appender><loggername="jdbc.audit"level="ERROR"/><loggername="jdbc.connection"level="ERROR"/><loggername="jdbc.sqltiming"level="ERROR"/><loggername="jdbc.resultset"level="ERROR"/><!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT --><!--<logger name="jdbc.resultsettable" level="ERROR" /> --><rootlevel="debug"><appender-refref="STDOUT"/></root></configuration>
Finalmente, tive que criar um arquivo chamado log4jdbc.log4j2.properties na raiz do caminho de classe, por exemplo, src / test / resources ou src / main / resources em um projeto Mevn. Este arquivo tem uma linha que é a abaixo:
10:44:29.400[main] DEBUG jdbc.sqlonly - org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)5.select memberrole0_.member_id as member_i2_12_0_, memberrole0_.id as id1_12_0_, memberrole0_.id
as id1_12_1_, memberrole0_.member_id as member_i2_12_1_, memberrole0_.role_id as role_id3_12_1_,
role1_.id as id1_17_2_, role1_.name as name2_17_2_ from member_roles memberrole0_ left outer
join roles role1_ on memberrole0_.role_id=role1_.id where memberrole0_.member_id=10410:44:29.402[main] INFO jdbc.resultsettable -|----------|---|---|----------|--------|---|-----||member_id |id |id |member_id |role_id |id |name ||----------|---|---|----------|--------|---|-----||----------|---|---|----------|--------|---|-----|
Ei .... Isso parece legal .... exatamente o que o médico pediu para mim :) ... mas também suporta CLOB / BLOB ?? Além disso, é possível exibir apenas a consulta e não o conjunto de resultados. - Obrigado :)
dev ray
11
você poderia me dar um exemplo de configuração como fazer isso?
grep
Na verdade, o último gera uma representação tabluar dos resultados da consulta ... ou seja, é preciso log4jdbc-remix para esse recurso interessante.
meriton
Essa solução foi melhor para minha situação em que eu precisava ver os valores do número da linha que o Hibernate gera para os conjuntos de resultados de paginação. O log de rastreamento mostra apenas os valores dos parâmetros de consulta.
Oliver Hernandez
@ Alan Hay também registra consultas nativas?
Sayantan 30/07/19
9
Você pode adicionar linhas de categoria ao log4j.xml:
A org.hibernate.type.descriptor.sql.BasicBindercategoria não inclui todos os parâmetros, por exemplo, tipos de enumeração. Então, se você quer tudo, você realmente precisa TRACEpara todo o org.hibernate.typegrupo.
Seanf
Para mim, funciona no Hibernate 4.3! Além disso, eu não rastrearia o org.hibernate.type completo, porque isso é muita saída. Na maioria dos casos, esta solução serve.
cslotty
Observe que org.hibernate.type.descriptor.sql.BasicExtractor registra os conjuntos de resultados. Portanto, ter uma entrada de tamanho grande pode até travar a aplicação ao efetuar logon no console no Eclipse, e suponho que também não seja ideal para efetuar logon no arquivo. É por isso que prefiro esta solução, que também funciona no Hibernate 3. Para aqueles que estão interessados em tipos de enumeração, tente a classe exata que os registra quando org.hibernate.type = TRACE. Em seguida, defina org.hibernate.type.xyz.TheClassThatLogsEnumParams = TRACE.
A solução está correta, mas também registra todas as ligações para os objetos de resultado. Para evitar isso, é possível criar um aplicativo separado e ativar a filtragem, por exemplo:
<!-- A time/date based rolling appender --><appendername="FILE_HIBERNATE"class="org.jboss.logging.appender.DailyRollingFileAppender"><errorHandlerclass="org.jboss.logging.util.OnlyOnceErrorHandler"/><paramname="File"value="${jboss.server.log.dir}/hiber.log"/><paramname="Append"value="false"/><paramname="Threshold"value="TRACE"/><!-- Rollover at midnight each day --><paramname="DatePattern"value="'.'yyyy-MM-dd"/><layoutclass="org.apache.log4j.PatternLayout"><!-- The default pattern: Date Priority [Category] Message\n --><paramname="ConversionPattern"value="%d %-5p [%c] %m%n"/></layout><filterclass="org.apache.log4j.varia.StringMatchFilter"><paramname="StringToMatch"value="bind"/><paramname="AcceptOnMatch"value="true"/></filter><filterclass="org.apache.log4j.varia.StringMatchFilter"><paramname="StringToMatch"value="select"/><paramname="AcceptOnMatch"value="true"/></filter><filterclass="org.apache.log4j.varia.DenyAllFilter"/></appender><categoryname="org.hibernate.type"><priorityvalue="TRACE"/></category><loggername="org.hibernate.type"><levelvalue="TRACE"/><appender-refref="FILE_HIBERNATE"/></logger><loggername="org.hibernate.SQL"><levelvalue="TRACE"/><appender-refref="FILE_HIBERNATE"/></logger>
**If you want hibernate to print generated sql queries with real values instead of question marks.****add following entry in hibernate.cfg.xml/hibernate.properties:**
show_sql=true
format_sql=true
use_sql_comments=true**Andadd following entry in log4j.properties :**
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
Hey single31 linhas acima tem que ser adicionado ao seu arquivo de configuração de hibernação, então ele definitivamente funcionará. Eu sempre posto coisas que praticamente fiz.
Vijay Bhatt
3
Esta resposta é uma pequena variação para a pergunta. Às vezes, precisamos apenas do sql apenas para fins de depuração em tempo de execução. Nesse caso, há uma maneira mais fácil, usando a depuração nos editores.
Coloque um ponto de interrupção em org.hibernate.loader.Loader.loadEntityBatch (ou navegue na pilha até lá);
Quando a execução é suspensa, observe o valor da variável this.sql;
Isso é para o hibernate 3. Não tenho certeza de que isso funcione em outras versões.
agora, ele está usando o log slf4j, se o log padrão for log4j, você deve adicionar as dependências slf4j-api, slf4j-log4j12 para usar o log slf4j
etapa 2: [escreva seu log personalizado]
package com.xxx;import java.sql.SQLException;import java.util.Properties;import com.mysql.jdbc.Connection;import com.mysql.jdbc.log.Log;publicclassCustomLoggingProfilerEventHandlerimplementsProfilerEventHandler{privateLog log;publicLoggingProfilerEventHandler(){}publicvoid consumeEvent(ProfilerEvent evt){/**
* you can only print the sql as this.log.logInfo(evt.getMessage())
* you can adjust your sql print log level with: DEBUG,INFO
* you can also handle the message to meet your requirement
*/this.log.logInfo(evt);}publicvoid destroy(){this.log =null;}publicvoid init(Connection conn,Properties props)throwsSQLException{this.log = conn.getLog();}}
Ei, isso é legal. Mas acho que aqui as consultas são impressas com o? seguido com os valores dos parâmetros. Como tenho inúmeras consultas, preciso de algo que possa copiar e colar no editor sql e elas serão executadas. Existe uma maneira de fazer isso usando essa abordagem. Não gosto muito de ir para bibliotecas de terceiros. Obrigado :)
dev ray
Obrigado. Eu esperava não precisar usar nenhuma solução de terceiros e hibernar diretamente, mas acho que não tenho outra opção.
ray dev
2
O registro funciona, mas não exatamente o que você quer ou eu queria há algum tempo, mas o P6Spy funciona perfeitamente ,
Extraia o p6spy-install.jararquivo, procure p6spy.jarespy.properties
Adicionar dependência de biblioteca
Adicione p6spy.jarà sua dependência da biblioteca de projetos
Modificar arquivo de propriedades do P6Spy
Modifique seu arquivo de configuração do banco de dados. Você precisa substituir o driver JDBC existente pelo driver P6Spy JDBC -com.p6spy.engine.spy.P6SpyDriver
Original é o driver MySQL JDBC - com.mysql.jdbc.Driver
Modifique o arquivo de propriedades
do P6Spy Modifique o arquivo de propriedades do P6Spy -spy.properties
Substitua real driverpor seu driver MySQL JDBC existente
realdriver=com.mysql.jdbc.Driver#specifies another driver to use
realdriver2=#specifies a third driver to use
realdriver3=
Alterar o local do arquivo de log Altere o local do arquivo de log na propriedade filefile, todas as instruções SQL farão logon neste arquivo.
janelas
logfile = c:/spy.log
* nix
logfile =/srv/log/spy.log
Copiar “spy.properties”para o caminho de classe do projeto
Copie “spy.properties”para a pasta raiz do projeto, verifique se o seu projeto pode localizar "spy.properties"; caso contrário, ele solicitará a “spy.properties”exceção do arquivo não encontrado.
Esse foi o caminho mais fácil a seguir no meu aplicativo Spring Boot, onde estava tentando registrar o SQL gerado a partir de um teste de unidade. Adicionei uma dependência de teste ao Gradle (testCompile 'p6spy: p6spy: 3.8.5'), application.yml ajustado para definir spring.datasource.url = jdbc: p6spy: h2: mem: testdb e spring.datasource.driver-class- name = com.p6spy.engine.spy.P6SpyDriver e, em seguida, adicionou spy.properties com realdriver = org.h2.Driver e arquivo de log definido no meu caminho preferido. Foi fácil extrair o SQL completo do arquivo de log resultante. O único problema foi que o H2 não gostou do formato de carimbo de data e hora gerado.
Eu descobri através deste thread que a estrutura do jboss-logging usada pelo hibernate precisava ser configurada para fazer o log do slf4j. Adicionei o seguinte argumento aos argumentos da VM do aplicativo:
2013-10-3114:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] HQL:select noti.id, noti.idmicrosite, noti.fcaducidad, noti.fpublicacion, noti.tipo, noti.imagen, noti.visible, trad.titulo, trad.subtitulo, trad.laurl, trad.urlnom, trad.fuente, trad.texto from org.ibit.rol.sac.micromodel.Noticia noti join noti.traducciones trad where index(trad)='ca'and noti.visible='S'and noti.idmicrosite=985and noti.tipo=34462013-10-3114:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] SQL:select noticia0_.NOT_CODI as x0_0_, noticia0_.NOT_MICCOD as x1_0_, noticia0_.NOT_CADUCA as x2_0_, noticia0_.NOT_PUBLIC as x3_0_, noticia0_.NOT_TIPO as x4_0_, noticia0_.NOT_IMAGEN as x5_0_, noticia0_.NOT_VISIB as x6_0_, traduccion1_.NID_TITULO as x7_0_, traduccion1_.NID_SUBTIT as x8_0_, traduccion1_.NID_URL as x9_0_, traduccion1_.NID_URLNOM as x10_0_, traduccion1_.NID_FUENTE as x11_0_, traduccion1_.NID_TEXTO as x12_0_ from GUS_NOTICS noticia0_ inner join GUS_NOTIDI traduccion1_ on noticia0_.NOT_CODI=traduccion1_.NID_NOTCOD where(traduccion1_.NID_CODIDI='ca')and(noticia0_.NOT_VISIB='S')and(noticia0_.NOT_MICCOD=985)and(noticia0_.NOT_TIPO=3446)
Ei ... Não consigo encontrar exemplos dessa abordagem. Você poderia fornecer qualquer referência / exemplos / tutoriais. E ainda é o mesmo com as versões mais recentes ou hibernate / log4j ou se tornou algum org.hibernate.QueryTranslator ou algo assim. Graças
dev ray
Ei ... Eu tentei isso, mas isso não parece funcionar com salvar ou atualizar. Eu acho que ele só funciona para consultas SELECT, onde a tradução de hql para sql entra em jogo
ray dev
1
O plugin Log4Jdbc seria o melhor para sua necessidade. Mostra as seguintes
1.Complete SQL query being hit to the db
2.Parameter values being passed to the query
3.Execution time taken by each query
Consulte o link abaixo para configurar o Log4Jdbc-
Nenhuma das respostas acima mencionadas imprimirá sql com parâmetros corretamente ou é uma dor. Consegui isso usando o WireShark , que captura todos os comandos sql / enviados do aplicativo para o Oracle / Mysql etc com as consultas.
Todas as respostas aqui são úteis, mas se você estiver usando um XML de contexto de aplicativo Spring para configurar sua fábrica de sessões, a configuração da variável de nível SQL log4j fará com que você faça parte do caminho até lá, também precisará definir a variável hibernate.show_sql no próprio contexto do aplicativo, para que o Hibernate comece a realmente mostrar os valores.
O ApplicationContext.xml possui:
<propertyname="hibernateProperties"><value>
hibernate.jdbc.batch_size=25
... <!-- Other parameter values here -->
hibernate.show_sql=true
</value></property>
Obrigado, ele imprime a consulta, mas não os parâmetros que ele usou, existe uma maneira de imprimir os parâmetros também?
Liz Lamperouge
0
O Hibernate mostra a consulta e seus valores de parâmetro em linhas diferentes.
Se você estiver usando application.properties na inicialização por primavera e poderá usar o parâmetro destacado abaixo em application.properties.
org.hibernate.SQL mostrará consultas
logging.level.org.hibernate.SQL = DEBUG
org.hibernate.type mostrará todos os valores de parâmetros, que serão mapeados com as consultas de seleção, inserção e atualização. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType mostrará o valor do parâmetro do tipo enum
logging.level.org.hibernate.type.EnumType = TRACE
exemplo ::
2018-06-1411:06:28,217 TRACE [main][EnumType.java :321]Binding[active] to parameter:[1]
sql.BasicBinder mostrará o valor inteiro do parâmetro, varchar, tipo booleano
Mesmo isso não mostra os valores para limite e deslocamento nas consultas.
precisa saber é
0
A solução mais simples para mim é implementar um stringReplace regular para substituir entradas de parâmetro por valores de parâmetro (tratar todos os parâmetros como string, para simplificar):
String debugedSql = sql;//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key,"'"+value.toString()+"'");//and finnaly
println(debugedSql);
ou algo semelhante para parâmetros posicionais (?).
Cuide de valores nulos e tipos de valores específicos, como data, se desejar que um sql pronto para execução seja registrado.
Respostas:
Você precisa habilitar o log para as seguintes categorias:
org.hibernate.SQL
- definido comodebug
para registrar todas as instruções SQL DML à medida que são executadasorg.hibernate.type
- configure paratrace
registrar todos os parâmetros JDBCPortanto, uma configuração do log4j pode se parecer com:
O primeiro é equivalente à propriedade
hibernate.show_sql=true
herdada , o segundo imprime os parâmetros vinculados entre outras coisas.Outra solução (não baseada em hibernação) seria usar um driver proxy JDBC como o P6Spy .
fonte
org.hibernate.type.descriptor.sql.BasicBinder
logger. A ativação do logonorg.hibernate.type
imprimiu muitas informações inúteis para mim ...org.hibernate.type
eorg.hibernate.loader.hql
não funciona para mim para mostrar os parâmetrosApenas por conveniência, aqui está o mesmo exemplo de configuração para Logback (SLF4J)
A saída no seu sql.log (exemplo) fica assim:
fonte
Mude
hibernate.cfg.xml
para:Inclua log4j e entradas abaixo em "log4j.properties":
fonte
binding parameter [1] as [VARCHAR] - [1]
.No caso de inicialização por mola, apenas configure isso:
aplication.yml
aplication.properties
e nada mais.
HTH
fonte
O Log4JDBC é uma boa solução que imprime o SQL exato que vai para o banco de dados com parâmetros em vez da resposta mais popular aqui, que não faz isso. Uma grande conveniência disso é que você pode copiar o SQL diretamente para o front-end do banco de dados e executar como está.
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
O último também gera uma representação tabular dos resultados da consulta.
Saída de amostra mostrando o SQL gerado com parâmetros no lugar junto com a tabela do conjunto de resultados da consulta:
Atualização 2016
Mais recentemente, agora uso log4jdbc-log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) com SLF4j e logback. As dependências do Maven necessárias para minha configuração são as seguintes:
O driver e os URLs do banco de dados são parecidos com:
Meu arquivo de configuração logback.xml é semelhante ao abaixo: isso gera todas as instruções SQL com parâmetros e as tabelas de conjunto de resultados para todas as consultas.
Finalmente, tive que criar um arquivo chamado log4jdbc.log4j2.properties na raiz do caminho de classe, por exemplo, src / test / resources ou src / main / resources em um projeto Mevn. Este arquivo tem uma linha que é a abaixo:
O acima dependerá da sua biblioteca de log. Veja os documentos em https://code.google.com/archive/p/log4jdbc-log4j2 para obter mais informações
Saída de amostra:
fonte
Você pode adicionar linhas de categoria ao log4j.xml:
e adicione propriedades de hibernação:
fonte
adicione as seguintes propriedades e valores à sua configuração log4j ou logback:
fonte
org.hibernate.type.descriptor.sql.BasicBinder
categoria não inclui todos os parâmetros, por exemplo, tipos de enumeração. Então, se você quer tudo, você realmente precisaTRACE
para todo oorg.hibernate.type
grupo.Você pode fazer isso usando o proxy da fonte de dados , como descrevi neste post .
Supondo que seu aplicativo espere um
dataSource
bean (por exemplo, via@Resource
), é assim que você pode configurardatasource-proxy
:Agora a saída do Hibernate vs datasource-proxy:
As
datasource-proxy
consultas contêm valores de parâmetro e você pode até adicionar interceptores de instruções JDBC customizados para detectar problemas de consulta N + 1 diretamente de seus testes de integração .fonte
ligue o
org.hibernate.type
criador de logs para ver como os parâmetros reais estão vinculados aos pontos de interrogação.fonte
fonte
A solução está correta, mas também registra todas as ligações para os objetos de resultado. Para evitar isso, é possível criar um aplicativo separado e ativar a filtragem, por exemplo:
fonte
fonte
Esta resposta é uma pequena variação para a pergunta. Às vezes, precisamos apenas do sql apenas para fins de depuração em tempo de execução. Nesse caso, há uma maneira mais fácil, usando a depuração nos editores.
Isso é para o hibernate 3. Não tenho certeza de que isso funcione em outras versões.
fonte
O driver mysql jdbc já fornece um conveniente para atender a esse requisito, você deve pelo menos ter a versão jar> = mysql-connect-jar-5.1.6.jar
etapa 1: [configure seu jdbc.url para adicionar logger e log personalizado]
agora, ele está usando o log slf4j, se o log padrão for log4j, você deve adicionar as dependências slf4j-api, slf4j-log4j12 para usar o log slf4j
etapa 2: [escreva seu log personalizado]
fonte
Eu gosto disso para log4j:
fonte
O registro funciona, mas não exatamente o que você quer ou eu queria há algum tempo, mas o P6Spy funciona perfeitamente ,
aqui está o tutorial simples de implementar também o tutorial MKYONG para P6Spy .
para mim, funcionou como charme.
Obtenha o "p6spy-install.jar"
Extraia o
p6spy-install.jar
arquivo, procurep6spy.jar
espy.properties
Adicione
p6spy.jar
à sua dependência da biblioteca de projetosModifique seu arquivo de configuração do banco de dados. Você precisa substituir o driver JDBC existente pelo driver P6Spy JDBC -
com.p6spy.engine.spy.P6SpyDriver
Original é o driver MySQL JDBC -
com.mysql.jdbc.Driver
Alterado para o driver P6Spy JDBC -
com.p6spy.engine.spy.P6SpyDriver
spy.properties
Substitua
real driver
por seu driver MySQL JDBC existenteAlterar o local do arquivo de log Altere o local do arquivo de log na propriedade filefile, todas as instruções SQL farão logon neste arquivo.
janelas
* nix
“spy.properties”
para o caminho de classe do projetoCopie
“spy.properties”
para a pasta raiz do projeto, verifique se o seu projeto pode localizar "spy.properties"; caso contrário, ele solicitará a“spy.properties”
exceção do arquivo não encontrado.fonte
fonte
Usando o Hibernate 4 e slf4j / log4j2, tentei adicionar o seguinte na minha configuração log4j2.xml:
Mas sem sucesso.
Eu descobri através deste thread que a estrutura do jboss-logging usada pelo hibernate precisava ser configurada para fazer o log do slf4j. Adicionei o seguinte argumento aos argumentos da VM do aplicativo:
E funcionou perfeitamente.
fonte
Aqui está o que funcionou para mim, defina a propriedade abaixo no log4j.file:
Configurações de propriedades do Hibernate:
fonte
para desenvolvimento com o Wildfly (standalone.xml), adicione os registradores:
fonte
se você estiver usando o hibernate 3.2.xx, use
ao invés de
fonte
Você pode registrar isso:
Exemplo de saída:
fonte
O plugin Log4Jdbc seria o melhor para sua necessidade. Mostra as seguintes
Consulte o link abaixo para configurar o Log4Jdbc-
fonte
Use Wireshark ou algo semelhante:
Nenhuma das respostas acima mencionadas imprimirá sql com parâmetros corretamente ou é uma dor. Consegui isso usando o WireShark , que captura todos os comandos sql / enviados do aplicativo para o Oracle / Mysql etc com as consultas.
fonte
Todas as respostas aqui são úteis, mas se você estiver usando um XML de contexto de aplicativo Spring para configurar sua fábrica de sessões, a configuração da variável de nível SQL log4j fará com que você faça parte do caminho até lá, também precisará definir a variável hibernate.show_sql no próprio contexto do aplicativo, para que o Hibernate comece a realmente mostrar os valores.
O ApplicationContext.xml possui:
E seu arquivo log4j precisa
fonte
Em Java:
Transforme sua consulta em TypedQuery se for um CriteriaQuery (javax.persistence).
Então:
query.unwrap (org.hibernate.Query.class) .getQueryString ();
fonte
O Hibernate mostra a consulta e seus valores de parâmetro em linhas diferentes.
Se você estiver usando application.properties na inicialização por primavera e poderá usar o parâmetro destacado abaixo em application.properties.
org.hibernate.SQL mostrará consultas
logging.level.org.hibernate.SQL = DEBUG
org.hibernate.type mostrará todos os valores de parâmetros, que serão mapeados com as consultas de seleção, inserção e atualização. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType mostrará o valor do parâmetro do tipo enum
logging.level.org.hibernate.type.EnumType = TRACE
exemplo ::
sql.BasicBinder mostrará o valor inteiro do parâmetro, varchar, tipo booleano
logging.level.org.hibernate.type.descriptor.sql.BasicBinder = TRACE
exemplo ::
fonte
A solução mais simples para mim é implementar um stringReplace regular para substituir entradas de parâmetro por valores de parâmetro (tratar todos os parâmetros como string, para simplificar):
ou algo semelhante para parâmetros posicionais (?).
Cuide de valores nulos e tipos de valores específicos, como data, se desejar que um sql pronto para execução seja registrado.
fonte