Como fazer uma conexão entre Java e SQL Server

Hoje vou mostrar como fazer a conexão de uma aplicação em Java com SQL Server.

Primeiramente, baixe o SQL Server JDBC Driver direto do link oficial da Microsoft – https://docs.microsoft.com/pt-br/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15 . Agora, vamos ao tutorial (nesse exemplo foi usado o IDE Eclipse).

  1. Na aplicação sua em Java, crie uma pasta chamada lib

Adicionando uma pasta

  1. Coloque o arquivo .jar que você baixou de conexão com SQL Server dentro dessa pasta

Colocando o .jar dentro dessa pasta

  1. Vá nas propriedades do projeto

Abrindo as propriedades do projeto

  1. No Java Build Path, na aba Libraries, clique em Add JARs

Botão para adicionar .jar

  1. Aponte para o arquivo que você adicionou no passo 2

Arquivo jar adicionado

  1. Vá no servidor que o SQL Server está instalado, e abra o Configuration Manager

Procurando pelo SQL Server Configuration Manager

  1. Na parte de Configurações de rede, ache a instância que você irá se conectar

Acessando protocolos de rede

  1. Clique com o botão direito em TCP/IP, vá em Propriedades, e altere o Habilitado para Sim

Ativando TCP/IP

  1. Agora na aba Endereços IP, vá no final até IPAll e defina uma porta (por exemplo, 1433 ou 1443).

Colocado uma porta no IPAll

  1. Agora, reinicie o Banco de Dados via Management Studio / Azure Data Studio

Reiniciando o banco de dados

  1. Na sua aplicação Java, você já poderá usar normalmente

Realizando testes via Java

Abaixo o código fonte feito em Java para exemplo do tutorial acima:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Formatter;
import javax.swing.UIManager.*;
import java.sql.*;

public class TestBD extends JFrame implements ActionListener, PropertyChangeListener {
	
	private static final long serialVersionUID = 1L;
	
	/* criando variaveis dos componentes na tela*/
	private JLabel lbIPServ, lbPorta, lbBase, lbUser, lbSenha, lbArq, lbLog;
	private JTextField jtIPServ, jtPorta, jtBase, jtArq, jtUser, jtSenha;
	private JButton btConfirmar, btArq;
	private JProgressBar progressBar;
	private Task task;
	
	public TestBD() {
		setLayout(null);
		
		lbIPServ = new JLabel("IP / Servidor:");
		lbIPServ.setBounds(10,10,100,30);
		add(lbIPServ);
		
		jtIPServ = new JTextField(100); 
		jtIPServ.setBounds(110,10,350,30);
		add(jtIPServ);
		
		lbPorta = new JLabel("Porta:");
		lbPorta.setBounds(10,50,100,30);
		add(lbPorta);
		
		jtPorta = new JTextField(100); 
		jtPorta.setBounds(110,50,350,30);
		add(jtPorta);
		
		lbBase = new JLabel("Base de Dados:");
		lbBase.setBounds(10,90,100,30);
		add(lbBase);
		
		jtBase = new JTextField(100); 
		jtBase.setBounds(110,90,350,30);
		add(jtBase);
		
		lbUser = new JLabel("Usuario:");
		lbUser.setBounds(10,130,100,30);
		add(lbUser);
		
		jtUser = new JTextField(100); 
		jtUser.setBounds(110,130,350,30);
		add(jtUser);
		
		lbSenha = new JLabel("Senha:");
		lbSenha.setBounds(10,170,100,30);
		add(lbSenha);
		
		jtSenha = new JTextField(100);
		jtSenha.setBounds(110,170,350,30);
		add(jtSenha);
		
		lbArq = new JLabel("Arquivo:");
		lbArq.setBounds(10,210,100,30);
		add(lbArq);
		
		jtArq = new JTextField(100); 
		jtArq.setBounds(110,210,350,30);
		add(jtArq);
		
		btArq = new JButton("...");
		btArq.setBounds(460,210,20,30);
		btArq.setToolTipText("Selecionar arquivo");
		btArq.addActionListener(this);
		add(btArq);
		
		lbLog = new JLabel("");
		lbLog.setBounds(10,270,450,30);
		lbLog.setForeground(Color.RED);
		add(lbLog);
		
		progressBar = new JProgressBar(0, 100);
		progressBar.setStringPainted(true);
		progressBar.setBounds(10,310,470,30);
		progressBar.setString("...");
		add(progressBar);
		
		btConfirmar = new JButton("Confirmar");
		btConfirmar.setBounds(190,350,120,30);
		btConfirmar.setToolTipText("Confirma a leitura");
		btConfirmar.setMnemonic('C');
		btConfirmar.addActionListener(this);
		add(btConfirmar);

		/* mudando visual dos componentes na tela */
		try {
			for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
				if ("Nimbus".equals(info.getName())) {
					UIManager.setLookAndFeel(info.getClassName());
					SwingUtilities.updateComponentTreeUI(this);    
					this.pack();
					break;
				}
			}
		}
		catch (Exception e) {}
		
		/* definindo o valor default dos campos */
		jtIPServ.setText("localhost");
		jtPorta.setText("1433");
		jtBase.setText("BaseTeste");
		jtArq.setText("C:\\Spool\\teste_java.log");
		jtUser.setText("sa");
		jtSenha.setText("tst123");
	}
  
	public void actionPerformed(ActionEvent e) {
		/* Se for o botao confirmar */
		if (e.getSource() == btConfirmar) {
			String senhaPega = jtSenha.getText();
			
			/* IP, DataBase, Arquivo, Usuario e Senha sao obrigatorios*/
			if ( (jtIPServ.getText().isEmpty()) || jtBase.getText().isEmpty() || jtArq.getText().isEmpty() || jtUser.getText().isEmpty() || senhaPega.isEmpty()){
				JOptionPane.showMessageDialog(null, "Campo(s) em branco!", "#001 - Campos", 0);
				lbLog.setText("Campo(s) em branco!");
			}
			/* Senao, chama a tarefa de executar a leitura no banco */
			else {
				
				setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
		        task = new Task();
		        task.addPropertyChangeListener((PropertyChangeListener) this);
		        task.execute();
			}
		}
		/* Se for o botao de selecionar o arquivo, abre uma tela para definir o caminho*/
		else if (e.getSource() == btArq) {
			final JFileChooser fc = new JFileChooser(jtArq.getText());
			int returnVal = fc.showOpenDialog(TestBD.this);
			
			if (returnVal == JFileChooser.APPROVE_OPTION) {
				jtArq.setText(fc.getSelectedFile().getAbsolutePath());
			}
		}
	}
	
	public void propertyChange(PropertyChangeEvent evt) {
		/* Definindo o valor da barra de progresso na mudanca de propriedade */
		if ("progress" == evt.getPropertyName()) {
			int progress = (Integer) evt.getNewValue();
			progressBar.setValue(progress);
		} 
	}
	

	class Task extends SwingWorker<Void, Void> {
		@Override
		public Void doInBackground() {
			
			/* Define variaveis de controle e deixa os campos inativos para alteracao */
			setProgress(0);
			double atual = 0, ultimo = 0;
			int porcentagem = 0;
			String codigo = "";
			String descricao = "";
			String textoFull = "";
			String dbURL = "";
			String user = jtUser.getText().trim();
			String pass = jtSenha.getText().trim();
			String atuStr = "", totStr = "";
			btConfirmar.setEnabled(false);
			jtIPServ.setEnabled(false);
			jtPorta.setEnabled(false);
			jtBase.setEnabled(false);
			jtArq.setEnabled(false);
			jtUser.setEnabled(false);
			jtSenha.setEnabled(false);
			btArq.setEnabled(false);
			
			/* Define a barra como o valor total */
			setProgress(porcentagem);
			
			try{
				/* Monta a URL de conexao do banco */
				dbURL = "jdbc:sqlserver://"+jtIPServ.getText().trim();
				if (!(jtPorta.getText().isEmpty()))
					dbURL += ":"+jtPorta.getText().trim();
				dbURL += ";databaseName="+jtBase.getText().trim();
				
				/* Faz a conexao com o banco */
				Connection conn = DriverManager.getConnection(dbURL, user, pass);
				if (conn != null) {
					Statement statement = conn.createStatement();
					
					/* Pega o ultimo registro */
					String selectQuery = "";
					ResultSet rs = statement.executeQuery(" SELECT ISNULL(MAX(CODIGO), 0) AS ULTIMO FROM PRODUTOS ");
					while (rs.next()) {
						ultimo = Double.parseDouble(rs.getString("ULTIMO"));
					}
					
					/* Define o valor total em texto para mostrar na tela */
					totStr = String.valueOf(ultimo);
					totStr = totStr.substring(0, totStr.indexOf("."));
					
					/* Faz uma nova consulta pegando os campos de codigo e descricao */
					selectQuery = " SELECT CODIGO, DESCRICAO FROM PRODUTOS ";
					rs= statement.executeQuery(selectQuery);
					
					/* Enquanto houver produtos, atualiza a barra de progresso, pega os dois campos e coloca na variavel texto*/
					while (rs.next()) {
						atual++;
						atuStr = String.valueOf(atual);
						atuStr = atuStr.substring(0, atuStr.indexOf("."));
						lbLog.setText("Processando linha "+atuStr+" de "+totStr+"...");
						porcentagem = (int) ((atual*100)/(ultimo));
						setProgress(porcentagem);
						progressBar.setString(String.valueOf(porcentagem)+" %");
						
						codigo = rs.getString("CODIGO");
						descricao = rs.getString("DESCRICAO");
						textoFull += codigo + "|" + descricao + "\n";
					}
					
					/* Tenta criar o arquivo com todos os produtos */
					try
					{
						Formatter saida = new Formatter(jtArq.getText());
						saida.format(textoFull);
						saida.close();
						JOptionPane.showMessageDialog(null,"Arquivo '"+jtArq.getText()+"' criado!","Arquivo",1);
					}
					catch(Exception erro){
						JOptionPane.showMessageDialog(null,"Arquivo nao pode ser gerado!","Erro",0);
					}
					
					lbLog.setText("Processo Concluido!");
				}
				
			}
			/* Se houve algum problema mostra ao usuario */
			catch (SQLException ex){
				System.out.println("SQLException: "+ex.getMessage());
				System.out.println("SQLState: "+ex.getSQLState());
				System.out.println("VendorError: "+ex.getErrorCode());
				JOptionPane.showMessageDialog(null, "Erro na conexao com o Banco!", "#003 - SQL Server", 0);
				lbLog.setText("Erro na conexao com o banco!");
			}
			
			/* Volta o estado dos componentes */
			btConfirmar.setEnabled(true);
			jtIPServ.setEnabled(true);
			jtPorta.setEnabled(true);
			jtBase.setEnabled(true);
			jtArq.setEnabled(true);
			jtUser.setEnabled(true);
			jtSenha.setEnabled(true);
			btArq.setEnabled(true);
			return null;
		}
	
		@Override
		public void done() {
			Toolkit.getDefaultToolkit().beep();
			setCursor(null);
		}
	}
	
	public static void main(String arg[]) {
		TestBD tstJanela = new TestBD();
		tstJanela.setSize(500,420);
		tstJanela.setLocationRelativeTo(null);
		tstJanela.setTitle("Test BD - Conexao com SQL Server");
		tstJanela.getContentPane().setBackground(Color.WHITE);
		tstJanela.setResizable(false);
		tstJanela.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		tstJanela.setVisible(true);
	}
	
	
}

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação