web-dev-qa-db-fra.com

Connexion de JDBCTemplate Spring Boot à SQL Server (MSSQL)

Je suis très nouveau dans Spring Boot et je ne parviens pas à configurer mon projet de manière à ce qu'il puisse communiquer avec SQL Server - plus précisément, ma variable d'instance JDBCTemplate est null et, pour une raison quelconque, n'est pas "auto-câblé" avec la source de données que j'ai spécifiée dans mon fichier application.properties. Ce sont les mesures que j'ai prises jusqu'à présent:

  1. À l'aide de STS, j'ai créé un nouveau projet Spring Boot à l'aide du modèle de projet Spring Start.
  2. J'ai sélectionné Gradle selon le type et coché JDBC.
  3. J'ai ensuite suivi le didacticiel suivant pour créer une interface abstraite (DAO) pour SQL Server ( http://www.tutorialspoint.com/spring/spring_jdbc_example.htm ).
  4. Si vous faites défiler la page du didacticiel jusqu'au bit MainApp.Java, les 4 premières lignes de la méthode principale que je n'ai pas utilisées - car je n'ai pas de fichier beans.xml. C’est là que je suppose que l’annotation @Autowired de Spring Boot entre en jeu et crée mes haricots pour moi?
  5. J'ai téléchargé le fichier jar de SQL Server auprès de Microsoft et l'a ajouté à mon projet en tant que fichier JAR externe en cliquant avec le bouton droit de la souris sur mon projet -> Chemin de construction -> Configurer le chemin de construction -> Ajouter des fichiers JAR externes .. '. Cela supprimait une erreur indiquant que le driverClassName que j'ai spécifié dans mon fichier application.properties était introuvable.

Je vais commencer par afficher le contenu de mon fichier 'application.properties':

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=testdb
spring.datasource.username=sa
spring.datasource.password=myPassword
spring.datasource.driverClassName=com.Microsoft.sqlserver.jdbc.SQLServerConnection
spring.datasource.initialize=true

Ci-dessous, ma classe 'JDBCTemplate.Java' qui contient mes méthodes CRUD:

package demo;

import Java.util.List;

import org.Apache.Tomcat.jdbc.pool.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

public class BranchJDBCTemplate implements BranchDAO {

    private DataSource dataSource;

    @Autowired
    protected JdbcTemplate jdbcTemplateObject;

    @Autowired
    @Override
    public void setDataSource(DataSource ds) {
        this.dataSource = ds;
        this.jdbcTemplateObject = new JdbcTemplate(dataSource);
    }

    @Override
    public void create(String name) {
        String SQL = "insert into branches (name) values (?)";
        jdbcTemplateObject.update(SQL, name);
        System.out.println("Created Record Name = " + name);
        return;
    }

    @Override
    public Branch getBranch(Integer id) {
        String SQL = "select * from branches where id = ?";
        Branch student = jdbcTemplateObject.queryForObject(SQL, 
                    new Object[]{id}, new BranchMapper());
        return student;
    }

    @Override
    public List<Branch> listBranches() {
        String SQL = "select * from branches";
        List <Branch> branches = jdbcTemplateObject.query(SQL, new BranchMapper());
        return branches;
    }

    @Override
    public void delete(Integer id) {
        String SQL = "delete from branches where id = ?";
        jdbcTemplateObject.update(SQL, id);
        System.out.println("Deleted Record with ID = " + id );
        return;
    }

    @Override
    public void update(Integer id, String name) {
        String SQL = "update Student set name = ? where id = ?";
        jdbcTemplateObject.update(SQL, id);
        System.out.println("Updated Record with ID = " + id );
        return;
    }

}

Et enfin, voici ma classe 'CustController.Java' qui contient le mappage de demandes dans lequel j'utilise la classe JDBCTemplate pour effectuer une opération de base de données:

package demo;

import Java.util.List;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CustController {

    @RequestMapping("/customer")
    public Cust customer(@RequestParam(value="name", required=false, defaultValue="World") String name) {

        BranchJDBCTemplate branchTemplate = new BranchJDBCTemplate();

        List<Branch> branchesList = branchTemplate.listBranches();

        for (Branch branch : branchesList) {
            System.out.print("ID : " + branch.getId());
        }

        return new Cust(12, "Test", "Test");

    }

}

Le problème que je rencontre comme mentionné précédemment est que mon instance de jdbcTemplateObject ...

protected JdbcTemplate jdbcTemplateObject;

est null et donc jette une exception sur la ligne suivante:

List <Branch> branches = jdbcTemplateObject.query(SQL, new BranchMapper());

Il n'est pas initialisé automatiquement. Quelqu'un peut-il indiquer ce que je fais mal?

Merci beaucoup!

Tony

5
tony

Vous avez raison, vous devez disposer de beans.xml avec la source de données configurée.

Dans la méthode client () de la classe CustController, vous utilisez un nouvel opérateur en tant que:

    BranchJDBCTemplate branchTemplate = new BranchJDBCTemplate();

et ainsi, cette instance branchTemplate n'est pas gérée par un ressort et la source de données n'est donc pas auto-câblée, ce qui entraîne la valeur null de jdbctemplate.

À la place, utilisez l'annotatioan comme:

    @Repository("branchDao")
    public class BranchJDBCTemplate implements BranchDAO {
    ...
    }

et accédez à branchTemplate dans CustController en tant que:

    @RestController
    public class CustController {
        @Autowired
        @Qualifier("branchDao")
        BranchJDBCTemplate branchTemplate;  
        ...
    }   
7
Prasad

essayez d'utiliser les éléments suivants dans votre fichier application.properties

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=testdb;integratedSecurity=false;
1
Prasad Khode