Как сделать базовый вызов SELECT FROM для моей базы данных MySQL, используя RESTFUL API с SpringBoot-MyBatis-MySQL? - PullRequest
0 голосов
/ 20 мая 2019

Вопрос довольно простой. Я хочу сделать базовый вызов SELECT * FROm для моей базы данных MySQL, используя вышеупомянутые инструменты. Я буду использовать картограф в стиле XML MyBatis config

Пока что я успешен при использовании строковых операторов

@RestController
@RequestMapping("/")
public class ApplicationRestController {

    Actor actor;
    //this works easily because no connections to SQL are being made.
    @GetMapping("/hello")
    public String hello() {
        return "HELO WORLD";        
    }
}

Но что, если я хочу получить данные из моей базы данных? Как это сделать? Нужен ли мне SqlSession?

У кого-нибудь есть полезная ссылка?

ЭТО МОЯ ОБНОВЛЕННАЯ ОШИБКА:

Ошибка создания бина с именем applicationRestController: неудовлетворен зависимость выражается через поле 'actorMapper'; вложенное исключение org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания бина с именем 'actorMapper', определенного в файле [/Users/helios/Documents/workspace-sts-3.9.8.RELEASE/mybatis-sakila/target/classes/com/helios/mybatissakila/mappers/ActorMapper.class]: Неудовлетворенная зависимость выражается через свойство бина 'SqlSessionFactory'; вложенное исключение org.springframework.beans.factory.BeanCreationException: ошибка создание бина с именем sqlSessionFactory, определенного в пути к классу ресурс [Орг / mybatis / весна / загрузки / Автоконфигурирование / MybatisAutoConfiguration.class]: Не удалось создать экземпляр объекта с помощью фабричного метода; вложенное исключение org.springframework.beans.BeanInstantiationException: не удалось instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory метод sqlSessionFactory вызвал исключение; вложенное исключение org.springframework.core.NestedIOException: не удалось проанализировать сопоставление ресурс: ресурс класса путь [Mybatis-Sakila / SRC / основной / ресурсы / mybatis-картостроитель / ActorMapper.xml] '; вложенное исключение

java.io.FileNotFoundException: ресурс пути к классу [Mybatis-Sakila / SRC / основной / ресурсы / mybatis-картостроитель / ActorMapper.xml] не может быть открыт, потому что он не существует

Это мои соответствующие файлы:

Actor.java

public class Actor {

    private static final long serialVersionUID = 1L;

    private int actor_id;
    private String first_name;
    private String last_name;
    private Date last_update;

    public int getActor_id() {
        return actor_id;
    }
    public void setActor_id(int actor_id) {
        this.actor_id = actor_id;
    }
    public String getFirst_name() {
        return first_name;
    }
    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }
    public String getLast_name() {
        return last_name;
    }
    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }
    public Date getLast_update() {
        return last_update;
    }
    public void setLast_update(Date last_update) {
        this.last_update = last_update;
    }
}

ActorMapper.java

import org.apache.ibatis.annotations.Mapper;
import org.springframework.beans.factory.annotation.Autowired;  
import com.helios.mybatissakila.model.Actor;

@Mapper
public interface ActorMapper {

    List <Actor> selectAllActors();
}

ApplicationRestController.java

@RestController
@RequestMapping("/")
public class ApplicationRestController {

    @Autowired
    ActorMapper actorMapper;

    //working as not connected to mysql
    @GetMapping("/hello")
    public String hello() {
        return "MyBatis + SpringBoot + MySQL!";

    }
    //error 
    @GetMapping("/actors")
    public List<Actor> selectAllActors(){
            return actorMapper.selectAllActors();
    }
}

ActorMapper.xml

<resultMap id="ActorResultMap" type="Actor">
    <id column="actor_id" property="actor_id" jdbcType="INTEGER"/>
    <result column="first_name" property="first_name" />
    <result column="last_name" property="last_name" />
    <result column="last_update" property="last_update" />
</resultMap>

<select id="selectAllActors" resultMap="ActorResultMap">
        select * from actor
</select>

application.properties

server.port = 9090

spring.datasource.url= jdbc:mysql://localhost:3306/sakila
spring.datasource.username = root
spring.datasource.password = password
spring.datasource.dbcp2.test-while-idle= true
spring.datasource.dbcp2.validation-query= select 1

#mybatis entity scan packages
mybatis.type-aliases-package=com.helios.mybatissakila.model
#Mapper.xml location
mybatis.mapper-locations=classpath*:mybatis-sakila/src/main/resources/ActorMapper.xml
mybatis.typeAliasesPackage=com.helios.mybatissakila.model.Actor

logging.level.root=WARN
logging.level.sample.mybatis.mapper=TRACE

У меня есть подозрение, что это неправильно, вы также можете помочь мне исправить это? Является ли " classpath " просто эталонным кодом, который следует заменить на реальное значение?

mybatis.mapper-locations=classpath*:mybatis-sakila/src/main/resources/ActorMapper.xml

Примечание : мне удалось выполнить вызовы REST API с использованием стиля @Annotation, но я хочу использовать стиль XML.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Хорошо, вот как я это исправил:

Как я и подозревал, classpath был основным фактором для этой работы. После того, как я указал правильный путь в application.properties :

mybatis.mapper-locations=classpath:/mybatis-mapper/ActorMapper.xml

Мне удалось сделать вызов SELECT из MySQL. Разве это не интересно? :)

1 голос
/ 20 мая 2019

Вам не нужна SqlSession, MyBatis использует свою собственную реализацию, единственное, что вам нужно сделать, это создать конфигурацию MyBatis и установить все ее зависимости.

Проще говоря, вам нужно выполнить следующее:

Создайте свой POJO:

public class Dog{
   private Long id;
   private String name;

  //Getters and Setters
}

Затем вам нужно создать интерфейс отображения MyBatis в java:

public interface DogMapper{
   public void insert(Dog dog);
}

Затем у вас есть DogMapper.xml, куда вы помещаете свои запросы.

И, наконец, вы бы назвали свой запрос следующим образом:

@Service
public class DogService{
   @Autowired
   private DogMapper dogMapper;

   public void insert(Dog dog){
       dogMapper.insert(dog);
   }
}

Это слишком упрощенный способ работы вещей в MyBatis, однако я бы посоветовал вам взглянуть на какой-нибудь пример MyBatis CRUD.Там будет подробное описание того, как все сделать, и, кроме того, очень важная конфигурация.

...