SpringBoot详解整合MyBatis过程中可能遇到的问题

 更新时间:2022年07月04日 09:17:17   作者:RAIN 7  
因为Spring Boot框架开发的便利性,所以实现Spring Boot与数据访问层框架(例如MyBatis)的整合非常简单,主要是引入对应的依赖启动器,并进行数据库相关参数设置即可

尽量不要用 jUnit 提供的单元测试

提一个要求尽量使用SpringBoot 提供的测试类进行测试,能够自动扫描组件以及使用容器中的bean对象

还有如果有组件 中存在注入对象的话,那么必须在SpringBoot容器中取出 这个组件,进而使用注入的对象的功能!!!

今天有个错误,花了很长时间来解决,最后发现是一个很低级很基础的错误!

这是mapper接口,使用@mapper 相当于将接口的代理对象注册进入bean中,但是上下文中找不到(其实是正常)

因为 @Mapper 这个注解是 Mybatis 提供的,而 @Autowried 注解是 Spring 提供的,IDEA能理解 Spring 的上下文,但是却和 Mybatis 关联不上。而且我们可以根据 @Autowried 源码看到,默认情况下,@Autowried 要求依赖对象必须存在,那么此时 IDEA 只能给个红色警告了。

package com.bit.mapper;
import com.bit.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserMapper {
    User selectById(@Param("userid") Integer id);
}

这是与mapper接口对应的xml文件,同样也没有问题

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bit.mapper.UserMapper">
        <select id="selectById" resultType="com.bit.pojo.User">
            select * from users where id = #{userid}
        </select>
</mapper>

将java目录下的xml文件加入resource资源中,在build 标签中嵌套,同样没有问题

<resources>    
    <resource>        
        <directory>src/main/java</directory>        
        <includes>            
            <include>**/*.xml</include>        
        </includes>    
    </resource>
</resources>

然后我们写service层,写了一个UserService接口,有些了一个UserServiceImpl 接口的实现类

在这个实现类中,注入UserMapper 一直提示无法注入,我一直认为有问题(但是最后发现没问题)

把service实现类写完了,也没问题

package com.bit.service;
import com.bit.mapper.UserMapper;
import com.bit.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private UserMapper userMapper;
    @Override
    public User queryById(Integer id) {
        System.out.println("进入了service");
        return userMapper.selectById(id);
    }
}

然后我直接去测试了,我测试的呢?

实例化了UserService,new了一个对象,然后直接调用方法,看是否能够调用UserMapper查询到数据库。然后就不断的包 空指针异常的错误

@SpringBootTest
class BitApplicationTests {
    @Test
    void contextLoads() {
        UserService userService = new UserServiceImpl();
        userService.queryById(13);
        System.out.println(userService);
        System.out.println(userService.queryById(15));
        System.out.println(userService.queryById(13));
    }
}

  我一度以为是mapper接口没有注入到UserServcie中,导致调用UserServcie的方法 就是调用 UserMapper的方法是空的,以为是Mapper接口的问题,各种搜索怎么解决,经过几个小时之后,在他人的博客中找到了答案

  我们的UserMapper 注入到了 UserServiceImpl ,我们不能直接使用 UserServcieIml, 如果在其他的类中进行使用其功能,必须将这个类注入到 当前类中,从容器中拿到这个UserService,才能正确的进行调用,不会发生空指针异常,我一直没有发现,这是也该非常低级的错误。

正确做法: 先装配到当前对象中,再从容器中拿到bean进行使用

@SpringBootTest
class BitApplicationTests {
    @Autowired
    private UserService userService;
    @Test
    void contextLoads() {
        System.out.println(userService.queryById(15));
        System.out.println(userService.queryById(13));
    }
}

到此这篇关于SpringBoot详解整合MyBatis过程中可能遇到的问题的文章就介绍到这了,更多相关SpringBoot MyBatis内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成多数据源解析

    SpringBoot集成多数据源解析

    这篇文章主要介绍了SpringBoot集成多数据源解析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 剑指Offer之Java算法习题精讲二叉树专题篇下

    剑指Offer之Java算法习题精讲二叉树专题篇下

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • java 定时器线程池(ScheduledThreadPoolExecutor)的实现

    java 定时器线程池(ScheduledThreadPoolExecutor)的实现

    这篇文章主要介绍了java 定时器线程池(ScheduledThreadPoolExecutor),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Spring Data Jpa 中原生查询 REGEXP 的使用详解

    Spring Data Jpa 中原生查询 REGEXP 的使用详解

    这篇文章主要介绍了Spring Data Jpa 中原生查询 REGEXP 的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 基于@RequestMapping 用法详解之地址映射

    基于@RequestMapping 用法详解之地址映射

    这篇文章主要介绍了@RequestMapping 用法详解之地址映射,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • java实现上传和下载工具类

    java实现上传和下载工具类

    这篇文章主要为大家详细介绍了java实现上传和下载工具类,文件上传到ftp服务工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java的ArrayList扩容源码解析

    Java的ArrayList扩容源码解析

    这篇文章主要介绍了Java的ArrayList扩容源码解析,通过动态扩容,ArrayList能够在添加元素时保持高效的性能,扩容操作是有一定开销的,但由于扩容的时间复杂度为O(n),其中n是当前元素个数,所以平均情况下,每次添加元素的时间复杂度仍然是O(1),需要的朋友可以参考下
    2024-01-01
  • Spring Boot+Drools规则引擎整合详解

    Spring Boot+Drools规则引擎整合详解

    本篇文章主要介绍了Spring Boot+Drools规则引擎整合,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • java设计模式--策略模式详解

    java设计模式--策略模式详解

    这篇文章主要介绍了Java经典设计模式之策略模式,简单说明了策略模式的概念、原理并结合实例形式分析了java策略模式的具有用法与相关注意事项,需要的朋友可以参考下
    2021-07-07
  • Spring Mvc中CommonsMultipartFile的特性实例详解

    Spring Mvc中CommonsMultipartFile的特性实例详解

    这篇文章主要给大家介绍了关于Spring Mvc中CommonsMultipartFile特性的相关资料,SpringMVC拥有强大的灵活性,非侵入性和可配置性,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论