domingo, 16 de setembro de 2012

Prepared statements em Stored Procedures - Mysql

Hoje vou mostrar como é simples usar Prepared statements em Stored procedures.
Prepared Statements são instruções pré compiladas, que possibilita executar uma instrução mais de uma vez de modo eficiente, pois a instrução é analisada apenas uma vez.  Assim como só vai haver dinamismo no envio dos dados por parâmetros, o tráfego da rede é reduzido! detalhes aqui!

Sintaxe SQL para instruções preparadas é baseada em três instruções :

PREPARE prepara um comando para execução.
EXECUTE executa uma declaração preparada.
DEALLOCATE PREPARE libera uma declaração preparada.


Agora, como já dizia o Coronel Jesuíno: "mysql abra ai que vou lhe usar!" 


DELIMITER ;;
    CREATE PROCEDURE sp_Posts(IN idPost TEXT)
BEGIN


SET @queryDelete = CONCAT('DELETE FROM posts WHERE posts.id IN (', idPost,')');
PREPARE pstm FROM @queryDelete;
EXECUTE pstm ;
DEALLOCATE PREPARE pstm ;
END
;;
 
e para executar: 

CALL sp_Posts('5,8,9,32,45,100,165,200');
 

quarta-feira, 5 de setembro de 2012

Waze : app comunitário de trânsito e navegação

Dica de app interessante para Android e Iphone:
Waze é um aplicativo comunitário de trânsito e navegação, usado por mais de 20 milhões de pessoas,
que estão unindo forças com outros motoristas próximos para usufruir de um trânsito mais inteligente,
economizar tempo e melhorar a jornada diária de todos.




segunda-feira, 3 de setembro de 2012

Filtrando linhas da JTable com TableRowSorter

Olá negada!

Nesse post vou mostrar como filtrar as linhas de uma JTable utilizando o TableRowSorter. Como exemplo, criei um model com duas colunas e algumas linhas para a minha JTable. OBS: Utilizei o DefaultTableModel para economizar codigo, mas não use-o
em seus projetos, pois é uma bosta deixa o código muito confuso e difícil de manter (veja mais motivos) ou seja Crie o seu próprio TableModel!

Agora vamos ao FOCO!
Partindo do ponto que você ja tenha um JTexfield e sua JTable com um model com algumas linhas, declare um TableRowSorter<TableModel> e um metodo setRowSorter() que servirá para add o rowSorter a tabela.
No corpo do método será instanciado o TableRowSorter passando o model da JTable (table.getModel()) no seu construtor. Na linha seguinte basta setar ao seu JTable a intancia do RowSorter table.setRowSorter(rowSorter);

Feito isso, set a interface CaretListener que vai disparar o método caretUpdate(CaretEvent arg0) quando a posição do cursor for atualizada. Dentro desse método vem a mágica da classe RowFilter ,
que filtra a JTable, permitindo exibir apenas as linhas que contêm uma coluna com uma sequência específica.

rowSorter.setRowFilter(RowFilter.regexFilter(txtField.getText(), 0));

Abaixo segue o exemplo completo: Minha IDE preferida, se ajeite ai que vou lhe usar!!

Run As Java Application!


Exemplo feito com o código abaixo!

 
import java.awt.Color;
import java.awt.HeadlessException;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.border.LineBorder;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 * @author Everton Vieira
 * */
public class FiltroJTable extends JFrame {

 private JTextField textField;
 private JTable table;
 private TableRowSorter<TableModel> rowSorter;

 public FiltroJTable() throws HeadlessException {
  getContentPane().setLayout(null);

  JLabel lblRefinarPesquisa = new JLabel("Refinar Pesquisa:");
  lblRefinarPesquisa.setBounds(10, 11, 123, 14);
  getContentPane().add(lblRefinarPesquisa);

  textField = new JTextField();
  //
  textField.addCaretListener(new CaretListener() {
   public void caretUpdate(CaretEvent arg0) {
    String text = textField.getText().trim();
    rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" +text, 0));
   }
  });
  textField.setBounds(127, 8, 205, 20);
  getContentPane().add(textField);
  textField.setColumns(10);

  table = new JTable();
  table.setModel(new javax.swing.table.DefaultTableModel(new Object[][] {
    { "ReceitasTecnologicas.blogspot.com", null },
    { "profdouglas.blogspot.com", null, }, { "cc", null, },
    { "jovemnerd.ig.com.br", null, null, null }, { "ee", null },
    { "naosalvo.com.br", null, null, null }, { "ax", null } },
    new String[] { "Blog", "Title 2", }));
  table.getColumnModel().getColumn(0).setPreferredWidth(240);

  JScrollPane scrollPane = new JScrollPane();
  scrollPane.setBounds(10, 40, 382, 200);
  scrollPane.setViewportBorder(new LineBorder(new Color(0, 0, 0)));
  getContentPane().add(scrollPane);
  table.setFillsViewportHeight(true);
  table.setBounds(20, 245, 351, -208);
  scrollPane.setViewportView(table);
  setRowSorter();
 }

 /**
  * add o TableRowSorter ao minha JTable
  * 
  * @author Everton Vieira
  */
 private void setRowSorter() {
  if (rowSorter == null) {
   rowSorter = new TableRowSorter<TableModel>(table.getModel());
   table.setRowSorter(rowSorter);
  }
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  new FiltroJTable().setVisible(true);

 }
}

Se você leu até aqui ou já consultou o javaDoc não vai me perguntar o motivo de que:
 - quando filtra e tenta imprimir o getValueAt da sua JTable não obtém o valor correto.
 Pois você já sacou que quando usar rowSorter você terá que converter o index da linha desejada usando convertRowIndexToView ou convertRowIndexToModel.
System.out.println(table.getModel().getValueAt(table.convertRowIndexToModel(selectedRow), 0));

Abs do Coronel Jesuíno!