不使用实体类的情况下接收SQL查询结果、@Autowired注入为null解决

news2025/2/27 8:15:08

目录

一、场景

二、环境

三、使用

1、数据库表以及数据准备

2、项目导入必要依赖

3、添加连接数据库配置文件

4、编写测试方法

5、执行结果

四、将SQL单独提取出来

2.1 定义查询接口方法

2.2 测试

2.3 测试结果

五、问题记录: @Autowired注入失败/null的情况,

        1、通过上下文对象拿到Bean对象

        2、使用@PostConstruct注入

        3、实现ApplicationContextAware接口


一、场景

1、不使用实体类的情况下接收SQL查询结果

2、@Autowired注入为null解决

二、环境

springboot  2.7.0

maven 3.8

mysql 8.x

三、使用

        这边直接在测试方法中进行测试;

1、数据库表以及数据准备

-- boot_mybatis.t_user definition

CREATE TABLE `t_user` (
  `u_id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_name` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '用户登录名',
  `email` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '邮箱',
  `pass_word` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '密码',
  `birth` date DEFAULT NULL COMMENT '生日',
  `gender` bigint NOT NULL DEFAULT '2' COMMENT '性别,0:男,1:女,2:保密',
  PRIMARY KEY (`u_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=89 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;


INSERT INTO boot_mybatis.t_user (u_id, user_name, email, pass_word, birth, gender) VALUES(81, '李四', '456@qq.cpm', '456', '2022-10-02', 0);
INSERT INTO boot_mybatis.t_user (u_id, user_name, email, pass_word, birth, gender) VALUES(82, '张三', '45679@qq.cpm', '123', '2022-10-02', 0);
INSERT INTO boot_mybatis.t_user (u_id, user_name, email, pass_word, birth, gender) VALUES(88, '李白', '1234@qq.com', '456', '2022-11-21', 1);

2、项目导入必要依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

3、添加连接数据库配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3308/boot_mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True
    username: root
    password: root

4、编写测试方法

    @Autowired
    private ApplicationContext applicationContext;

    @Test
    public void test06() throws SQLException {
        DataSource dataSource = applicationContext.getBean(DataSource.class);
        Connection connection = dataSource.getConnection();
        Statement statement = connection.createStatement();
        String sql ="SELECT u_id , user_name, email, pass_word, birth, gender FROM boot_mybatis.t_user";
        ResultSet resultSet = statement.executeQuery(sql);

        // 组装保存查询结果的数据结构
        List<Map<String,Object>> resultList = new ArrayList<>();
        List<Object> ids = new ArrayList<>();
        List<Object> userNames = new ArrayList<>();
        List<Object> emails = new ArrayList<>();
        Map<String, Object> resMap = new HashMap<>();
        while (resultSet.next()){
            String id = resultSet.getString(1);
            String userName = resultSet.getString(2);
            String email = resultSet.getString(3);
            ids.add(id);
            userNames.add(userName);
            emails.add(email);
        }

        resMap.put("id",ids);
        resMap.put("userName",userNames);
        resMap.put("email",emails);
        resultList.add(resMap);

       // 打印结果
       resultList.forEach(res->{
           System.out.println(res);
           // 某列的List
           Object resIds = res.get("id");
           System.err.println("resIds:"+resIds);
       });

        // 手动关闭
        statement.close();
        connection.close();
    }

5、执行结果

四、将SQL单独提取出来

2.1 定义查询接口方法

@Mapper
public interface IUserMapper {

    List<Map<String,Object>> selectUsers();
}

方法实现:

    <select id="selectUsers" resultType="java.util.Map">
        SELECT u_id as id ,
               user_name as userName, 
               email, 
               pass_word as pwd, 
               birth, gender 
        FROM boot_mybatis.t_user
    </select>

2.2 测试

    @Autowired
    private IUserMapper userMapper;

    @Test
    public void test02(){
        List<Map<String,Object>> resultList = userMapper.selectUsers();
        resultList.forEach(res->{
            // 查看某列的结果
            String userName = res.get("userName").toString();
            System.out.println(userName);
        });
    }

2.3 测试结果

 

五、问题记录: @Autowired注入失败/null的情况,

        检查必要注解是否均已添加、若依然注入失败、此处提供三种办法解决

不一定都适用、具体情况具体分析。以下方法我均已测试通过

        1、通过上下文对象拿到Bean对象

    @Autowired
    private ApplicationContext applicationContext;

    @Test
    public void test03(){
        IUserMapper userMapper = applicationContext.getBean(IUserMapper.class);
        userMapper.selectUsers();
    }

        2、使用@PostConstruct注入

@Component
public class IUserServiceTest {

    @Autowired
    private IUserMapper userMapper;
    static IUserServiceTest userService;

    @PostConstruct
    public void init(){
        userService  = this;
        userMapper = userService.userMapper ;
        userMapper.selectUsers();
    }
}

使用:

    @Autowired
    private IUserServiceTest userServiceTest;

    @Test
    public void test04(){
        userServiceTest.init();
    }

        3、实现ApplicationContextAware 接口

@Component
public class ApplicationContextHelper implements ApplicationContextAware {
    private static DefaultListableBeanFactory springFactory;
    private static ApplicationContext context;

    public ApplicationContextHelper() {
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }

    public static ApplicationContext getContext() {
        return context;
    }

    public static Object getBean( String beanName) {
      return context.getBean(beanName);
    }

    public static <T> T getBean(Class<T> type) {
        return context.getBean(type);
    }
}

使用:通过类名调用静态方法即可

    @Test
    public void test05(){
        IUserMapper userMapper = ApplicationContextHelper.getBean(IUserMapper.class);
        userMapper.selectUsers();
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

b、B、KB、Kib、MB、MiB、GB、GiB、TB、TiB的区别

1024这个数字&#xff0c;想必计算机行业从业人员应该不会陌生&#xff0c;甚至10月24日还被当做程序员日&#xff0c;如果你问一个程序员1GB等于多少MB,他大概率会不假思索回答:1024。 没错&#xff0c;对于稍微对计算机或者网络有了解的人&#xff0c;一般都认为1024是数据容…

最短路算法 - dijkstra

最短路算法 - dijkstra1. 算法介绍2. 实战2.1 Reachable Nodes In Subdivided Graph3 参考1. 算法介绍 算法目的&#xff1a;求图中某点 s 到其余各点的最短距离 算法步骤&#xff1a; 初始化距离数组 dis 和优先级队列&#xff0c;其中 dis[i] 表示 s 点到当前 i 点的最短距…

树莓派上搭建SVN服务器

目录 一、服务端安装步骤 1.安装svn 2.创建目录 3.创建版本仓库 4.修改配置&#xff08;authz,passwd,svnserve.conf&#xff09; 5.启动服务 二、tortoisSVN客户端安装 三、结束 一、服务端安装步骤 1.安装svn sudo apt-get install subversion 2.创建目录 sudo m…

品RocketMQ 源码,学习并发编程三大神器

这篇文章&#xff0c;笔者结合 RocketMQ 源码&#xff0c;分享并发编程三大神器的相关知识点。 1 CountDownLatch 实现网络同步请求 CountDownLatch 是一个同步工具类&#xff0c;用来协调多个线程之间的同步&#xff0c;它能够使一个线程在等待另外一些线程完成各自工作之后&…

selenium--获取页面信息和截图

获取页面信息namecurrent_urltitlecurrent_window_handlewindow_handlespage_source简单用法—— 判断页面截图1.get_screenshot_as_png2.get_screenshot_as_file获取页面信息 主要方法如下图&#xff1a; 介绍一下常用的方法&#xff1a; name 获取浏览器名字 current_u…

Packet Tracer 实验 - 排除多区域 OSPFv3 故障

地址分配表 设备 接口 IPv6 全局单播地址 IPv6 本地链路地址 默认网关 ISP GigabitEthernet0/0 2001:DB8:C1:1::1/64 FE80::C1 不适用 ASBR GigabitEthernet0/0 2001:DB8:C1:1::2/64 FE80::7 不适用 Serial0/0/0 2001:DB8:A8EA:F0A::1 FE80::7 不适用 S…

如何通过 kubectl 进入 node shell

概述 假设这样一个场景&#xff1a; 生产环境中&#xff0c;Node 都需要通过堡垒机登录&#xff0c;但是 kubectl 是可以直接在个人电脑上登录的。 这种场景下&#xff0c;我想要通过 kubectl 登录到 K8S 集群里的 Node&#xff0c;可以实现吗&#xff1f; 可以的&#xff…

LinkedList与链表

目录 1.链表 2.链表的模拟实现 3.LinkedList的模拟实现 4.LinkedList的使用 4.1 什么是LinkedList 4.2 LinkedList的使用 5.ArrayList和LinkedList的区别 我的GitHub&#xff1a;Powerveil GitHub 我的Gitee&#xff1a;Powercs12 (powercs12) - Gitee.com 皮卡丘每天学…

机器人十大前沿热点领域(2022-2023)

中国电子学会嵌入式系统与机器人分会主任委员、北京航空航天大学机器人研究所名誉所长、中关村智友研究院院长王田苗博士出席大会闭幕式&#xff0c;并现场发布《机器人十大前沿热点领域(2022-2023)》。归纳出2022-2023年机器人十大前沿技术&#xff1b;并结合我国国情和机器人…

自动化项目倍加福测距仪QSM WCS RS485 与西门子S7 200通信

1、程序流程图 2、WCS位置数据处理流程 第一步&#xff1a;设置S7-200的RS485的通讯波特率19.2kbps&#xff0c;通讯格式&#xff08;8&#xff0c;1&#xff0c;E&#xff09;&#xff1b; 第二步&#xff1a;PLC向WCS发送请求码&#xff1a; A0A1为0&#xff0c;表示读码器地…

现代密码学导论-16-选择明文攻击和CPA安全

目录 PCA不可区分实验 DEFINITION 3.21 PCA安全的加密方案 LR预言机实验 DEFINITION 3.22 多明文PCA安全的加密方案 THEOREM 3.23 定义3.21和定义3.22等价 PCA不可区分实验 通过运行G(1^n)获得密钥k敌手A被给定输入1^n并拥有访问预言机Enck()的权利&#xff0c;敌手A输出一…

想要精通算法和SQL的成长之路 - 无重叠区间

想要精通算法和SQL的成长之路 - 无重叠区间前言一. 无重叠区间前言 想要精通算法和SQL的成长之路 - 系列导航 一. 无重叠区间 原题链接 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互…

神经网络和深度学习-处理多维特征的输入

处理多维特征的输入 前面有两个数据集&#xff0c;一个回归&#xff0c;一个分类。 在回归中输出y属于实数&#xff0c;而在分类中输出y属于一个离散的集合 例如在糖尿病分类的数据集中Diabetes Dataset&#xff0c;每一行作为一个sample&#xff08;样本&#xff09;&#x…

Node.js 入门教程 11 Node.js 从命令行接收参数

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程11 Node.js 从命令行接收参数11 Node.js 从命令行接收参数 当使用以下命令调用 Node.js 应用程序时&#xff0c;可以传入任…

Android -- 每日一问:两个 Activity 之间如何传递参数?

经典回答 使用 Intent 的 Bundle 协带参数&#xff0c;就是我们常用的 Intent.putExtra 方法。 除了传递基本类型外&#xff0c;如何传递自定义的对象呢&#xff1f; 这个问题就是想引出 Android 的 Parcelable 。一般很多面试者都有用过传递实现了Serializable接口的自定义对…

JavaWeb学习-监听器

什么是监听器? 类似于前端的事件绑定,java中的监听器用于监听web应用中某些对象、信息的创建、销毁、增加&#xff0c;修改&#xff0c;删除等动作的发生&#xff0c;然后作出相应的响应处理。当范围对象的状态发生变化的时候&#xff0c;服务器自动调用监听器对象中的方法。…

Flutter高仿微信-第54篇-群聊-邀请好友

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; import package:flutter/material.dart; import package…

【JavaEE】HTML

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、HTML概述二、【HTML常见标签】1. 注释标签2. 标题标签&#xff1a;h1-h63. 段落标签&#xff1a;p4.换行标签&#xff1a;br5.【格式化标签】5. 图片标签&#xff1a;img 【单标签&#xff0c;没有结束标签】…

HTML+CSS简单漫画网页设计成品 蜡笔小新3页 大学生个人HTML网页制作作品

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

GreenPlum AOCO列存读IO原理

GreenPlum AOCO列存读IO原理GP自带AOCO列存&#xff0c;它的IO和heap表的IO是分开的。Heap表的脏数据由checkpoint或后台write进程刷写&#xff0c;也就是FlushBuffer函数调用smgrwrite。由magnetic disk storage manager管理IO模块。但是AOCO列存则是由本身进行管理&#xff0…