Acesso à Banco de Dados

07/05/2018

Banco de dados e JDBC

Antes de passar adiante, leia o excelente material da Caelum, sobre banco de dados e JDBC.

Para entender melhor, tente praticar!!!

Configurando a conexão ao banco de dados

Driver JDBC do SQL Server

  1. Baixe a biblioteca em http://central.maven.org/maven2/com/microsoft/sqlserver/mssql-jdbc/6.4.0.jre8/mssql-jdbc-6.4.0.jre8.jar
  2. Dentro do NetBeans, selecione o menu Ferramentas > Bibliotecas.
  3. Na janela que aparece, clique em Nova Biblioteca....
  4. Escreva para o nome da biblioteca “Driver JDBC do SQL Server” e clique em OK.
  5. Na tela que aparece, clique em Adicionar JAR/Pasta..., escolha o arquivo baixado e depois clique em OK.

Fazendo o driver como dependência do projeto

  1. No projeto NetBeans, clique no botão direito em Bibliotecas, no menu, selecione Adicionar Biblioteca....
  2. Na janela que aparece, escolha “Driver JDBC do SQL Server” e finalize.

NOTA: é preciso adicionar a biblioteca em todos os projetos que forem usar o SQL Server.

Na configuração do Spring

Essa configuração está sendo aplicada ao código feito no exercício 4

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"primavera.dao", "primavera.controller"})
public class AppConfig {

    @Bean
    public ViewResolver jspViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setViewClass(JstlView.class);
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/messages");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setUseCodeAsDefaultMessage(true);
        return messageSource;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource ds = new DriverManagerDataSource();

        ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        ds.setUrl("jdbc:sqlserver://localhost;databaseName=PJW");
        ds.setUsername("sa");
        ds.setPassword("123456");

        return ds;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}

Criando o banco de dados e as tabelas

CREATE DATABASE PJW;
USE PJW;

CREATE TABLE Cars (
  id    INT IDENTITY PRIMARY KEY,
  name  VARCHAR(50),
  price REAL,
  color VARCHAR(15)
);

INSERT INTO Cars (name, price, color)
VALUES
  ('Mercedes SL', 123400, '#674EA7'),
  ('BMW M6 Coupé', 125000, '#0000FF'),
  ('Audi R8', 136100, '#FF0000');

Alterando a classe DAO

Aos poucos, vamos converter a classe DAO para acessar banco de dados, primeiramente, vamos desabilitar todos os métodos lançando uma exceção que indica que o código não está pronto:

@Repository
public class CarDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    private static final RowMapper<Car> ROW_MAPPER = BeanPropertyRowMapper.newInstance(Car.class);

    public void add(Car car) {
        throw new UnsupportedOperationException();
    }

    public Car get(long id) {
        throw new UnsupportedOperationException();
    }

    public void edit(Car car) {
        throw new UnsupportedOperationException();
    }

    public void delete(long id) {
        throw new UnsupportedOperationException();
    }

    public List<Car> findAll() {
        throw new UnsupportedOperationException();
    }

}

Listando todos os carros

    public void delete(long id) {
        throw new UnsupportedOperationException();
    }

    public List<Car> findAll() {
        String sql = "SELECT * FROM Cars";
        List<Car> cars = jdbcTemplate.query(sql, ROW_MAPPER);

        return cars;
    }

}

Obtendo um carro

@Repository
public class CarDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    private static final RowMapper<Car> ROW_MAPPER = BeanPropertyRowMapper.newInstance(Car.class);

    public void add(Car car) {
        throw new UnsupportedOperationException();
    }

    public Car get(long id) {
        String sql = "SELECT * FROM Cars WHERE id=?";
        Car car = jdbcTemplate.queryForObject(sql, ROW_MAPPER, id);

        return car;
    }

Excluindo um carro

    public void edit(Car car) {
        throw new UnsupportedOperationException();
    }

    public void delete(long id) {
        String sql = "DELETE FROM Cars WHERE id=?";
        int rows = jdbcTemplate.update(sql, id);

        if (rows == 0) {
            throw new IllegalArgumentException("Carro não encontrado: " + id);
        }
    }

    public List<Car> findAll() {

Editando um carro

    public Car get(long id) {
        String sql = "SELECT * FROM Cars WHERE id=?";
        Car car = jdbcTemplate.queryForObject(sql, ROW_MAPPER, id);

        return car;
    }

    public void edit(Car car) {
        String sql = "UPDATE Cars SET name=?, price=?, color=? WHERE id=?";
        int rows = jdbcTemplate.update(sql, car.getName(), car.getPrice(), car.getColor(), car.getId());

        if (rows == 0) {
            throw new IllegalArgumentException("Carro não encontrado: " + car.getId());
        }
    }

    public void delete(long id) {

Adicionando um carro

@Repository
public class CarDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    private static final RowMapper<Car> ROW_MAPPER = BeanPropertyRowMapper.newInstance(Car.class);

    public void add(Car car) {
        String sql = "INSERT INTO Cars (name, price, color) values (?, ?, ?);";
        jdbcTemplate.update(sql, car.getName(), car.getPrice(), car.getColor());
    }

    public Car get(long id) {

Testando o projeto

Adicione linhas à tabela com o SQL Server Management Studio e veja os dados aparecerem na aplicação e, faça o contrário, utilize as funções de cadastro, alteração ou exclusão de carro e veja o banco ser modificado.

Refletindo sobre MVC

Como a aplicação foi desenvolvida utilizando as melhores práticas, fizemos a alteração na camada Model, tornando os dados dos carros persistentes sem precisar alterar nada nas camadas View e Controller.