如何使用带有 SpringBoot-MyBatis-MySQL 的 RESTFUL API 对我的 MySQL 数据库进行基本 SELECT FROM 调用?

Posted

技术标签:

【中文标题】如何使用带有 SpringBoot-MyBatis-MySQL 的 RESTFUL API 对我的 MySQL 数据库进行基本 SELECT FROM 调用?【英文标题】:How to Make a Basic SELECT FROM call to my MySQL database using RESTFUL API with SpringBoot-MyBatis-MySQL? 【发布时间】:2019-10-06 17:49:29 【问题描述】:

问题很简单。我想使用上面提到的工具对我的 mysql 数据库进行基本的 SELECT * FROm 调用。 我将使用 XML 样式的映射器 MyBatis 配置

到目前为止,我在使用字符串语句时成功

@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”的 bean 时出错:不满意 通过字段“actorMapper”表示的依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建文件中定义的名称为“actorMapper”的 bean 时出错 [/Users/helios/Documents/workspace-sts-3.9.8.RELEASE/mybatis-sakila/target/classes/com/helios/mybatissakila/mappers/ActorMapper.class]: 通过 bean 属性表示的不满足的依赖关系 'sqlSessionFactory';嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建在类路径中定义的名称为“sqlSessionFactory”的bean 资源 [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: 通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化[org.apache.ibatis.session.SqlSessionFactory]:工厂 方法“sqlSessionFactory”抛出异常;嵌套异常是 org.springframework.core.NestedIOException:无法解析映射 resource: '类路径资源 [mybatis-sakila/src/main/resources/mybatis-mapper/ActorMapper.xml]'; 嵌套异常是

java.io.FileNotFoundException:类路径资源 [mybatis-sakila/src/main/resources/mybatis-mapper/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

注意:我已经设法使用@Annotation 样式执行 REST API 调用,但我想使用 XML 样式。

【问题讨论】:

有什么可以帮助您的吗? @ilovesyntax 帮帮我,先生,我卡住了。我想使用 XML-style 在 mybatis-springboot-mysql 中使用 xml-style 制作一个 rest api 这很容易做到,谷歌一下。 【参考方案1】:

你不需要SqlSession,MyBatis使用自己的实现,你唯一需要做的就是创建MyBatis配置并设置它的所有依赖。

简单来说,你需要做到以下几点:

创建你的 POJO:

public class Dog
   private Long id;
   private String name;

  //Getters and Setters

那么你需要在java中创建MyBatis的mapper接口:

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 示例。会有详细的说明如何做,以及非常重要的配置。

【讨论】:

我对此有所了解。我已经做了注释,但我想做的是 XML 样式,因为它支持更复杂的 SQL 查询。感谢您的宝贵时间。 在我看到您对上一个问题所做的更改后,xml 文件似乎有问题。尝试将其整体复制而不是仅复制其中的一部分,因为某些设置可能设置不正确。 进一步添加您的数据库表的外观。 我现在已经修复了我认为的 xml 文件错误,因为该错误现在看起来与缺少的“bean”依赖项有关【参考方案2】:

好的,我就是这样解决的:

正如我所怀疑的那样,类路径是完成这项工作的主要因素。一旦我在 application.properties 中提供了正确的路径:

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

我能够从 MySQL 进行 SELECT 调用。这不是很有趣吗? :)

【讨论】:

以上是关于如何使用带有 SpringBoot-MyBatis-MySQL 的 RESTFUL API 对我的 MySQL 数据库进行基本 SELECT FROM 调用?的主要内容,如果未能解决你的问题,请参考以下文章

springBoot-mybatis+druid多数据源

SpringBoot-mybatis

springboot-mybatis配置(xml)/springboot-jpa配置

springboot-mybatis 批量insert

springboot-mybatis多数据源以及踩坑之旅

springboot踩坑出坑记