MyBatisPlus+SpringBoot+JavaFX连接查询

前言

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

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

正文

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

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

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

java 复制代码
        ApplicationContext context = TakeAwayPlusApplication.getContext();
        customerMapper = context.getBean(CustomerMapper.class);

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

第一行代码

java 复制代码
ApplicationContext context = TakeAwayPlusApplication.getContext();

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

说白了,这是一个类。

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

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

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

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

java 复制代码
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 接口

java 复制代码
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 的实例:

java 复制代码
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对象。既然如此,笔者直接调用这行代码。

java 复制代码
public static ApplicationContext getContext() {
		return SpringApplication.run(TakeAwayPlusApplication.class);
	}
}

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

第二行代码

java 复制代码
customerMapper = context.getBean(CustomerMapper.class);

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

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

运行结果

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

运行成功。

相关推荐
安之若素^8 分钟前
启用不安全的HTTP方法
java·开发语言
ruanjiananquan9914 分钟前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
chuanauc41 分钟前
Kubernets K8s 学习
java·学习·kubernetes
一头生产的驴1 小时前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao1 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc7871 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
YuTaoShao3 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张33 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
llwszx6 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野7 小时前
【Java|集合类】list遍历的6种方式
java·python·list