<?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; Java</title>
	<atom:link href="http://www.andrels.com/wp-pt_BR/index.php/category/desenvolvimento/java/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>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>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>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>

