当前位置: 首页 > article >正文

MyBatisPlus+SpringBoot+JavaFX连接查询

前言

一般使用SprootBoot是使用SprootBootTest和Junit配合,但如果不是写测试类,怎么与javafx配合使用?笔者不知道,经过多次搜索以及问了各种AI,最后误打误撞,终于想通了,其实很简单。

用了许久时间,终于成功了。关于这三者的配置,笔者就不多说,可以参看官网或者其他方式获得配置。

正文

废话不多说,直接进入主题。假设三者已经配置好了。

运行后的UI界面如下图所示。

输入手机号和用户密码,进行登录操作,在登录过程中,此时就需要查数据库(MySQL),在确定按钮对应的槽函数(ok)的代码如下:

        ApplicationContext context = TakeAwayPlusApplication.getContext();
        customerMapper = context.getBean(CustomerMapper.class);

可能第一眼感觉懵逼,不能理解,且听笔者细细道来。

第一行代码

ApplicationContext context = TakeAwayPlusApplication.getContext();

 TakeAwayPlusApplication:这个是SprootBoot的启动器,项目的名字叫 TakeAwayPlus,

说白了,这是一个类。

getContext:很明显,这是一个静态方法,因为没有使用new来调用这个方法。

ApplicatiionContext:是getContext方法返回值的对象类型

总之,TakeAwayPlusApplication调用了一个静态方法,返回了ApplicatiionContext对象。

下一步进入getContext方法,其中TakeAwayPlusApplication代码如下。

package dbtest.dbutils.takeawayplus;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;


@SpringBootApplication
@MapperScan("dbtest.dbutils.takeawayplus.mapper")
public class TakeAwayPlusApplication{


	public static void main(String[] args) {
		SpringApplication.run(TakeAwayPlusApplication.class, args);
	}

	public static ApplicationContext getContext() {
		return SpringApplication.run(TakeAwayPlusApplication.class);
	}
}

视角给到getContext方法。

getContext需要返回ApplicationContext对象,而 SpringApplication.run(TakeAwayPlusApplication.class)的返回实际是

ConfigurableApplicationContext对象,但是二者有继承关系,如下图所示。
 

 这一步其实是最关键的。笔者之所以会有这个想法,问了各种Al和许多大佬的代码,有的代码需要Controller,有的需要init方法等,总之,不能运行。而GitHub Copliot给出的代码,其实很接近了。笔者也是从GitHub Copliot的代码中,进一步修改,最后运行成功。把Github Copliot给出的原话如下。

在你的 Login 类中,你试图使用 @Autowired 注解来注入 CustomerMapper。然而,你的 Login 类是一个 JavaFX 控制器,它并不是由 Spring 管理的,所以 Spring 无法为它注入依赖。

 要解决这个问题,你需要在你的 Spring Boot 应用启动类中获取到 ApplicationContext,然后使用它来获取 CustomerMapper 的实例。以下是一个示例:

 首先,修改你的 TakeAwayPlusApplication 类,使其实现 ApplicationContextAware 接口

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

@SpringBootApplication
@MapperScan("dbtest.dbutils.takeawayplus.mapper")
public class TakeAwayPlusApplication implements ApplicationContextAware {

    private static ApplicationContext context;

    public static void main(String[] args) {
        SpringApplication.run(TakeAwayPlusApplication.class, args);
    }

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

    public static ApplicationContext getContext() {
        return context;
    }
}

然后,在你的 Login 类中,使用 TakeAwayPlusApplication.getContext() 来获取 ApplicationContext,然后使用它来获取 CustomerMapper 的实例:

public class Login implements Initializable {
    private CustomerMapper customerMapper;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        ApplicationContext context = TakeAwayPlusApplication.getContext();
        customerMapper = context.getBean(CustomerMapper.class);
        // 其他代码...
    }

    // 其他代码...
}

这样,你就可以在 Login 类中使用 CustomerMapper 了。

 可惜返回的context为null,不是ApplicationContext对象。后来笔者继续追问,为什么context为空?但也只是在上面的代码做出一点修改,并没有实际解决,context还是为null,后面代码也就不用看了,肯定不能执行。

但在笔者不停的追问过程中,GitHub Copliot说了下面这些话。

在 Spring Boot 应用中,你不需要手动创建 ApplicationContext。当你启动 Spring Boot 应用时,Spring Boot 会自动为你创建一个 ApplicationContext。例如,当你调用 SpringApplication.run(TakeAwayPlusApplication.class, args); 时,Spring Boot 就会创建一个 ApplicationContext。 

上面这句话的意思是SpringApplication.run(TakeAwayPlusApplication.class, args)有返回值,会返回一个 ApplicationContext对象。既然如此,笔者直接调用这行代码。

public static ApplicationContext getContext() {
		return SpringApplication.run(TakeAwayPlusApplication.class);
	}
}

代码运行成功。完美,其他发现没有用,都可以删除,代码能跑(0.0)(0.0)。

第二行代码

customerMapper = context.getBean(CustomerMapper.class);

废话不多说,就是调用getBean方法,返回了mapper接口。

mapper接口中的具体方法,就不多说,具体方法,具体实现。

运行结果

打印context和mapper接口,结果如图所示。

运行成功。


http://www.kler.cn/a/159513.html

相关文章:

  • 报错 No available slot found for the embedding model
  • Go语言的零值可用性:优势与限制
  • 【Linux网络编程】简单的UDP网络程序
  • 基于Spring Boot的在线性格测试系统设计与实现(源码+定制+开发)智能性格测试与用户个性分析平台、在线心理测评系统的开发、性格测试与个性数据管理系统
  • 【Window主机访问Ubuntu从机——Xrdp配置与使用】
  • Shell 脚本中的大小写陷阱:为什么 ${PWD} 而不是 ${pwd}?
  • 技术阅读周刊第第8️⃣期
  • Temporal table join requires an equality condition on fields of table
  • 【2】基于多设计模式下的同步异步日志系统-设计模式
  • git小白初学习
  • 腾讯云位居中国分布式关系型数据库“领导者”类别
  • 基于SSM实现的公文管理系统
  • 玩转数据8:数据质量管理与数据清洗的实践
  • 深度学习火车票识别系统 计算机竞赛
  • 石油化工园区:安全管理工作中的挑战与措施
  • 【上海大学数字逻辑实验报告】四、组合电路(三)
  • C语言——深入理解指针(4)
  • (C++20) consteval立即函数
  • MiniDumpWriteDump函数生成dmp文件
  • 【华为数据之道学习笔记】2-建立企业级数据综合治理体系
  • MySQL Shell拷贝一个库到一个新库
  • 二手物品交易系统源码小程序H5闲置物品转让APP成品
  • 前端React基础面试题
  • 【element-plus使用】el-select自定义样式、下拉框选项过长等问题解决
  • 【 Go语言使用xorm框架操作数据库】
  • 第十一届蓝桥杯青少组省赛Python中高级组真题及赏析