<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>André L. S. &#187; Desenvolvimento</title>
	<atom:link href="http://www.andrels.com/wp-pt_BR/index.php/category/desenvolvimento/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andrels.com/wp-pt_BR</link>
	<description>Desenvolvimento de Softwares, Tecnologia e Games</description>
	<lastBuildDate>Wed, 08 Feb 2012 12:37:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Chrome para Android, finalmente!</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2012/02/chrome-para-android-finalmente/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2012/02/chrome-para-android-finalmente/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 20:54:03 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Dispositivos]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[market]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=485</guid>
		<description><![CDATA[ Para quem não sabe, o navegador padrão do Android não é o Chrome, e sim uma implementação do Webkit. Surpreso?<a href="http://www.andrels.com/wp-pt_BR/index.php/2012/02/chrome-para-android-finalmente/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-486" title="chrome_logo" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2012/02/chrome_logo.png" alt="" width="124" height="124" /> Para quem não sabe, o navegador padrão do Android não é o Chrome, e sim uma implementação do <a href="http://pt.wikipedia.org/wiki/WebKit" target="_blank">Webkit</a>. Surpreso?</p>
<p>As coisas estão mudando. Hoje (7), sorrateiramente, a Google colocou no Android Market a versão beta do seu navegador, o Chrome. Porém está disponível apenas para o ICS (Ice Cream Sandwich), ou versão superior. Espero que mudem isso ou, ao menos, tentem adapta-lo para uma versão mais &#8220;acessível&#8221;.</p>
<p>Abaixo o vídeo mostrando o funcionamento do browser.</p>
<h5 style="text-align: center;"><object style="height: 448px; width: 560px;" width="560" height="448" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="https://www.youtube.com/v/lVjw7n_U37A?version=3&amp;feature=player_embedded" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><embed style="height: 448px; width: 560px;" width="560" height="448" type="application/x-shockwave-flash" src="https://www.youtube.com/v/lVjw7n_U37A?version=3&amp;feature=player_embedded" allowFullScreen="true" allowScriptAccess="always" allowfullscreen="true" allowscriptaccess="always" /></object><br />
Android Market</h5>
<p>Infelizmente não possuo o Icecream Sandwich, então não poderei fazer um <em>review</em>, mas veja a descrição e os comentários de quem já baixo no <a href="https://market.android.com/details?id=com.android.chrome&amp;feature=search_result#?t=W251bGwsMSwxLDEsImNvbS5hbmRyb2lkLmNocm9tZSJd" target="_blank">Android Market</a>.</p>
<p>Caso você já tenha experimentado, compartilhe sua experiência conosco. <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Valeu, galera!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2012/02/chrome-para-android-finalmente/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compilando objetos inválidos do Oracle de maneira fácil</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2012/01/compilando-objetos-invalidos-do-oracle-de-maneira-facil/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2012/01/compilando-objetos-invalidos-do-oracle-de-maneira-facil/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 21:39:46 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[plsql]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=454</guid>
		<description><![CDATA[Quando se compila um objeto que é referenciado por vários outros objetos, estes ficam inválidos até que sejam recompilados novamente,<a href="http://www.andrels.com/wp-pt_BR/index.php/2012/01/compilando-objetos-invalidos-do-oracle-de-maneira-facil/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Quando se compila um objeto que é referenciado por vários outros objetos, estes ficam inválidos até que sejam recompilados novamente, coisa que o Oracle deveria fazer e, de alguma maneira, as vezes não faz.</p>
<p>Então aqui vai uma dica para quem tem de compilar várias <em>packages</em>, <em>procedures</em> e/ou <em>functions</em> inválidas diariamente devido à esta falha do Oracle.</p>
<p>Existe um comando que força o banco a compilar todos os objetos inválidos sob um determinado usuário, o comando é:</p>
<pre class="brush:sql">exec dbms_ultility.compile_schema(&lt;USUARIO&gt;);</pre>
<p>Substitua por <i>user</i> onde está &lt;USUARIO&gt; se os objetos estiverem sob o usuário que está conectado, ou pelo nome de usuário correspondente.</p>
<p>O comando demora um pouco para ser executado e não compila todos os objetos que estão inválidos por erro de codificação, para descobrir quais objetos estão inválidos, você pode executar a seguinte <em>query</em>:</p>
<pre class="brush:sql">
select object_name
from all_objects
where status = 'INVALID'
</pre>
<p>Será listado os objetos que estão inválidos na base.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2012/01/compilando-objetos-invalidos-do-oracle-de-maneira-facil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Motorola Droid Razr &#8211; O super smarphone Android</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/11/motorola-droid-razr-o-super-smarphone-android/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/11/motorola-droid-razr-o-super-smarphone-android/#comments</comments>
		<pubDate>Thu, 24 Nov 2011 15:41:13 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[gingerbread]]></category>
		<category><![CDATA[icecream sandwich]]></category>
		<category><![CDATA[motorola]]></category>
		<category><![CDATA[razr]]></category>
		<category><![CDATA[smartphone]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=429</guid>
		<description><![CDATA[Lançado recentement, o novo Motorola Droid Razr é o celular mais fino do mundo com conectividade 4G. Com espessura de<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/11/motorola-droid-razr-o-super-smarphone-android/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-431 aligncenter" title="droid-razr" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/11/droid-razr.jpg" alt="" width="500" height="376" /></p>
<p>Lançado recentement, o novo Motorola Droid Razr é o celular mais fino do mundo com conectividade 4G. Com espessura de 7,1mm, traz uma tela com 4,3 pol. de Super AMOLED, possui resolução de 540 x 960 pixels e é protegida pelo já conhecido Gorilla® Glass, resistente a poeira e riscos. Sua câmera traseira, de 8MP, consegue capturar vídeos em Full HD (1080p) e sua câmera frontal, de 1.3 MP, possui capacidade de gravação em HD (720p).</p>
<p>Muito mais leve e resistente, o Motorola Razr é revestido por <a href="http://pt.wikipedia.org/wiki/Kevlar" target="_blank">Kevlar®</a>, que lhe dá um acabamento muito mais atrativo.</p>
<p>O Android Gingerbread (posteriormente o Icecream Sandwich) é suportado por seu processador Dual-core de 1.2Ghz e 1GB de memória RAM. Também contará com 16GB de memória interna, 16 GB no cartão MicroSD que o acompanha (expansível até 32 GB), conexões de dados 3G e 4G, além do EDGE, GPRS e Wi-fi (b, g e n), GPS, protocolo <a title="Inglês" href="http://en.wikipedia.org/wiki/Digital_Living_Network_Alliance" target="_blank">DLNA (Digital Living Network Alliance)</a>.</p>
<p>Falando em conectividade, o smartphone vem com <a href="http://www.motorola.com/Consumers/BR-PT/Consumer-Product-Services/MOTOCAST/Motocast" target="_blank">MotoCast</a> pré-instalado. Este aplicativo permite você compartilhar seus arquivos, vídeos e músicas entre o aparelho e seu computador atravéz da rede Wi-fi, 3G ou 4G, sem a necessidade do cabo USB.</p>
<p>Assim como o Motorola Atrix, o Droid Razr também é compatível com o <em>gadget</em> <a href="http://www.motorola.com/Consumers/BR-PT/Consumer-Product-Services/WEBTOP/Meet-WEBTOP">Webtop</a>.</p>
<p>O <em>design</em> do Motorola Droid Razr lembra muito o de seu avó, Motorola Razr V3, que teve 110 milhões unidades vendidas em todo mundo.</p>
<table style="background-color: #fff;" width="100%" border="0">
<tbody>
<tr>
<td style="background-color: #fff; border: none;" align="center" width="50%">
<p><div id="attachment_430" class="wp-caption alignnone" style="width: 210px"><img class="size-full wp-image-430 " title="razr-v3x" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/11/razr-v3x.jpg" alt="Razr V3 X" width="200" height="284" /><p class="wp-caption-text">Motorola Razr V3x</p></div></td>
<td style="background-color: #fff; border: none;" align="center">
<p><div id="attachment_432" class="wp-caption alignnone" style="width: 210px"><img class="size-full wp-image-432 " title="razr-droid" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/11/razr-droid.jpg" alt="Droid Razr" width="200" height="284" /><p class="wp-caption-text">Motorola Droid Razr</p></div></td>
</tr>
</tbody>
</table>
<p>Apesar do lançamento ter sido no dia 16 de novembro, ainda não é possível encontrar o aparelho no Brasil, mas já sabemos que o preço sugerido pela Motorola é de R$ 1.999,00.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/11/motorola-droid-razr-o-super-smarphone-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplicativos que seu Android precisa ter &#8211; Listen</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/10/aplicativos-que-seu-android-precisa-ter-listen/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/10/aplicativos-que-seu-android-precisa-ter-listen/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 17:06:23 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[aplicativos]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[market]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=412</guid>
		<description><![CDATA[Você, que acompanha diversos Podcasts pelo mundo à fora e nem sempre tem um computador à disposição para baixá-los e<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/10/aplicativos-que-seu-android-precisa-ter-listen/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="alignright size-full wp-image-415" style="margin-left: 10px; margin-right: 10px;" title="Listen" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/listen1.png" alt="" width="200" height="316" />Você, que acompanha diversos Podcasts pelo mundo à fora e nem sempre tem um computador à disposição para baixá-los e copiá-los para seu smartphone, pode contar com o <a href="https://market.android.com/details?id=com.google.android.apps.listen" target="_blank">Listen</a>.</p>
<p style="text-align: justify;">Este aplicativo, desenvolvido pela própria Google, lhe permite indexar vários podcasts disponível na Internet. Nem todos eles estão no índice do aplicativo, para estes casos, você pode adicioná-los manualmente no menu da opção &#8220;My subscriptions&#8221;.</p>
<p style="text-align: justify;">Lógico que, pela qualidade da banda 3G brasileira, você conseguirá ouvir os Podcasts continuamente (sem aquelas pausas de <em>buffer</em>) usando conexão Wi-fi ou abrindo mão da qualidade e se contentando com áudios de 96kbps ou menos.</p>
<p style="text-align: justify;">O <a href="https://market.android.com/details?id=com.google.android.apps.listen" target="_blank">Listen</a> lhe permite baixar os arquivos de áudio para ouví-los posteriormente, quando quiser, sem a necessidade de conexão com a internet.</p>
<p style="text-align: justify;"><strong>Link para o aplicativo</strong>: <a href="https://market.android.com/details?id=com.google.android.apps.listen" target="_blank">Listen</a><br />
<strong>Preço</strong>: Gratuito<br />
<strong>Propaganda</strong>: Não<br />
<strong>Avaliação</strong>*: 3,8/5</p>
<h5 style="text-align: justify;">* Avaliação feita até a publicação deste post</h5>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/10/aplicativos-que-seu-android-precisa-ter-listen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compartilhando conexão 3G do Android com PCs ou Notebooks via USB</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/10/compartilhando-conexao-3g-do-android-com-pc-ou-notebook-via-usb/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/10/compartilhando-conexao-3g-do-android-com-pc-ou-notebook-via-usb/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 21:43:50 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Dispositivos]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[3g]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[conexão]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=389</guid>
		<description><![CDATA[O Froyo, versão 2.2 do Android, vem com um aplicativo padrão para compatilhamento da conexão 3G com outros dispositivos que<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/10/compartilhando-conexao-3g-do-android-com-pc-ou-notebook-via-usb/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">O Froyo, versão 2.2 do Android, vem com um aplicativo padrão para compatilhamento da conexão 3G com outros dispositivos que utilizem da tecnologia wi-fi. O problema surge quando você não dispõe de uma placa wi-fi, como é o caso da maioria esmagadores de desktops vendidos atualmente.</p>
<p style="text-align: justify;"><a href="https://market.android.com/details?id=com.proxoid&amp;feature=search_result" target="_blank">ProxoId</a>, aplicativo gratuito disponível no <a href="https://market.android.com/" target="_blank">Android Marketing</a>, lhe permite compartilhar a conexão 3G utilizando somente o cabo USB.</p>
<p style="text-align: justify;">O aplicativo precisa de um programa <em>stand alone</em> rodando no computador para funcionar e que os drivers para o Android estejam instalado neste mesmo equipamento.</p>
<p style="text-align: justify;">O driver, assim como o programa, pode ser encontrado em forma de arquivo ZIP para Windows 32bits <a href="http://www.baroukh.com/proxoid/proxoid-adb.zip" target="_blank">aqui</a> e para Windows 64 bits <a href="http://www.baroukh.com/proxoid/proxoid-adb64.zip">aqui</a>. Se você instalou os drivers que vêm no CD do fabricante, pule para o passo <strong>Reconhecendo o smartphone</strong>.</p>
<h2>Instalando os drivers</h2>
<p style="text-align: justify;">Descompacte o arquivo ZIP e conecte o aparelho ao computador. O assistente de novos dispositivos será aberto.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-397" title="assistente" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img1.png" alt="" width="503" height="390" /></p>
<p style="text-align: justify;">Escolha a opção &#8220;Não, não agora&#8221; e clique em &#8220;Avançar&#8221;. Na tela seguinte, escolha a opção &#8220;Instalar de uma lista ou local específico&#8221;.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-398" title="img2" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img2.png" alt="" width="503" height="390" /></p>
<p style="text-align: justify;">Habilite as opções &#8220;Procurar o melhor driver nestes locais&#8221; e &#8220;Incluir este local na pesquisa&#8221;, então clique em procurar.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-399" title="img3" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img3.png" alt="" width="503" height="390" /></p>
<p style="text-align: justify;">Na caixa de diálogo, selecione o diretório onde você descompactou o arquivo ZIP &gt; &#8220;usb_driver&#8221; &gt; &#8220;x86&#8243;, como na imagem.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-400" title="img4" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img4.png" alt="" width="325" height="318" /></p>
<p style="text-align: justify;">Clique em avançar e siga os passos até o fim da instalação.</p>
<h2>Reconhecendo o smartphone</h2>
<p style="text-align: justify;">Com o aparelho plugado, acesse o diretório &#8220;proxoid-adb&#8221; e execute o arquivo &#8220;check.bat&#8221;. Deverá aparecer a tela abaixo com o número do dispositivo.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-401" title="img5" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img5.png" alt="" width="500" height="206" /></p>
<p style="text-align: justify;">Caso não apareça, tente desconectar o aparelho e conectar novamente ou reinstalar os drivers.</p>
<h2>Configurando ProxoId</h2>
<p style="text-align: justify;">A tela de configuração é aberto quando o ProxoId é executado:<br />
&#8220;Start/Stop ProxoId&#8221; &#8211; Indica se o serviço está em execução (ticado) ou parado;<br />
&#8220;Port&#8221; &#8211; Número da porta para o proxy<br />
&#8220;User-Agent Filter&#8221; &#8211; Máscara do User-Agent (Browser).</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-402" title="proxoid" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img6.png" alt="" width="235" height="350" /></p>
<h2>Configurando Browser</h2>
<h4>Internet Explorer e Google Chrome</h4>
<p style="text-align: justify;"><strong></strong>Clique no menu &#8220;Iniciar&#8221; &gt; &#8220;Painel de Controle&#8221; e &#8220;Opções da Internet&#8221;. Clique na aba &#8220;Conexões&#8221; e no botão &#8220;Configurações da LAN&#8221;.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-403" title="img7" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img7.png" alt="" width="363" height="450" /></p>
<p style="text-align: justify;">No campo &#8220;Endereço&#8221;, digite &#8220;localhost&#8221; e no campo &#8220;Porta&#8221; digite o mesmo valor que está nas configurações do &#8220;ProxoId&#8221;.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-406" title="img10" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img10.png" alt="" width="384" height="338" /></p>
<h4>FireFox</h4>
<p style="text-align: justify;"><strong></strong>Abra o Firefox, clique no menu &#8220;Opções&#8221;. Selecione a guia &#8220;Avançado&#8221; &gt; &#8220;Rede&#8221; e clique no botão &#8220;Configurar Conexão&#8221;. Habilite a opção &#8220;Configuração manual de proxy.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-404" title="img8" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img8.png" alt="" width="450" height="416" /></p>
<p style="text-align: justify;">No campo &#8220;HTTP&#8221;, digite &#8220;localhost&#8221; e no campo &#8220;Porta&#8221; digite o mesmo valor que está nas configurações do &#8220;ProxoId&#8221;.</p>
<p style="text-align: center;"><img class="aligncenter" title="img9" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img9.png" alt="" width="376" height="400" /></p>
<h2>Compartilhando conexão</h2>
<p style="text-align: justify;">Habilite a opção &#8220;Start/Stop ProxoId&#8221; na aplicação do seu Android.<br />
No computador, abra o diretório &#8220;proxoid-adb&#8221; e execute o arquivo &#8220;start-tunnel.bat&#8221;.</p>
<p style="text-align: justify;">Pronto! Enquanto estiver usando estas configurações de proxy, todo o tráfego passa a ser disponibilizado pelo sinal 3G do seu aparelho!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/10/compartilhando-conexao-3g-do-android-com-pc-ou-notebook-via-usb/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Android 2.2 &#8211; Instalando aplicativos direto no cartão SD</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/09/android-2-2-instalando-aplicativos-direto-no-cartao-sd/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/09/android-2-2-instalando-aplicativos-direto-no-cartao-sd/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 21:37:20 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[memoria]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=357</guid>
		<description><![CDATA[Quem tem smartphones Android com pouca memória interna e vive baixando aplicativos, sabe como é frustrante quando aparece o ícone<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/09/android-2-2-instalando-aplicativos-direto-no-cartao-sd/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-359" style="margin-top: 5px; margin-bottom: 5px;" title="android_full" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/09/android_full.png" alt="" width="233" height="265" />Quem tem smartphones Android com pouca memória interna e vive baixando aplicativos, sabe como é frustrante quando aparece o ícone de &#8220;Pouco Espaço&#8221;.</p>
<p>No Android 2.2 existe a possibilidade de migrar o local de instalação dos aplicativos já instalados, porém, alguns não lhe dão a possibilidade de movê-los para o SD.</p>
<p>Atrás de soluções para resolver este probleminha no meu Motorola Milestone, encontrei um excelente tutorial no <a href="http://www.mundozoom.com.br/android-instalar-aplicativos-no-cartao-sd.html" target="_blank">Mundo Zoom</a> que ensina como instalar aplicativos direto no cartão SD, mesmos aqueles aplicativos que não permitem movê-los, sem a necessidade de ser usuário <em>root</em>.</p>
<p>Primeiro baixe, de preferência, o ZIP de <a href="http://developer.android.com/sdk/index.html" target="_blank">Android SDK</a> e extraia-o e, navegue até o diretório &#8220;<strong>android-sdk-windows\platform-tools</strong>&#8220;.</p>
<p>Configure seu aparelho para o modo debug. Não sabe? Vá em <strong>&#8220;Configurações&#8221; &gt; &#8220;Aplicativos&#8221; &gt; &#8220;Desenvolvimento&#8221;</strong> e ative a opção <strong>&#8220;Depuração USB&#8221;</strong>.</p>
<p>Conecte seu smartphone à porta USB e ative a opção &#8220;Nenhum&#8221; (ou &#8220;Somente carregar bateria&#8221;) no Gerenciador de Conexão USB.</p>
<p>Agora Abra o prompt de comando clicando no menu Iniciar, executar. Digite &#8220;cmd&#8221; (sem aspas) e pressione Enter.</p>
<p>Com o prompt e a janela do Windows Explorer abertos, clique no arquivo &#8220;adb.exe&#8221; e arraste para o prompt, em seguida dê um espaço e digite &#8220;shell&#8221;. Pressione Enter.</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/09/ss1.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-364 aligncenter" title="ss1" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/09/ss1.jpg" alt="" width="540" height="386" /></a></p>
<p>Deverá aparecer o símbolo &#8220;$&#8221; e o cursor piscando. Agora digite o comando &#8220;<strong>pm setInstallLocation 2</strong>&#8221; e pressione Enter.</p>
<p>Este comando define a partição &#8220;2&#8243;, que é o cartão SD, como local padrão para a instalação dos aplicativos.</p>
<p>Pronto, isto é tudo que você precisa para que, a partir de agora, os aplicativos sejam instalados direto no cartão SD.</p>
<p>Caso o procedimento não tenha dado certo, no site <a href="http://www.mundozoom.com.br/android-instalar-aplicativos-no-cartao-sd.html" target="_blank">Mundo Zoom</a> existem algumas soluções de problemas que podem te ajudar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/09/android-2-2-instalando-aplicativos-direto-no-cartao-sd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A importância de File.separator e File.pathSeparator</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/08/a-importancia-de-file-separator-e-file-pathseparator/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/08/a-importancia-de-file-separator-e-file-pathseparator/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 16:35:07 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=352</guid>
		<description><![CDATA[Quase todos os programadores Java conhecem os métodos citados no título, mas muito poucos se preocupam em utiliza-los. Estes dois<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/08/a-importancia-de-file-separator-e-file-pathseparator/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Quase todos os programadores Java conhecem os métodos citados no título, mas muito poucos se preocupam em utiliza-los.</p>
<p>Estes dois métodos servem para que o programador não precise &#8220;adivinhar&#8221; qual é o separador de arquivos e qual é o separador de caminhos em cada sistema operacional.</p>
<p>No Linux/Unix, os métodos <b><a href="http://download.oracle.com/javase/1,5.0/docs/api/java/io/File.html#separator">File.separator</a></b> e <b><a href="http://download.oracle.com/javase/1,5.0/docs/api/java/io/File.html#pathSeparator">File.pathSeparator</a></b> retornam &#8220;/&#8221; e &#8220;.&#8221; respectivamente, enquanto que, no Windows, estes mesmos métodos retornam &#8220;\&#8221; (ou &#8220;\\&#8221; &#8211; escape) e &#8220;;&#8221;.</p>
<p>Passei por um caso recente, onde o código abaixo lançava a <i>exception</i> FileNotFoundException no Linux, mas funcionava perfeitamente no Windows:</p>
<pre class="brush:java">
String caminhoAp = ctx.getRealPath();
String caminhoArq = caminhoAp + "\\" + "WEB-INF/classes/pacotes/da/minha/aplicacao/";

File arquivo = new File(caminhoArq, "relatorio.pdf");
OutputStream out = new FileOutputStream(arquivo);
...
</pre>
<p>Então passou a funcionar nos dois sistemas operacionais após substituir &#8220;\\&#8221; por File.separator na linha 2, desta forma:</p>
<pre class="brush:java">
String caminhoAp = ctx.getRealPath();
String caminhoArq = caminhoAp + File.separator + "WEB-INF/classes/pacotes/da/minha/aplicacao/";

File arquivo = new File(caminhoArq, "relatorio.pdf");
OutputStream out = new FileOutputStream(arquivo);
...
</pre>
<p>A utilização destes métodos, além de ser uma boa prática, é muito útil quando se tem a mesma versão de um sistema feito em Java rodando de diferentes sistemas operacionais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/08/a-importancia-de-file-separator-e-file-pathseparator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplicativos que seu Android precisa ter &#8211; RemoteControl for Earphones</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/08/aplicativos-que-seu-android-precisa-ter-remotecontrol-for-earphones/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/08/aplicativos-que-seu-android-precisa-ter-remotecontrol-for-earphones/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 01:59:34 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[aplicativos]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[market]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=342</guid>
		<description><![CDATA[Resolvi iniciar uma seção no site chamada &#8220;Aplicativos que seu Android precisa ter&#8221;, nesta seção publicarei dicas e &#8220;reviews&#8221; de<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/08/aplicativos-que-seu-android-precisa-ter-remotecontrol-for-earphones/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Resolvi iniciar uma seção no site chamada &#8220;Aplicativos que seu Android precisa ter&#8221;, nesta seção publicarei dicas e &#8220;<em>reviews</em>&#8221; de aplicativos úteis que ajudarão a extrair todo o potencial de seu Smartphone Android.</p>
<p>Começarei com o <strong>RemoteControl for Earphones</strong>, pois ele simplesmente acaba com uma vantagem enorme que o iPhone possuía sobre o Android, que é o controle do player de música através de comandos no botão do fone de ouvido.</p>
<p>O comportamento padrão do botão de lapela da maioria dos Smartphones com Android é pausar e tocar músicas, além de atender ligações. O <strong>RemoteControl for Earphones</strong> possibilita que você use quase todos os comandos do player padrão apenas com este botão. Por exemplo, para dar <em>play</em> ou <em>pause</em> em uma música, basta apertar o botão uma vez, para ir para a próxima música, basta apertar duas vezes, para voltar, quatro vezes e por aí vai.</p>
<div class="wp-caption aligncenter" style="width: 212px"><a href="https://www.gstatic.com/android/market/jp.co.chobirich.tools.mediabutton/ss-480-1-6"><img src="https://www.gstatic.com/android/market/jp.co.chobirich.tools.mediabutton/ss-480-1-6" alt="RemoteControl for Earphones" width="202" height="336" /></a><p class="wp-caption-text">Tela do aplicativo (Android Market)</p></div>
<p>O aplicativo é gratuito e, ao contrário de quase todos os aplicativos gratuitos encontrados no Android Market, não possui aquelas propagandas chatas.</p>
<p>O único problema é que ele não é compatível com todos os players, funcionou perfeitamente no player padrão do Motorola Milestone e Songbird, porém não funcionou no Winamp, no player padrão do Motorola Atrix e do Samsung Galaxy S.</p>
<p><strong>Link para o aplicativo</strong>:  <a href="https://market.android.com/details?id=jp.co.chobirich.tools.mediabutton&amp;feature=search_result" target="_blank">RemoteControl for Earphones</a><br />
<strong>Preço</strong>: Gratuito<br />
<strong>Propaganda</strong>: Não</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/08/aplicativos-que-seu-android-precisa-ter-remotecontrol-for-earphones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como recuperar e escrever campos CLOB</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/05/como-recuperar-e-escrever-campos-clob/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/05/como-recuperar-e-escrever-campos-clob/#comments</comments>
		<pubDate>Fri, 13 May 2011 17:01:25 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[clob]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=285</guid>
		<description><![CDATA[O Character Large Object (ou CLOB), como o próprio nome já diz, é um tipo de campo muito comum em<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/05/como-recuperar-e-escrever-campos-clob/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>O <em>Character Large Object</em> (ou CLOB), como o próprio nome já diz, é um tipo de campo muito comum em Bancos de Dados usado para armazenar textos com uma quantidade enorme de caracteres.</p>
<p>No MySQL, por exemplo, o tipo CLOB está descrito como MEMO, mas a função é a mesma.</p>
<p>Estes dias precisei recuperar um valor de um campo CLOB que era retornado por um <em>SELECT</em>, como nunca tinha utilizado este campo no Java, resolvi escrever este pequeno tutorial como um memorando e, também, ajudar a quem precisar.</p>
<h4>Escrevendo valores em campo CLOB</h4>
<p>O método do <em>PreparedStatement</em> utilizado para a gravação de um CLOB é o <em>setAsciiStream</em>, passando a posição do campo CLOB, o <em>InputStream </em>dos dados e o ponto final de leitura do <em>InputStream.</em></p>
<pre class="brush:sql">ps.setAsciiStream(posicaoClob, inputStream, tamanhoDoTexto);</pre>
<p><strong>Exemplo funcional:</strong></p>
<pre class="brush:java">String sql = "INSERT INTO TESTE (texto) VALUES(?)";
		try{
			String txt = leArquivoTxt();
			ByteArrayInputStream bais = new ByteArrayInputStream(txt.getBytes());

			PreparedStatement ps = conexao.prepareStatement(sql);
			//Campo CLOB é a '?' que está na posição 1 do INSERT
			ps.setAsciiStream(1, bais, txt.length());

			ps.execute();

			ps.close();
		}catch (Exception e) {
			e.printStackTrace();
		}</pre>
<h4>Recuperando valor de um campo CLOB</h4>
<p>Como executamos um <em>SELECT</em>, será necessário capturar o <em>ResultSet </em>, iterar as linhas e chamar o método para a recuperação de um CLOB é o <em>getClob</em>, passando a posição em que o campo se encontra na query ou, simplesmente, o nome da coluna.</p>
<pre class="brush:sql">rs.getClob("xml");</pre>
<p><strong>Exemplo funcional:</strong></p>
<pre class="brush:java">String sql = "SELECT xml FROM TESTE";
		try{
			PreparedStatement ps = conexao.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();

			while(rs.next()){
				Clob clob = rs.getClob("xml");
				BufferedReader reader = new BufferedReader(clob.getCharacterStream());
				StringBuffer strBuf = new StringBuffer();

				String linha = null;
				while((linha = reader.readLine()) != null){
					strBuf.append(linha);
//Character.LINE_SEPARATOR insere a quebra de linha
					strBuf.append((char)Character.LINE_SEPARATOR);
				}

				System.out.println("=========== CLOB ===========");
				System.out.println(strBuf.toString());
			}

			rs.close();
			ps.close();
		}catch (Exception e) {
			e.printStackTrace();
		}</pre>
<p>É isso aí. Simples, fácil e indolor. <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Caso queiram, podem baixar a aplicação de exemplo <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=6" title="clicado 148 vezes">aqui</a></p>
<p>Para recuperar um campo BLOB veja este <a href="http://www.andrels.com/wp-pt_BR/index.php/2010/02/inserindo-arquivos-em-campos-blob-de-uma-base-de-dados/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">tópico</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/05/como-recuperar-e-escrever-campos-clob/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando aplicativos .apk no emulador do Android SDK</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/02/instalando-aplicativos-apk-no-emulador-do-android-sdk/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/02/instalando-aplicativos-apk-no-emulador-do-android-sdk/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 15:30:44 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[apk]]></category>
		<category><![CDATA[emulador]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[sdk]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=277</guid>
		<description><![CDATA[Algumas vezes dependemos de aplicações de terceiros para testar se nossa aplicação está funcionando corretamente ou, simplesmente, acessar recursos do<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/02/instalando-aplicativos-apk-no-emulador-do-android-sdk/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes dependemos de aplicações de terceiros para testar se nossa aplicação está funcionando corretamente ou, simplesmente, acessar recursos do emulador que não estão disponíveis nas ferramentas que o acompanham.</p>
<p>Nos diretórios de instalação do SDK, geralmente em <em>platform-tools</em>, existe um executável chamado <strong>adb</strong>, através dele instalaremos aplicações de terceiros.</p>
<p>Antes de mais nada, você precisará do pacote de instalação do aplicativo (.apk). Para isso, procure em sites de busca ou faça backup através de seu aparelho Android usando aplicativos com o <a title="AppSaver" href="https://market.android.com/details?id=com.IQBS.android.appSaver&amp;feature=search_result">AppSaver</a>.</p>
<p>- Inicie o emulador, podendo ser pelo SDK Manager ou pelo plugin do Android no Eclipse.</p>
<p>- Através do prompt do DOS (Windows) ou de um terminal (Linux), acesse o diretório <em>platform-tools</em>, e execute a linha de comando:</p>
<pre class="brush:bash">$ adb install &lt;caminho do arquivo .apk&gt;</pre>
<p>Você verá a mensagem:</p>
<pre class="brush:bash">$ adb install Aplicativo.apk
125 KB/s (1091937 bytes in 8.474s)
        pkg: /data/local/tmp/Aplicativo.apk
Success</pre>
<p>Agora o aplicativo estará disponível no menu do emulador, como se estivesse instalado no seu smartphone. <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/02/instalando-aplicativos-apk-no-emulador-do-android-sdk/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>INNER JOIN e OUTER JOIN</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/07/inner-join-e-outer-join/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/07/inner-join-e-outer-join/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 14:02:17 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[inner join]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[outer join]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sql server]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=244</guid>
		<description><![CDATA[Se você é um DBA ou trabalha com programação e usa muito banco de dados SQL, este tópico não é<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/07/inner-join-e-outer-join/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Se você é um DBA ou trabalha com programação e usa muito banco de dados SQL, este tópico não é você, a menos que não conheça as cláusulas INNER JOIN e OUTER JOIN, muito comuns em SGBDs SQL.</p>
<p style="text-align: justify;">Não sabe o que é SGBD? Os <strong>S</strong>istemas de <strong>G</strong>erenciamento de <strong>B</strong>anco de <strong>D</strong>ados são programas que auxiliam na manipulação dos dados armazenados. O MySQL, PostgreSQL, MS SQL Server ou Oracle, que você tem em sua casa ou empresa, são SGBDs.</p>
<p style="text-align: justify;">Para este tutorial você precisa ter, pelo menos, o conhecimento básico de SQL.</p>
<p style="text-align: justify;">Chega de enrolação, vamos ao que interessa!</p>
<h4>INNER JOIN</h4>
<p style="text-align: justify;">A cláusula INNER JOIN é usada quando se quer recuperar dados em mais de uma tabela através da igualdade de suas <em>foreign keys</em>.</p>
<p style="text-align: justify;">Por exemplo, pense que você quer criar um programa que sirva como agenda telefônica. Você cadastra as pessoas e os contatos telefônicos, como uma pessoa poderá ter nenhum até N números de telefones, você separa em duas entidades como neste modelo:<br />
<img class="aligncenter size-full wp-image-247" title="post - ptg" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/07/post-ptg.jpg" alt="" width="197" height="249" /></p>
<p style="text-align: justify;">Olhando rapidamente você percebe que a entidade TELEFONE tem o atributo <strong>NUM_PESSOA</strong> que é o número de identificação do registro na entidade PESSOA.</p>
<p style="text-align: justify;">Vamos supor que as tabelas estejam preenchidas com os seguintes registros:</p>
<pre> +----------------------------+  +---------------------------+
 |           PESSOA           |  |         CONTATO           |
 +------------+---------------+  +------------+--------------+
 | NUM_PESSOA | NOME_PESSOA   |  | NUM_PESSOA | NUM_TELEFONE |
 | 1          | José          |  | 1          | 6589-3666    |
 | 2          | Arnaldo       |  | 3          | 9888-6699    |
 | 3          | Maria         |  | 3          | 8956-6666    |
 | 4          | Elverdelando  |  | 2          | 2888-9877    |
 +------------+---------------+  +------------+--------------+</pre>
<p style="text-align: justify;">Para recuperar os telefones de uma pessoa você deve usar INNER JOIN, implicitamente ou explicitamente. Vou explicar os dois casos.</p>
<p style="text-align: justify;">O método <strong>explícito</strong> é usar a cláusula explicitamente (duh!), que é formada por <strong>INNER JOIN </strong><em>&lt;tabela filha&gt;</em><strong> ON </strong><em>&lt;atributos de identificação&gt;</em>, no nosso exemplo:</p>
<pre class="brush:sql">SELECT nome_completo, num_telefone FROM pessoa INNER JOIN telefone <strong>ON</strong> pessoa.num_pessoa = telefone.num_pessoa</pre>
<p style="text-align: justify;">Estamos dizendo: &#8220;me traga o nome e os números dos telefones da pessoa onde o número da pessoa em TELEFONE seja igual ao número da pessoa em PESSOA&#8221;.</p>
<p style="text-align: justify;">Na forma <strong>implícita</strong> você não usa a cláusula INNER JOIN, o tratamento de igualdade é feito na cláusula <strong>WHERE</strong>. Usando o mesmo exemplo:</p>
<pre class="brush:sql">SELECT nome_completo, num_telefone FROM pessoa, telefone WHERE pessoa.num_pessoa = telefone.num_pessoa</pre>
<p style="text-align: justify;">Em ambos os casos o resultado será:</p>
<pre> +---------------------------+
 |         CONTATO           |
 +------------+--------------+
 | NOM_PESSOA | NUM_TELEFONE |
 | José       | 6589-3666    |
 | Maria      | 9888-6699    |
 | Maria      | 8956-6666    |
 | Arnaldo    | 2888-9877    |
 +------------+--------------+</pre>
<p style="text-align: justify;">&#8220;Que simples! Hummmm espera um pouco&#8230; Onde está o Elverdelando (que nominho, hein?!).&#8221;</p>
<p style="text-align: justify;">Lembra que dissemos ao banco &#8220;me traga o nome e os números dos telefones da pessoa onde o número da pessoa em TELEFONE seja igual ao número da pessoa em PESSOA&#8221;? Então! O Elverdelando não esta na tabela TELEFONE, por isso não foi retornado no resultado.</p>
<p style="text-align: justify;">Quando você precisar retornar os dados, mesmo não estando na tabela filha, usamos o <strong>OUTER JOIN</strong>.</p>
<h4>OUTER JOIN</h4>
<p style="text-align: justify;">A clásula OUTER JOIN tem duas variantes, <strong>LEFT OUTER JOIN</strong> e <strong>RIGHT OUTER JOIN</strong>, sendo que estas cláusula devem ser declaradas sempre de maneira explícita. Alguns SGBDs facilitam a utilização do OUTER JOIN te polpando de declarar toda a sintaxe, como é o caso do Oracle que utiliza o símbolo <strong>(+)</strong> na identificação fraca, mas <strong>NÃO É ANSI</strong>, ou seja, não funcionará em qualquer SGBD.</p>
<p style="text-align: justify;">Para que apareçam todas as pessoas, inclusive as que não têm número de telefone cadastrado usamos <strong>LEFT OUTER JOIN</strong> ou <strong>RIGHT OUTER JOIN</strong>.</p>
<p style="text-align: justify;">A sintaxe é parecida com a INNER JOIN, mudando apenas o nome da cláusula: <strong>LEFT[RIGHT] OUTER JOIN </strong><em>&lt;tabela filha&gt;</em><strong> ON </strong><em>&lt;atributos de identificação&gt;;</em></p>
<p style="text-align: justify;">Assim, faremos&#8230;</p>
<pre class="brush:sql">SELECT nome_completo, num_telefone FROM pessoa LEFT OUTER JOIN telefone ON pessoa.num_pessoa = telefone.num_pessoa</pre>
<p>ou então</p>
<pre class="brush:sql">SELECT nome_completo, num_telefone FROM telefone RIGHT OUTER JOIN pessoa ON pessoa.num_pessoa = telefone.num_pessoa</pre>
<p style="text-align: justify;">Em ambos os casos o resultado será:</p>
<pre> +-----------------------------+
 |         CONTATO             |
 +--------------+--------------+
 | NOM_PESSOA   | NUM_TELEFONE |
 | José         | 6589-3666    |
 | Maria        | 9888-6699    |
 | Maria        | 8956-6666    |
 | Arnaldo      | 2888-9877    |
 | Elverdelando |              |
 +--------------+--------------+</pre>
<p style="text-align: justify;">Como você pôde perceber, a única diferença entre o <strong>LEFT OUTER JOIN</strong> e o <strong>RIGHT OUTER JOIN</strong> é só a indicação de qual é o lado forte do relacionamento, ou seja, em qual lado da cláusula está a tabela que pode não ter valores na tabela filha. No nosso caso, ambos apontando para a tabela PESSOA.</p>
<p style="text-align: justify;"><em>INNER JOIN</em> é muito usado para consulta em banco de dados, quase que totalmente em seu método implícito. Já as cláusulas <em>OUTER JOIN</em> também são usadas, mas não com tanta frequência, posso dizer que é raro encontra-las por aí.</p>
<p style="text-align: justify;">Espero que este tutorial os ajude! <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/07/inner-join-e-outer-join/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurando acesso à internet via proxy em aplicações Java</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/03/configurando-acesso-a-internet-via-proxy-em-aplicacoes-java/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/03/configurando-acesso-a-internet-via-proxy-em-aplicacoes-java/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 01:35:42 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[prompt]]></category>
		<category><![CDATA[proxy]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=186</guid>
		<description><![CDATA[Hoje tive um problema no meu trabalho onde um client, que roda via prompt de comando (Prompt do DOS), não<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/03/configurando-acesso-a-internet-via-proxy-em-aplicacoes-java/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Hoje tive um problema no meu trabalho onde um client, que roda via prompt de comando (Prompt do DOS), não conseguia acessar o servidor hospedado na internet, isso porque a empresa onde trabalho utiliza proxy.</p>
<p>Depois de algumas tentativas acabei achando duas soluções para resolver o problema de acesso: a primeira foi passar como parâmetros <em>Java</em> as configurações do proxy.</p>
<pre class="brush:shell">$ java -Dhttp.proxyHost=serv -Dhttp.proxyPort=porta -Dhttp.proxyUser=usu -Dhttp.proxyPassword=senha ClasseJava
</pre>
<p><strong>-Dhttp.proxyHost</strong> = IP ou nome do servidor proxy<br />
<strong>-Dhttp.proxyPort</strong> = Porta do proxy<br />
<strong>-Dhttp.proxyUser</strong> = Usuário<br />
<strong>-Dhttp.proxyPassword</strong> = Senha</p>
<p>Desta forma a classe <i>ClasseJava</i> terá acesso à internet através do proxy.</p>
<p>A outra forma foi inserir as configurações na própria classe:</p>
<pre class="brush:java">
public static void main(String[] args){
...
System.getProperties().put("proxySet", "true");
System.getProperties().put("http.proxyHost", "serv");
System.getProperties().put("http.proxyPort", "porta");
System.getProperties().put("http.proxyUser", "usuario");
System.getProperties().put("http.proxyPassword", "senha");
...
}
</pre>
<p><strong>proxySet</strong> = Define se passará ou não por um servidor proxy<br />
<strong>http.proxyHost</strong> = IP ou nome do servidor proxy<br />
<strong>http.proxyPortt</strong> = Porta do proxy<br />
<strong>http.proxyUse</strong> = Usuário<br />
<strong>http.proxyPassword</strong> = Senha</p>
<p>Usando um destes recursos você poderá configurar sua aplicação para acessar à internet através de um proxy.</p>
<p>Espero ter ajudado. Até +! <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/03/configurando-acesso-a-internet-via-proxy-em-aplicacoes-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Criando janelas transparentes e com formas usando Java Swing/AWT</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/03/criando-janelas-transparentes-e-com-formas-usando-java-swingawt-2/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/03/criando-janelas-transparentes-e-com-formas-usando-java-swingawt-2/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 22:40:50 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[awt]]></category>
		<category><![CDATA[janela]]></category>
		<category><![CDATA[jframe]]></category>
		<category><![CDATA[swing]]></category>
		<category><![CDATA[transparencia]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=168</guid>
		<description><![CDATA[O AWT nos oferece uma gama de possibilidades quando falamos sobre manipulação de janelas. Hoje falarei sobre duas destas possibilidades<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/03/criando-janelas-transparentes-e-com-formas-usando-java-swingawt-2/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>O AWT nos oferece uma gama de possibilidades quando falamos sobre manipulação de janelas. Hoje falarei sobre duas destas possibilidades com a classe AWTUtilities.</p>
<h3></h3>
<h3><strong>Deixando a janela transparente</strong></h3>
<p>Para deixar uma <strong>Window</strong> (JFrame, JDialog e etc) transparente,  você deve usar o método <strong>AWTUtilities.setWindowOpacity</strong>. Este método recebe como parâmetro a janela que deve ser alterada e o grau de transparência, que varia entre 0 (zero) e 1, sendo 0 (zero) invisível e 1 totalmente visível.</p>
<pre class="brush:java">JFrame  window = new JFrame("Minha janela");

//70% de transparência
AWTUtilities.setWindowOpacity(window, .7f);
window.setSize(800,600);
window.setVisible(true);
</pre>
<p>O resultado será:<a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/03/2.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-174" title="2" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/03/2.jpg" alt="" width="480" height="368" /></a></p>
<h3><strong>Alterando a forma da janela</strong></h3>
<p>Para alterar a forma da janela você deve usar o método <strong>AWTUtilities.setWindowShape</strong>. Este método recebe como parâmetro a janela que deve ser alterada e a forma (java.awt.Shape) que a janela deverá assumir.</p>
<p>A forma mais eficiente de usar este método é através do <em>componentResized()</em>, pois você poderá recalcular o tamanho da janela para não deforma-la ou não perder os componentes de vista.</p>
<p>Aqui deixaremos nossa janela com a forma de um triângulo com 70% de transparência.</p>
<pre class="brush:java">final JFrame  window = new JFrame("Minha janela");

try {
	//Adicionando o ComponentListener responsável pelo componentResized
	window.addComponentListener(new ComponentAdapter(){
		@Override
		//implementando o método componentResized
		public void componentResized(ComponentEvent e) {
			int[] x = {0,400,800}; //Pontos X do polígono
			int[] y = {600,0,600}; //Pontos Y do polígono

			//Criaremos um triângulo de 800 x 600
			Shape shape = new Polygon(x, y, 3);

			AWTUtilities.setWindowShape(window, shape);

			//com transparência de 70%
			AWTUtilities.setWindowOpacity(window, 0.7f);
		}
	});
} catch (SecurityException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (IllegalArgumentException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

window.setUndecorated(true); //removendo barra de título
window.setSize(800,600);
window.setVisible(true);
</pre>
<p>Repare que invoquei o método <strong><em>setUndecorated( )</em></strong> passando o valor <em>true</em>, este método é responsável por ocultar a barra de título (aquele com o ícone e os botões de maximizar, minimizar e fechar) que, se estiver visível, o método <em>AWTUtilities.setWindowShape( </em>) não surtirá efeito.</p>
<p>O resultado:<a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/03/1.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-175" title="1" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/03/1.jpg" alt="" width="480" height="365" /></a></p>
<p>Espero que tenham gostado e até a próxima!</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 618px; width: 1px; height: 1px; overflow: hidden;">
<pre class="brush:java">//Pontos X do polígono</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/03/criando-janelas-transparentes-e-com-formas-usando-java-swingawt-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Inserindo arquivos em campos BLOB de uma base de dados</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/02/inserindo-arquivos-em-campos-blob-de-uma-base-de-dados/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/02/inserindo-arquivos-em-campos-blob-de-uma-base-de-dados/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 16:39:03 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[arquivo]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=157</guid>
		<description><![CDATA[Para inserir um arquivo, seja ele de qualquer formato, é necessário utilizar o método setBinaryStream implementado pelo PreparedStatement. PreparedStatemente.setBinaryStream(int índice,<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/02/inserindo-arquivos-em-campos-blob-de-uma-base-de-dados/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Para inserir um arquivo, seja ele de qualquer formato, é necessário utilizar o método <em>setBinaryStream</em> implementado pelo PreparedStatement.</p>
<pre class="brush:java">
PreparedStatemente.setBinaryStream(int índice, Inputstream is, int tamanho);
</pre>
<p>Para o exemplo definimos uma tabela chamada <i>arquivo</i> que contém um campo <b>BLOB</b> chamado <i>ARQ</i>.</p>
<pre class="brush:java">
//Conexão normal, como qualquer JDBC
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@&lt;IP&gt;:&lt;PORTA&gt;:&lt;SID>","&lt;USUARIO&gt;","&lt;SENHA&gt;");

//Acessando o arquivo a ser enviado e recuperando um InputStream
File arquivo = new File("&lt;CAMINHO_COMPLETO_DO_ARQUIVO&gt;");
FileInputStream fis = new FileInputStream(arquivo);

//Preparando a chamada normalmente
PreparedStatement ps = conn.prepareStatement("INSERT INTO ARQUIVO (arq) VALUES(?)");

//Informando o inputstream e o tamanho do arquivo a ser enviado
ps.setBinaryStream(1, fis, (int)arquivo.length());

ps.execute();

ps.close();
conn.close();
</pre>
<p>No meu teste utilizei a base de dados Oracle 8i. Como não tenho à disposição uma base MySQL/PostgreSQL/MS SQL Server, deixo vocês encarregados de testar e me enviar os resultados, OK? <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>[]&#8216;s e até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/02/inserindo-arquivos-em-campos-blob-de-uma-base-de-dados/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Recuperando cursor de uma procedure do Oracle no Java</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/01/recuperando-cursor-de-uma-procedure-do-oracle-no-java/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/01/recuperando-cursor-de-uma-procedure-do-oracle-no-java/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 01:07:32 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=145</guid>
		<description><![CDATA[Percebi que muitas pessoas acabam chegando aqui pesquisando uma forma de recuperar cursores através de procedures do Oracle, para estas<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/01/recuperando-cursor-de-uma-procedure-do-oracle-no-java/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Percebi que muitas pessoas acabam chegando aqui pesquisando uma forma de recuperar cursores através de <em>procedures</em> do Oracle, para estas pessoas eu coloco à disposição uma maneira de fazê-lo.</p>
<p>Para que o cursor possa ser retornado é preciso declara-lo como <em>REF CURSOR</em> no <em>spec</em> da <em>Package</em>.</p>
<pre class="brush:sql">  --Criando o tipo REF CURSOR que será o cursor
  type g_cursor is ref cursor;</pre>
<p>Em ambos, <em>spec</em> e <em>body</em>, você precisa declarar uma variável <em>out</em> do tipo do <em>REF CURSOR</em> mencionado acima.</p>
<pre class="brush:sql">  procedure PRO_RETORNA_LISTA_CARROS(
    i_id     in     tbl_car.car_id%type,
    o_cursor in out g_cursor);</pre>
<p>Para devolver o cursor com os resultados (caso haja), é necessário abri-lo no <em>body</em> da <em>procedure</em>, desta forma:</p>
<pre class="brush:sql">open o_cursor for
          select car_id, company, model, color, hp, price
          from tbl_car
          where car_id = i_id;</pre>
<p>A <em>Package</em> completa ficará assim:</p>
<pre class="brush:sql">create or replace package PAC_CURSOR is
  --Criando o tipo REF CURSOR que será o cursor
  type g_cursor is ref cursor;

  --Procedure que retornará o cursor
  procedure PRO_RETORNA_LISTA_CARROS(
    i_id     in     tbl_car.car_id%type,
    o_cursor in out g_cursor); -- Nosso cursor

end PAC_CURSOR;
/

create or replace package body PAC_CURSOR is
  procedure PRO_RETORNA_LISTA_CARROS(
    i_id     in     tbl_car.car_id%type,
    o_cursor in out g_cursor) is

       begin
        --Abrindo o cursor para retornar os valores
        open o_cursor for
          select car_id, company, model, color, hp, price
          from tbl_car
          where car_id = i_id;

  end PRO_RETORNA_LISTA_CARROS;

end PAC_CURSOR;</pre>
<p>Temos o lado do Oracle pronto, agora precisamos tratar a chamada no Java.</p>
<p>Como o cursor está sendo retornado por uma <em>procedure</em>, usaremos um <em>java.sql.CallableStatement</em>.</p>
<pre class="brush:java">CallableStatement cs = conn.prepareCall("{call PAC_CURSOR.PRO_RETORNA_LISTA_CARROS(?,?)}");</pre>
<p>O <em>registerOutParameter</em> receberá o tipo <em>oracle.jdbc.OracleTypes.CURSOR</em> e retornará um <em>java.sql.ResultSet</em>. Iteraremos o ResultSet do mesmo modo que iteramos um Iterator.<br />
Cada coluna retornada pelo <em>SELECT</em> será representado como um mapa, usando o <em>getter</em> correpondente. Por exemplo, chamaremos o método <em>getString(&lt;nome coluna&gt;)</em> quando retornar um <em>varchar</em>, <em>getDate(&lt;nome coluna&gt;)</em> quando retornar um <em>date</em> e etc.</p>
<p>O código completo fica assim:</p>
<pre class="brush:java">//Chamando o procedure
CallableStatement cs = conn.prepareCall("{call PAC_CURSOR.PRO_RETORNA_LISTA_CARROS(?,?)}");

//Definindo o tipo do retorno, no caso o cursor
cs.registerOutParameter("o_cursor", OracleTypes.CURSOR);
cs.setLong("i_id", id);

cs.execute();//Executando a chamada

//Recuperando o cursor como um Resultset
ResultSet rs = (ResultSet)cs.getObject("o_cursor");

//Iterando as linhas retornadas
while(rs.next()){
	//Obtendo o valor das colunas
	System.out.println("ID: " + rs.getLong("car_id"));
	System.out.println("Marca: " + rs.getString("company"));
	System.out.println("Modelo: " + rs.getString("model"));
	System.out.println("Cor: " + rs.getString("color"));
	System.out.println("HP: " + rs.getString("hp"));
	System.out.println("Preco: " + rs.getFloat("price"));
}</pre>
<p>No final você conseguirá obter qualquer valor retornado em um <em>SELECT</em>.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/01/recuperando-cursor-de-uma-procedure-do-oracle-no-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Gerando &#8216;EXE&#8217; para iniciar suas aplicações Java</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/10/gerando-exe-para-iniciar-suas-aplicacoes-java/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/10/gerando-exe-para-iniciar-suas-aplicacoes-java/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 01:25:19 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[exe]]></category>
		<category><![CDATA[jsmooth]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=117</guid>
		<description><![CDATA[Percebi que muitos desenvolvedores precisam, ou já precisaram, distribuir suas aplicações Java de forma que os usuários de Windows pudessem<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/10/gerando-exe-para-iniciar-suas-aplicacoes-java/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Percebi que muitos desenvolvedores precisam, ou já precisaram, distribuir suas aplicações Java de forma que os usuários de Windows pudessem iniciá-las naturalmente, sem a necessidade de chamar o comando <em>java -jar &lt;arquivo jar&gt;</em> ou executar um arquivo .BAT.</p>
<p>Eu, que também já passei por isso, encontrei um solução fácil e com muitos recursos: <a href="http://jsmooth.sourceforge.net/" target="_blank">JSmooth</a>.</p>
<p>Este programinha possibilita que você &#8220;transforme&#8221; seu JAR em um executável (EXE), mas claro, ainda sim você precisará ter o JVM instalado no micro que rodará o executável.</p>
<p>Aqui só destacarei as configurações que considero relevantes, então vamos ao que interessa!</p>
<hr />Baixe o JSmooth em <a href="http://sourceforge.net/projects/jsmooth/files/" target="_blank">http://sourceforge.net/projects/jsmooth/files/</a>;</p>
<p>Após instalá-lo (ou descompactá-lo, depende do arquivo que você baixou) execute-o;</p>
<p>No menu lateral, clique em &#8220;<em>Skeleton</em>&#8220;;</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/1.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-119 aligncenter" title="1" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/1.jpg" alt="1" width="524" height="364" /></a></p>
<p>No &#8220;<em>Skeleton Selection</em>&#8221; você informa como a aplicação será executada, aqui selecionaremos <em>Window Wrapper</em>.</p>
<p>No &#8220;<em>Skeleton Properties</em>&#8221; você define uma mensagem caso o usuário não tenha o JVM instalador (<em>Message</em>) e onde ele poderá baixá-lo (<em>URL</em>).</p>
<p>&#8220;<em>Launch java app in the exe process</em>&#8221; indica se o JAR será executado no mesmo processo do EXE, aparecendo somente o executável no Gerenciador de Tarefas do Windows, caso contrário também será o processo <em>javaw.exe</em>.</p>
<p>&#8220;<em>Single Instance&#8221; </em>define se você ser aberto mais de uma instância.</p>
<p>&#8220;<em>Debug Console</em>&#8221; executa o EXE em uma janela do prompt de comando, exibindo os possíveis <em>Stacktraces </em>gerados pela aplicação.</p>
<p>Agora clique em &#8220;<em>Executable</em>&#8221;</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/2.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-120" title="2" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/2.jpg" alt="2" width="524" height="364" /></a></p>
<p>Em &#8220;<em>Executable Settings</em>&#8221; você informa onde o EXE será gerado (&#8220;<em>Executable Binary</em>&#8220;), o ícone do EXE (&#8220;<em>Executable Icon</em>&#8220;) e qual será o diretório de execução da aplicação.</p>
<p>Clique em &#8220;<em>Application</em>&#8221;</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/3.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-121" title="3" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/3.jpg" alt="3" width="524" height="364" /></a></p>
<p>Primeiro, clique no ícone <img class="size-full wp-image-125 alignnone" title="7" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/7.jpg" alt="7" width="50" height="27" /> e selecione o JAR que contém a classe principal (que contém o método <em>main</em>).</p>
<p>Em seguida, selecione a classe no campo &#8220;<em>Main Class</em>&#8221; clicando no botão <img class="alignnone size-full wp-image-126" title="8" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/8.jpg" alt="8" width="39" height="20" />.</p>
<p>O campo &#8220;<em>Application arguments</em>&#8221; você passa os parâmetros necessário para a sua classe.</p>
<p>&#8220;<em>Embedded JAR</em>&#8221; possibilita que você integre seu JAR no EXE, ou seja, não será necessário ter os dois arquivos, pois o EXE descompactará o JAR a cada execução.</p>
<p>Agora, clique em &#8220;<em>JVM Selection</em>&#8220;.</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/4.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-122" title="4" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/4.jpg" alt="4" width="524" height="364" /></a></p>
<p>Aqui você pode definir qual versão, mínima (&#8220;<em>Minimum JVM Version</em>&#8220;) e máxima (&#8220;<em>Maximum JVM Version</em>&#8220;), da virtual machine  rodará sua aplicação.</p>
<p>O&#8221;<em>JVM Search Sequence</em>&#8221; indica a ordem de busca do arquivo <em>javaw</em>.<em>exe</em>, neste caso ele procurará primeiro no registro, depois no diretório informado na variável de ambiente &#8220;JAVA_HOME&#8221; e assim por diante.</p>
<p>E então clique em &#8220;<em>JVM Configuration</em>&#8221;</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/5.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-123" title="5" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/5.jpg" alt="5" width="524" height="364" /></a></p>
<p>Aqui você informa a quantidade máxima de memória que sua aplicação poderá usar (&#8220;<em>Maximum Memory</em>&#8220;), quanta memória será alocada para sua aplicação assim que ela iniciar (&#8220;<em>Initial Memory Allocation</em>&#8220;) e os argumentos que será passado à JVM para sua aplicação.</p>
<p>Até este ponto você somente configurou o JSmooth, mas ainda não temos o EXE. Para isso, clique no botão <img class="size-full wp-image-124 alignnone" title="6" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/6.jpg" alt="6" width="32" height="30" />, caso você ainda não tenha salvo o projeto será aberta uma janela para escolher o local de salvamento do arquivo. Feito isso, o EXE será gerado no diretório indicado no campo &#8220;<em>Executable Binary</em>&#8221; da tela &#8220;<em>Executable</em>&#8220;.</p>
<p>Agora é só dar um duplo clique no arquivo EXE e aplicação iniciará!</p>
<p style="text-align: left;">
<p>Para mais informações acessem <a href="http://jsmooth.sourceforge.net/" target="_blank">http://jsmooth.sourceforge.net/</a></p>
<p style="text-align: left;">
<p style="text-align: left;">Espero que tenham gostado, comentem à vontade!</p>
<p style="text-align: left;">Até mais! <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/10/gerando-exe-para-iniciar-suas-aplicacoes-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Recuperando coleção de objetos de uma procedure Oracle</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/09/recuperando-colecao-de-objetos-de-uma-procedure-oracle/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/09/recuperando-colecao-de-objetos-de-uma-procedure-oracle/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 19:06:53 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[collection]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=109</guid>
		<description><![CDATA[Como prometido há muito tempo atrás (e bota tempo nisso) no tópico &#8220;Passando Objetos Java para uma Procedure do Oracle&#8220;,<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/09/recuperando-colecao-de-objetos-de-uma-procedure-oracle/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Como prometido há muito tempo atrás (e bota tempo nisso) no tópico &#8220;<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/passando-objetos-java-para-uma-procedure-do-oracle/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed" target="_self">Passando Objetos Java para uma Procedure do Oracle</a>&#8220;, mostrarei como recuperar objetos <a href="http://java.sun.com/" target="_blank">Java</a> contendo uma coleção de outro objetos através de uma procedure do <a href="http://www.oracle.com/">Oracle</a>. Para quem não leu, é altamente recomendado ler o <a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/passando-objetos-java-para-uma-procedure-do-oracle/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed" target="_self">post anterior</a>.</p>
<p>Para este tutorial, precisamos incluir a tabela TBL_CLASS e adicionar sua <em>primary key</em> como <em>foreign key</em> na TBL_USER.</p>
<pre class="brush:sql">--num class será a PK e o desc_class será a descrição
create table TBL_CLASS (num_class number, desc_class varchar(100));
alter table TBL_CLASS add primary key(num_class);

alter table TBL_USER add num_class number;
alter table TBL_USER add constraint FK_CLASS foreign key(num_class) references tbl_class(num_class);</pre>
<p>Agora precisamos incluir os novos tipos:</p>
<pre class="brush:sql">create or replace type class_type as object (num_class number, desc_class varchar2(100), users arr_users);
/
create or replace type arr_class as table of class_type;
/</pre>
<p>O tipo <em>class_type</em> será o objeto. Repare que na sua assinatura incluímos o tipo <em>arr_users</em>, que será nossa coleção de <em>user_type</em> (vide <a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/passando-objetos-java-para-uma-procedure-do-oracle/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed" target="_self">post anterior</a>), o tipo <em>arr_class</em> será uma coleção de <em>class_type</em>.</p>
<p>Agora incluiremos a <em>procedure</em> responsável por retornar nossa coleção de <em>class_type</em>.</p>
<pre class="brush:sql">procedure pro_select_class(clas in class_type, class_return in out arr_class)is
  class_ref_cur ref_cur;
  --Coleção de classes
  classes arr_class := arr_class();

  begin
    open class_ref_cur for
      select cast(
                multiset(
                  select num_class,
                         desc_class,
                         (select cast(
                                  multiset(
                                    select user_name,
                                           height,
                                           b_date
                                    from tbl_user
                                    --Fazendo o JOIN com a TBL_USER
                                    where tbl_user.num_class = tbl_class.num_class
                                  ) as arr_users)
                          from dual) users
                  from tbl_class
                  --Usando o atributo num_class do parâmetro de entrada
                  where num_class = clas.num_class) as arr_class
      ) classes
    from dual;

    --incluindo ao retorno no array
    fetch class_ref_cur into classes;
    --passando o array para a variável out
    class_return := classes;
end pro_select_class;</pre>
<p>Repare que a <em>procedure</em> recebe o tipo <em>class_type</em> como parâmetro <em>in</em> e retorna o tipo <em>arr_class</em>.</p>
<p>Separando trecho responsável por resgatar e montar nossos objetos teremos:</p>
<pre class="brush:sql">
--Montará a coleção de retorno
select cast(
        multiset(

          --Retornará os objetos class_type e seus atributos
          select num_class,
                 desc_class,

                 --Populará a coleção com user_type
                 (select cast(
                          multiset(
                            select user_name,
                                   height,
                                   b_date
                            from tbl_user
                            where tbl_user.num_class = tbl_class.num_class
                          ) as arr_users)

                  from dual) users

          from tbl_class
          where num_class = clas.num_class) as arr_class
) classes
from dual;
</pre>
<p>Os objetos de banco estão prontos, agora para o Java!</p>
<p>Criaremos o objeto que será interpretado pelo Oracle. Vamos chamá-lo de TypeClass:</p>
<pre class="brush:java">
public class TypeClass implements SQLData{
	public static final String ORACLE_OBJECT_NAME = "CLASS_TYPE"; //Nome do tipo no Oracle
	public static final String ORACLE_CLASS_ARRAY_NAME = "ARR_CLASS"; //Nome do array no Oracle

        //campos criados na tabela TBL_CLASS
	private Long number;
	private String desc;
	private Array users; //Esta será a coleção de user_type (ou TypeUser no Java)

	public String getSQLTypeName() throws SQLException {
		return ORACLE_OBJECT_NAME;
	}

	public void readSQL(SQLInput stream, String typeName) throws SQLException {
		setNumber(stream.readLong());
		setDesc(stream.readString());
		setUsers(stream.readArray());//Usado pelo JDBC driver para ler a coleção
	}

	public void writeSQL(SQLOutput stream) throws SQLException {
		stream.writeLong(getNumber());
		stream.writeString(getDesc());
		stream.writeArray(getUsers());//Usado pelo JDBC driver para armazenar a coleção
	}
	//Getters e setters omitidos
}
</pre>
<p>Precisamos mapear os dois tipos já que ambos serão interpretados na requisição, desta forma:</p>
<pre class="brush:java">
Map<String, Class<?>> typeMaps = connection.getTypeMap();
typeMaps.put(TypeUser.ORACLE_OBJECT_NAME, TypeUser.class);
typeMaps.put(TypeClass.ORACLE_OBJECT_NAME, TypeClass.class);
</pre>
<p>Também precisaremos mapear os dois <em>arrays</em>:</p>
<pre class="brush:java">
typeMaps.put(TypeClass.ORACLE_CLASS_ARRAY_NAME, TypeClass[].class);//retornado pela procedure
typeMaps.put(TypeUser.ORACLE_USER_ARRAY_NAME, TypeUser[].class);//retornado pela coleção de class_type
</pre>
<p>Para a requisição faremos:</p>
<pre class="brush:java">
cs = conn.prepareCall("{call PAC_BEAN.PRO_SELECT_CLASS(?,?)}");
//registrando o tipo de saída, que será um array de TypeClass
cs.registerOutParameter("class_return", OracleTypes.ARRAY, TypeClass.ORACLE_CLASS_ARRAY_NAME);

//passando o objeto de parâmetros da query
cs.setObject("clas", classQry);

cs.execute();
//recuperando e iterando o array de TypeClass
Object[] array = (Object[])cs.getArray("class_return").getArray();

for(Object obj : array){
	TypeClass objClass = ((TypeClass)obj);

	System.out.println("Description: "+objClass.getDesc());

        //Aqui pegamos a coleção (ou array) de user_type(TypeUser) retornada pela query.
	Object[] userArray = (Object[])objClass.getUsers().getArray();
	for(Object user : userArray){
		System.out.println("\tName: " + ((TypeUser)user).getName());
		System.out.println("\tHeight: " + ((TypeUser)user).getHeight());
		System.out.println("\tBirth: " + sdf.format(((TypeUser)user).getBirth())+ "\r\n");
	}
}
</pre>
<p>O final você terá um TypeClass que contém um <a href="http://www.j2ee.me/j2se/1.4.2/docs/api/java/sql/class-use/Array.html" target="_blank">java.sql.Array</a> de TypeUser no atributo getUsers().</p>
<p>E aqui cumpro minha promessa. Baixe o código fonte com o exemplo contendo este e o post anterior <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=3" title="clicado 186 vezes">aqui</a>.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/09/recuperando-colecao-de-objetos-de-uma-procedure-oracle/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tirando Screen Shots com Java</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/09/tirando-screen-shots-com-java/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/09/tirando-screen-shots-com-java/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 22:35:57 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[awt]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[image]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=101</guid>
		<description><![CDATA[Aqui mostrarei como fazer uma classe para tirar Screen shots . Estava pensando com quão complexo seria fazer uma classe<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/09/tirando-screen-shots-com-java/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Aqui mostrarei como fazer uma classe para tirar <em>Screen shots </em>.</p>
<p>Estava pensando com quão complexo seria fazer uma classe que tirasse <em>screen shots</em> do compulador local e o armazenasse em um arquivo. Perguntando ao tio &#8220;G&#8221; descobri a classe <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Robot.html" target="_blank">Robot</a>, que possui o método <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Robot.html#createScreenCapture(java.awt.Rectangle)" target="_blank">createScreenCapture</a>.</p>
<p>Agora mostrarei como implementar esta funcionalidade:</p>
<pre class="brush:java">Robot robot = new Robot();
//Definindo o retângulo que será a área de captura da tela que, neste caso, será a tela inteira.
Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

BufferedImage img = robot.createScreenCapture(rect);</pre>
<p>Aqui definimos a área de captura e obtivemos um <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/BufferedImage.html" target="_blank">BufferedImage</a>, que já é nossa imagem. Agora é só persisti-la no disco.</p>
<pre class="brush:java">//Capturando o ImageWriter e ImageWriterParam
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam iwp = writer.getDefaultWriteParam();

//Definindo o modo de compressão e a qualidade
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(1);

//Persistindo a imagem
writer.setOutput(new FileImageOutputStream(arquivo));

IIOImage iioimage = new IIOImage(img, null, null);

writer.write(null, iioimage, iwp);
writer.dispose();</pre>
<p>Aqui capturamos o <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/imageio/ImageWriter.html" target="_blank">ImageWriter</a> e <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/imageio/ImageWriteParam.html" target="_blank">ImageWriterParam</a> para configurar o método de compressão e a qualidade da imagem.</p>
<p>Na linha <strong>07</strong> definimos a qualidade como 1, onde o valor varia de 0 (zero), maior compressão e menor qualidade, até 1 (um), menor compressão e maior qualidade. Em seguida persistimos o arquivo no HD.</p>
<p>Pronto! Simples, não?!.</p>
<p>Faça o download do exemplo <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=2" title="clicado 96 vezes">aqui</a>.</p>
<p>Até a próxima!</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 142px; width: 1px; height: 1px;">
<pre class="brush:java">Neste caso será a tela inteira.</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/09/tirando-screen-shots-com-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Limitando número máximo de caracteres em um JTextField</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/08/limitando-numero-maximo-de-caracteres-em-um-jtextfield/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/08/limitando-numero-maximo-de-caracteres-em-um-jtextfield/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 16:28:34 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jtextfield]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=93</guid>
		<description><![CDATA[A implementação padrão do JTextField não permite definir um limite para inserção de caracteres. Para habilitar este recurso é necessário<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/08/limitando-numero-maximo-de-caracteres-em-um-jtextfield/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>A implementação padrão do <em>JTextField</em> não permite definir um limite para inserção de caracteres. Para habilitar este recurso é necessário implementar um <em>Document</em>, onde será necessário sobrescrever o método <em>insertString</em>.</p>
<pre class="brush:java">public class MaxLengthTextDocument extends PlainDocument {
	//Armazena o número máximo de caracteres para o texto.
	private int maxChars;

	@Override
	public void insertString(int offs, String str, AttributeSet a)
			throws BadLocationException {
		if(str != null &#038;&#038; (getLength() + str.length() < maxChars)){
            		super.insertString(offs, str, a);
        	}
	}

	//getter e setter omitidos
}</pre>
<p>Aqui definimos a classe <em>MaxLengthTextDocument</em> estendendo a <em>PlainDocument</em>. No atributo <em>insertString</em> inserimos uma regra onde só será inserido valor se comprimento não ultrapassar o valor máximo.</p>
<p>Depois é só inserir a implementação no JTextField, desta forma:</p>
<pre class="brush:java">	...
	MaxLengthTextDocument maxLength = new MaxLengthTextDocument();
	maxLength.setMaxChars(50);//Limitamos para 50 caracteres

	jTextField.setDocument(maxLength);
	...</pre>
<p>E voilá!</p>
<p>Até mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/08/limitando-numero-maximo-de-caracteres-em-um-jtextfield/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JLabel com preenchimento (Padding)</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/08/jlabel-com-preenchimento-padding/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/08/jlabel-com-preenchimento-padding/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 21:29:45 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=81</guid>
		<description><![CDATA[Para adicionar preenchimento (padding) à um JLabel podemos usar as próprias bordas. Colocamos um EmptyBorder com o espaçamento que precisamos.<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/08/jlabel-com-preenchimento-padding/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Para adicionar preenchimento (padding) à um JLabel podemos usar as próprias bordas. Colocamos um EmptyBorder com o espaçamento que precisamos. Desta forma:</p>
<pre class="brush:java">...
JLabel jLabel = new JLabel("Meu JLabel");
//Borda usada para o preenchimento
Border paddingBorder = BorderFactory.createEmptyBorder(10,10,10,10);

jLabel.setBorder(BorderFactory.createCompoundBorder(border,paddingBorder));
...</pre>
<p>Neste caso colocamos um espaçamento de 10 pixels no topo, à esquerda, à direita e em baixo do JLabel respectivamente.</p>
<p style="text-align: center;">
<p style="text-align: center;"><img class="size-full wp-image-83 aligncenter" title="JLabel Padding" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/08/2.gif" alt="JLabel Padding" width="300" height="100" /></p>
<p>Se ainda quiser colocar uma borda envolta do JLabel, pode-se usar uma CompoundBorder, inserindo a borda e o preenchimento. Desta forma:</p>
<pre class="brush:java">...
JLabel jLabel = new JLabel("Meu JLabel");
//Borda usada para o preenchimento
Border paddingBorder = BorderFactory.createEmptyBorder(10,10,10,10);
//Borda que ficará envolta do JLabel
Border border = BorderFactory.createLineBorder(Color.BLUE);

jLabel.setBorder(BorderFactory.createCompoundBorder(border,paddingBorder));
...</pre>
<p style="text-align: center;"><img class="size-full wp-image-84 aligncenter" title="JLabel padding" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/08/3.gif" alt="JLabel padding" width="300" height="100" /></p>
<p>Baixe o código fonte desta dica <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=1" title="clicado 92 vezes">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/08/jlabel-com-preenchimento-padding/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial iBatis, aprendendo o básico</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/07/tutoral-ibatis-aprendendo-o-basico/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/07/tutoral-ibatis-aprendendo-o-basico/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 15:53:37 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[ibatis]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=54</guid>
		<description><![CDATA[Geralmente quando se fala sobre frameworks de persistência logo vem à cabeça Hibernate/JPA. Há pouco tempo fui apresentado ao iBatis,<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/07/tutoral-ibatis-aprendendo-o-basico/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Geralmente quando se fala sobre frameworks de persistência logo vem à cabeça Hibernate/JPA. Há pouco tempo fui apresentado ao iBatis, um framework que eu, particularmente, acho muito fácil de instalar, configurar e usar. Você pode baixa-lo através do site de sua mantenedora, a <a href="http://www.apache.org" target="_blank">Apache</a>, clicando <a href="http://ibatis.apache.org/java.cgi?Preferred=http%3A%2F%2Flinorg.usp.br%2Fapache">aqui</a>.</p>
<p>Neste tutorial usarei a versão 2.3.4 build 726.</p>
<p><em><strong>Configurando o iBatis</strong></em></p>
<p>Ao contrário dos demais frameworks, para configurar o iBatis você só precisa de um arquivo XML de configuração, chamado <em>SqlMapConfig</em><em>. </em></p>
<p>As principais seções do xml são:</p>
<pre class="brush: xml">&lt;properties resource="tuto/ibatis/config/SqlMap.properties"/&gt;</pre>
<p>Este código é opcional e serve para indicar o arquivo properties com as variável de configuração que serão usada no XML.</p>
<pre class="brush: xml">&lt;typeAlias alias="car" type="tuto.ibatis.beans.Car"/&gt;</pre>
<p>Indica o Bean utilizado e qual será seu aliás. Você pode configurar várias linhas, tudo depende da complexidade e necessidade da sua modelagem.<br />
No nosso exemplo, usaremos o <em>bean</em> Car abaixo:</p>
<pre class="brush:java">public class Car {
	private Long carId;
	private String company;
	private String model;
	private String color;
	private Integer	hp;
	private Float price;

	//Setters e getters omitidos
}</pre>
<pre class="brush: xml">&lt;transactionManager type="JDBC"&gt;
    &lt;dataSource type="SIMPLE"&gt;
        &lt;property name="JDBC.Driver" value="${driver}"/&gt;
        &lt;property name="JDBC.ConnectionURL" value="${url}"/&gt;
        &lt;property name="JDBC.Username" value="${username}"/&gt;
        &lt;property name="JDBC.Password" value="${password}"/&gt;
    &lt;/dataSource&gt;
&lt;/transactionManager&gt;</pre>
<p>Parâmetros usados na conexão com o banco. As variáveis ${driver}, ${url}, ${username} e ${password} estão definidas no arquivo .properties indicado na seção  <em>properties</em>. Se você preferir, também pode colocar os valores diretamente nos campos, sem precisar defini-los em outro local.</p>
<p>Veja como será arquivo completo:</p>
<pre class="brush: xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
        "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"&gt;

&lt;sqlMapConfig&gt;
    &lt;properties resource="tuto/ibatis/config/SqlMap.properties"/&gt;

    &lt;settings
        cacheModelsEnabled="true"
        enhancementEnabled="true"
        lazyLoadingEnabled="true"
        maxRequests="32"
        maxSessions="10"
        maxTransactions="5"
        useStatementNamespaces="false" /&gt;

    &lt;typeAlias alias="car" type="tuto.ibatis.beans.Car"/&gt;

    &lt;transactionManager type="JDBC"&gt;
        &lt;dataSource type="SIMPLE"&gt;
            &lt;property name="JDBC.Driver" value="${driver}"/&gt;
            &lt;property name="JDBC.ConnectionURL" value="${url}"/&gt;
            &lt;property name="JDBC.Username" value="${username}"/&gt;
            &lt;property name="JDBC.Password" value="${password}"/&gt;
        &lt;/dataSource&gt;
    &lt;/transactionManager&gt;

    &lt;sqlMap resource="tuto/ibatis/sqlmaps/CarSqlMap.xml"/&gt;
&lt;/sqlMapConfig&gt;</pre>
<p>O <em>properties</em> tem o seguinte conteúdo:</p>
<pre class="brush:plain">driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@&lt;host&gt;:&lt;porta&gt;:&lt;sid&gt;
username=&lt;login&gt;
password=&lt;senha&gt;</pre>
<p>Em seguida devemos configurar nosso <em>SqlMap</em>. Este XML conterá as <em>querys </em> utilizadas na aplicação e deverá  ter o nome do descrito na seçao <em>sqlMap</em> do <em>SqlMapConfig</em>, no nosso caso será <em>CarSqlMap.xml</em>.</p>
<p>No nosso exemplo apenas veremos a utilização das <em>tags </em><em>select</em>, <em>insert, </em><em>update </em>e <em>delete</em>.</p>
<pre class="brush:xml">&lt;select id="getCars" resultClass="tuto.ibatis.beans.Car"
	parameterClass="java.lang.Long"&gt;
    SELECT COMPANY  as company,
           MODEL    as model,
           COLOR    as color,
           HP       as hp,
           PRICE    as price
    FROM TBL_CAR
    WHERE CAR_ID = #var#
&lt;/select&gt;</pre>
<p>Executa o <em>select </em>podendo retornar uma única linha ou uma coleção, o tipo retornado é o mesmo especificado no atributo <em>resultClass, o</em> <em>parameterClass</em> é o tipo passado para executar a <em>query</em> e o <em>id</em> é a identificação para chamada da <em>query</em>.</p>
<p>Usaremos o <em>SqlMap</em> abaixo:</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
	"http://ibatis.apache.org/dtd/sql-map-2.dtd"&gt;

&lt;sqlMap namespace="Car"&gt;
    &lt;select id="getCars" resultClass="tuto.ibatis.beans.Car"
    parameterClass="java.lang.Long"&gt;
        SELECT COMPANY  as company,
               MODEL    as model,
               COLOR    as color,
               HP       as hp,
               PRICE    as price
        FROM TBL_CAR
        WHERE CAR_ID = #var#
    &lt;/select&gt;

    &lt;insert id="addCar" parameterClass="tuto.ibatis.beans.Car"&gt;
        INSERT INTO TBL_CAR (CAR_ID, COMPANY, MODEL, COLOR, HP, PRICE)
        VALUES (#carId#, #company#, #model#, #color#, #hp#, #price#)
    &lt;/insert&gt;

    &lt;delete id="delCar" parameterClass="java.lang.Long"&gt;
        DELETE FROM TBL_CAR WHERE CAR_ID = #var#
    &lt;/delete&gt;

    &lt;update id="updCar" parameterClass="tuto.ibatis.beans.Car"&gt;
        UPDATE TBL_CAR
          SET COMPANY = #company#,
              MODEL = #model#,
              COLOR = #color#,
              HP = #hp#,
              PRICE = #price#
        WHERE CAR_ID = #carId#
    &lt;/update&gt;
&lt;/sqlMap&gt;</pre>
<p>Agora que já configuramos o acesso ao banco de dados e o mapeamento dos objetos, vamos implementar a classe <em>singleton</em> que usaremos como <em>SqlMapClient</em>, aqui nós a chamaremos de OracleMapConfig.</p>
<pre class="brush:java">package tuto.ibatis.connection;

import java.io.Reader;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class OracleMapConfig {
	private static final SqlMapClient sqlMapClient;

	static{
		try{
			//Definindo o caminho para o SqlMapConfig e criando o reader
			String res = "tuto/ibatis/config/SqlMapConfig.xml";
			Reader reader = Resources.getResourceAsReader(res);

			//Recuperando o client para o SqlMap
			sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
		} catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	//Método usado para recuperar o client
	public static SqlMapClient getSqlMapClient(){
		return sqlMapClient;
	}
}</pre>
<p>O <em>client</em> é responsável por executar as <em>querys</em> configuradas no <em>SqlMap</em> e nos fornecer os resultados.</p>
<p><em><strong>Executando Querys e tratando retornos</strong></em></p>
<p>Para chamar uma das <em>querys</em> é muito simples, apenas chame o <em>cliente </em>e o método correspondente de cada uma.</p>
<p>O <em>select </em>pode ser chamado da seguinte forma:</p>
<pre class="brush:java">OracleMapConfig.getSqlMapClient().queryForObject("&lt;id&gt;", &lt;parâmetro&gt;);</pre>
<p>O <em><strong>id</strong></em>deve ser o <em>id</em> correspondente no <em>SqlMap</em></p>
<p>O código acima tráz apenas uma linha retornada pela <em>query</em>, para trazer todas apenas troque o método para o <em>queryForList</em>, desta forma:</p>
<pre class="brush:java">OracleMapConfig.getSqlMapClient().queryForList("&lt;id&gt;", &lt;parâmetro&gt;);</pre>
<p>Assim, será retornado uma <em>Collection</em> contendo os objetos.</p>
<p>Vamos aos exemplos:<br />
<strong>Select</strong></p>
<pre class="brush:java">try{
	Car car = (Car)OracleMapConfig.getSqlMapClient().queryForObject("getCars",
		new Long(readKeyboard()));

	System.out.println("Marca: "+car.getCompany());
	System.out.println("Modelo: "+car.getModel());
	System.out.println("Cor: "+car.getColor());
	System.out.println("HP: "+car.getHp());
	System.out.println("Preço: "+car.getPrice());
}catch (Exception e) {
	e.printStackTrace();
}</pre>
<p>O <em>id</em> &#8220;getCars&#8221; é o que definimos nos atributos do <em>select</em> do <em>SqlMap</em>, passando um <em>Long</em> e recuperando o tipo Car, ambos também definidos na linha &lt;select id=&#8221;<span style="color: #0000ff;">getCars</span>&#8221; resultClass=&#8221;<span style="color: #0000ff;">tuto.ibatis.beans.Car</span>&#8221; parameterClass=&#8221;<span style="color: #0000ff;">java.lang.Long</span>&#8220;&gt;.</p>
<p><strong>Insert</strong></p>
<pre class="brush:java">try{
	OracleMapConfig.getSqlMapClient().insert("addCar", newCar);
}catch (Exception e) {
	e.printStackTrace();
}</pre>
<p>Agora passamos como parâmetros o próprio tipo Car, &lt;insert id=&#8221;<span style="color: #0000ff;">addCar</span>&#8221; parameterClass=&#8221;<span style="color: #0000ff;">tuto.ibatis.beans.Car</span>&#8220;&gt; e chamamos os métodos usando cerquilha (#, ou jogo-da-velha se preferirem), desta forma:</p>
<pre class="brush:plain">INSERT INTO TBL_CAR (CAR_ID, COMPANY, MODEL, COLOR, HP, PRICE)
VALUES (#carId#, #company#, #model#, #color#, #hp#, #price#)</pre>
<p><strong>Delete</strong></p>
<pre class="brush:java">try{
	int lines = OracleMapConfig.getSqlMapClient().delete("delCar",
		new Long(readKeyboard()));

	System.out.println(lines + " linhas excluídas");
}catch (Exception e) {
	e.printStackTrace();
}</pre>
<p>O método <em>delete</em> do <em>client</em> retorna um tipo <em>int</em> que representa a quantidade de linhas excluídas.</p>
<p><strong>Update</strong></p>
<pre class="brush:java">try{
	int lines = OracleMapConfig.getSqlMapClient().update("updCar", car);

	System.out.println(lines + " carros incluídos");
}catch (Exception e) {
	e.printStackTrace();
}</pre>
<p>O Update retorna um tipo <em>int</em>, que informa a quantidade de linhas afetadas pelo update.</p>
<p>Como você pode ver, com apenas três arquivos XML e três classes conseguimos montar um sistema de manutenção de estoque de consulta de preço basico.</p>
<p>Você pode fazer o download com os fontes deste tutorial clicando <a href="../wordpress_external/downloads/TutoIbatis.zip#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">aqui</a>.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/07/tutoral-ibatis-aprendendo-o-basico/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Passando Objetos Java para uma procedure do Oracle</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/05/passando-objetos-java-para-uma-procedure-do-oracle/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/05/passando-objetos-java-para-uma-procedure-do-oracle/#comments</comments>
		<pubDate>Sun, 31 May 2009 20:00:18 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[jdbc]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=31</guid>
		<description><![CDATA[Na empresa onde trabalho houve uma discussão sobre a possibilidade de passar um objeto Java para dentro de uma procedure<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/passando-objetos-java-para-uma-procedure-do-oracle/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Na empresa onde trabalho houve uma discussão sobre a possibilidade de passar um objeto <a href="http://java.sun.com/" target="_blank">Java</a> para dentro de uma <em>procedure </em>ou <em>function </em>do <a href="http://www.oracle.com" target="_blank">Oracle</a>, então resolvi pesquisar e aqui está uma forma bem simples de atingir este objetivo.</p>
<p><em>Este tutorial só funciona com a versão 9i do Oracle, ou superior, e usando o driver JDBC </em><em>ojdbc14g, ou superior.</em></p>
<p>Primeiro precisaremos criar as tabelas, objetos  e procedures. Lembrando que os tipos <em>tbl_users</em> e <em>user_type</em> deverão ser declarados como globais para funcionar, ou seja, fora de <em>packages</em>:</p>
<pre class="brush: sql">-- Criando a tabela
create table tbl_user(user_name varchar2(100), height number, b_date date);
/
--Criando o tipo user_type (nosso bean)
create or replace type user_type as object (user_name varchar2(100), height number, birth_date date);
/
--Criando o tipo arr_users, que é do tipo table of user_type (array de user_type)
create or replace type arr_users as table of user_type;
/</pre>
<p>Criando o <em>spec </em>e <em>body </em>da <em>package </em>que conterá as <em>procedures</em></p>
<pre class="brush: sql">--Spec
create or replace package PAC_BEAN is
  -- REF CURSOR deve ser declarado dentro da package
  type ref_cur is ref cursor;

  -- Procedure usada para o insert
  procedure pro_insert_user(usu in user_type);

  -- Procedure usada para o select
  procedure pro_select_user(usu in user_type, user_return in out arr_users);
end PAC_BEAN;
/</pre>
<pre class="brush: sql">--Body
create or replace package body PAC_BEAN is
  --A procedure de insert receberá o tipo user_type (nosso bean)
  --e o cadastrará na tabela tbl_user
  procedure pro_insert_user(usu in user_type) is
    begin
      insert into tbl_user (user_name, height, b_date)
      values (usu.user_name, usu.height, usu.birth_date);

      commit;
    exception
      when others then
        rollback;
  end pro_insert_user;

  --Procedure de select que receberá um user_type com a informação do nome
  --(cláusula where) e retornará o array arr_users (array de user_type)
  procedure pro_select_user(usu in user_type, user_return in out arr_users)is
    user_ref_cur ref_cur;

    --Instanciando o array
    users arr_users := arr_users();

    begin
      --Abrindo o cursor que retornará nosso array
      open user_ref_cur for
        select cast(
                 multiset(
                   select user_name,
                          height,
                          b_date
                   from tbl_user
                   where user_name like '%'||usu.user_name||'%'
                 ) as arr_users
              ) arr
        from dual;

      --Jogando o retorno do cursor dentro da instância de arr_users
      fetch user_ref_cur into users;

      --Retornando a instância através da variável OUT
      user_return := users;
  end pro_select_user;
end PAC_BEAN;
/</pre>
<p><em>Consulte sobre o funcionamento do <a href="http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/functions015.htm#sthref1120" target="_blank">CAST</a> e <a href="http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/operators006.htm" target="_blank">MULTISET</a>.</em></p>
<p>Construído os objetos de banco precisamos prepara o JavaBean. Ele será uma implementação de <em>java.sql.SQLData</em>, por isso será necessário implementar os métodos:</p>
<p><em>getSQLTypeName()</em> &#8211; É o <em>getter</em> usado para obter o nome do tipo.</p>
<p><em>readSQL(SQLInput, String)</em> &#8211; Usado para converter o objeto SQL em objeto Java.</p>
<p><em>writeSQL(SQLOutput stream)</em> &#8211; Usado para montar o objeto SQL, usado pelo <em>Driver </em>JDBC.</p>
<pre class="brush: java">public class TypeUser implements SQLData{
	//O nome do tipo declarado no Oracle
	public static final String ORACLE_OBJECT_NAME = "USER_TYPE";
	//O nome do array declarado no Oracle
	public static final String ORACLE_USER_ARRAY_NAME = "ARR_USERS";

	//Os atributos
	private String name;
	private Float height;
	private Date birth;

	public TypeUser() {
		height = 0F;
	}
	//Getter retorna o nome do tipo ao JDBC
	public String getSQLTypeName() throws SQLException {
		return ORACLE_OBJECT_NAME;
	}

	public void readSQL(SQLInput stream, String typeName) throws SQLException {
		setName(stream.readString());
		setHeight(stream.readFloat());
		setBirth(stream.readDate());
	}

	public void writeSQL(SQLOutput stream) throws SQLException {
		stream.writeString(getName());
		stream.writeFloat(getHeight());
		stream.writeDate(getBirth() != null ?
				new java.sql.Date(getBirth().getTime()) : null);
	}

        //getters e setters omitidos
}</pre>
<p>Para definir que um tipo poderá ser enviado à procedure é necessário adicioná-lo ao mapa de tipos através de <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Connection.html#getTypeMap()" target="_blank"><em>Connection.getTypeMap()</em></a>. Este método retorna um <em>Map&lt;String,Class&lt;?&gt;&gt;</em>, onde a chave é o nome do tipo e o valor será a classe <em>SQLData </em>implementada, no nosso caso a <em>TypeUser definida</em> acima. Exemplo:</p>
<pre class="brush: java">Map&gt; typeMaps = connection.getTypeMap();
typeMaps.put(TypeUser.ORACLE_OBJECT_NAME, TypeUser.class);</pre>
<p>A conexão ficará desta forma:</p>
<pre class="brush: java">//Fazendo a conexão
Class.forName("oracle.jdbc.driver.OracleDriver");
connection = DriverManager.getConnection("jdbc:oracle:thin:@&lt;host&gt;:&lt;porta&gt;:&lt;bd&gt;","&lt;usuario&gt;","&lt;senha&gt;");

//Mapeando o tipo necessário
Map&lt;String,Class&lt;?&gt;&gt; typeMaps = connection.getTypeMap();
typeMaps.put(TypeUser.ORACLE_OBJECT_NAME, TypeUser.class);</pre>
<p>Agora que temos a nossa conexão podemos fazer o método de <em>insert</em>, que receberá uma instância <em>TypeUser </em>e uma <em>Connection</em>:</p>
<pre class="brush: java">CallableStatement cs = null;
try {
	//chamando a procedure de insert
	cs = conn.prepareCall("{call PAC_BEAN.PRO_INSERT_USER(?)}");

	//definindo a instância de TypeUser como paramêtro "usu" da procedure
	cs.setObject("usu", typeUser);

	cs.execute();
} catch (SQLException e) {
	e.printStackTrace();
}</pre>
<p>Agora que temos o método de insert, partiremos para o método de <em>select</em>. Como este método retorna um <em>array </em>de objetos, é necessário inserir o tipo do array <em>TypeMap </em>da conexão. O nome passado como chave deve ser o nome do tipo do <em>array </em>no Oracle e o valor será a classe do <em>array</em> que esperamos, desta forma:</p>
<pre class="brush: java">connection.getTypeMap().put(TypeUser.ORACLE_USER_ARRAY_NAME, TypeUser[].class);</pre>
<p>Para a chamada da <em>procedure </em>e <em>registerOutParameter:</em></p>
<pre class="brush: java">cs = conn.prepareCall("{call PAC_BEAN.PRO_SELECT_USER(?,?)}");
cs.registerOutParameter("user_return", OracleTypes.ARRAY, TypeUser.ORACLE_USER_ARRAY_NAME);
cs.setObject("usu", typeUserQry);

cs.execute();</pre>
<p>O método para recuperar o <em>array</em> deverá ser chamado desta forma:</p>
<pre class="brush: java">//user_return é o nome da variável OUT da procedure
Object[] array = (Object[])cs.getArray("user_return").getArray();</pre>
<p>Se até aqui deu tudo certo fique contente, para resgatar os valores do <em>array</em> é só iterá-lo e fazer <em>cast</em> para a classe TypeUser.</p>
<pre class="brush: java">for(Object obj : array){
	System.out.println("Nome: " + ((TypeUser)obj).getName());
	System.out.println("Altura: " + ((TypeUser)obj).getHeight());
	System.out.println("Data de Nascimento: " + sdf.format(((TypeUser)obj).getBirth()));
}</pre>
<p>Desta forma poderemos passar e resgatar objetos simples de uma procedure/function do Oracle.</p>
<p>Próximo passo: <a href="http://www.andrels.com/wp-pt_BR/index.php/2009/09/recuperando-colecao-de-objetos-de-uma-procedure-oracle/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">Recuperando coleção de objetos de uma procedure Oracle</a>.</p>
<p>Até lá!</p>
<p>Baixe o código fonte deste tutorial e da <a href="http://www.andrels.com/wp-pt_BR/index.php/2009/09/recuperando-colecao-de-objetos-de-uma-procedure-oracle/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">segunda parte</a> <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=3" title="clicado 186 vezes">aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/05/passando-objetos-java-para-uma-procedure-do-oracle/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Collections, qual usar?</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/05/collections-qual-usar/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/05/collections-qual-usar/#comments</comments>
		<pubDate>Sun, 24 May 2009 20:38:38 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[collection]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=19</guid>
		<description><![CDATA[A interface Collection possui várias implementações, como ArrayList, LinkedList, TreeSet e outras. Com tantas variações, algumas vezes você não sabe<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/collections-qual-usar/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>A interface <a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html" target="_blank">Collection</a> possui várias implementações, como <a href="http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html" target="_blank">ArrayList</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html" target="_blank">LinkedList</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/TreeSet.html" target="_blank">TreeSet</a> e outras. Com tantas variações, algumas vezes você não sabe qual usar, isto depende de seu objetivo. Tentarei explicar algumas diferenças entre ArrayList, LinkedList e TreeSet.</p>
<p><strong>ArrayList</strong><br />
A Collection ArrayList permite armazenar objetos e valores nulos, mas seu acesso é desordenado, o primeiro objeto inserido pode ser o último retornado.</p>
<p><strong>LinkedList</strong><br />
Esta implementação de Collection é parecida com o ArrayList, mas a diferença está no acesso aos objetos armazenados, onde cada objeto é retornado na ordem de inserção.</p>
<p><strong>TreeSet</strong><br />
Se você quer recuperar os objetos de sua Collection em uma ordem específica, esta Collection pode fazer o trabalho! Inserir objetos em um Treeset é igual às classes anteriores, mas seu retorno depende da interface <a href="http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html" target="_blank">Comparable</a> implementada no valores. Ele ordena seus objetos usando o resultado do método <a href="http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html#compareTo(T)" target="_blank">compareTo</a>, herdado da interface Comparable.</p>
<p>Para mais informações visite o Javadoc da <a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html" target="_blank">Collection</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/05/collections-qual-usar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aprenda JavaFX em 15 minutos</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/05/aprenda-javafx-em-15-minutos/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/05/aprenda-javafx-em-15-minutos/#comments</comments>
		<pubDate>Sun, 24 May 2009 20:19:31 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[javafx]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=13</guid>
		<description><![CDATA[Este vídeo mostra alguns comandos para JavaFX, de um simples “Hello World” até funções e modificadores de acesso. Agradecimento ã<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/aprenda-javafx-em-15-minutos/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Este <a href="http://tinyurl.com/bznwp5" target="_blank">vídeo</a> mostra alguns comandos para JavaFX, de um simples “Hello World” até funções e modificadores de acesso.</p>
<p>Agradecimento ã <a href="http://www.furutani.com.br">Roberto Furutani</a>!</p>
<p>Divirta-se!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/05/aprenda-javafx-em-15-minutos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recuperando unidades de disco ou dipositivos removíveis</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/05/recuperando-unidades-de-disco-ou-dipositivos-removiveis/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/05/recuperando-unidades-de-disco-ou-dipositivos-removiveis/#comments</comments>
		<pubDate>Sun, 24 May 2009 16:13:12 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[file]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=9</guid>
		<description><![CDATA[Você já tentou recuperar os dispositivos removíveis ou unidades de disco usando java.io.File e passando &#8220;/&#8221; como parâmetro do construtor?<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/recuperando-unidades-de-disco-ou-dipositivos-removiveis/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Você já tentou recuperar os dispositivos removíveis ou unidades de disco usando <em>java.io.File </em>e passando &#8220;/&#8221; como parâmetro do construtor? O resultado foi a raíz do Classpath, não é?</p>
<p>Para obter as unidades de disco ou dispositivos removíveis, use <strong>File.<em>listRoots()</em></strong>. Este código retorna um array de objetos File, onde cada índice do array é uma unidade de disco ou um dispositivo removível.</p>
<p>Siga este exemplo:</p>
<pre class="brush: java">File[] units = File.listRoots();

for(File unit : units){
    System.out.println(unit.getAbsolutePath());
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/05/recuperando-unidades-de-disco-ou-dipositivos-removiveis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipulando etiquetas ID3 de arquivos MP3</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/05/boas-vindas/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/05/boas-vindas/#comments</comments>
		<pubDate>Sat, 23 May 2009 15:46:07 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[Jid2Lib]]></category>
		<category><![CDATA[mp3]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=1</guid>
		<description><![CDATA[Este post lhe ensinará a manipular etiquetas (tags) ID3 de arquivos MP3 usando a biblioteca Java Jid2Lib. Primeiro, faça o<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/boas-vindas/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Este post lhe ensinará a manipular etiquetas (tags) ID3 de arquivos MP3 usando a biblioteca Java Jid2Lib.</p>
<p>Primeiro, faça o download do arquivo jar em <a href="http://javamusictag.sourceforge.net/">http://javamusictag.sourceforge.net/</a>.</p>
<p>O código abaixo irá demonstrar como recuperar informações de arquivos MP3:</p>
<pre class="brush: java">try {
    MP3File mp3 = new MP3File("D:\\Musics\\MP3\\ACDC\\ACDC - Back In Black.mp3");
    System.out.println("Álbum:" + mp3.getID3v2Tag().getAlbumTitle());
    System.out.println("Banda:" + mp3.getID3v2Tag().getLeadArtist());
    System.out.println("Compositor:" + mp3.getID3v2Tag().getAuthorComposer());
    System.out.println("Year:" + mp3.getID3v2Tag().getYearReleased());
} catch (Exception e) {
	e.printStackTrace();
}</pre>
<p>O resultado:</p>
<blockquote><p>Álbum: Back in Black<br />
Banda: AC/DC<br />
Compositor: Angus Young/Brian Johnson/Malcolm Young<br />
Ano:</p></blockquote>
<p>Para mudar qualquer informação de qualquer etiqueta ID3, tenta o código abaixo:</p>
<pre class="brush: java">mp3.getID3v2Tag().setYearReleased("1980");
mp3.save();</pre>
<p>Esta biblioteca possui vários métodos que ajudarão à customizar qualquer arquivo MP3.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/05/boas-vindas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

