🍃前言
通过这个类, 来整合前面的数据库操作.
🌴手动获取MetaMapper对象
我们知道 MetaMapper 对象我们使用注解交给了spring进行管理,一般来说我们只要使用@Autowired来进行依赖注入就好
但是呢,使用@Autowired的条件是当前类也需要交给spring进行管理。
但是这里我们并不想将DataBaseManager交给spring管理,我们希望实现手动管理。
这时候就需要我们进行手动获取对象了,做法如下:
我们在MqApplication启动类里添加一个全局变量context
,属于ConfigurableApplicationContext
类,用于获取上下文
并在main方法进行赋值
然后我们使用MqApplication.context.getBean(MetaMapper.class);
便可以拿到MetaMapper对象了
🎋针对数据库进行初始化与删除
🚩数据库的初始化
在这个DataBaseManager类里,我希望做到以下几点
- 如果数据库不存在,则进行创库创表的操作
- 首先进行一个建库操作,创建一个
.data
目录 - 创建相应的表格
- 我们在给这些表插入一些默认的数据
- 如果数据表存在,则啥也不干
🚩数据库的删除
数据库的删除我们分为两步
- 先删除
meta.dp
文件 - 再删除
./data
目录
如此才叫删除干净
🚩代码实现
// 要做的是从 Spring 中拿到现成的对象 private MetaMapper metaMapper; // 针对数据库进行初始化 public void init() { // 手动的获取到 MetaMapper metaMapper = MqApplication.context.getBean(MetaMapper.class); if (!checkDBExists()) { // 数据库不存在, 就进行建建库表操作 // 先创建一个 data 目录 File dataDir = new File("./data"); dataDir.mkdirs(); // 创建数据表 createTable(); // 插入默认数据 createDefaultData(); System.out.println("[DataBaseManager] 数据库初始化完成!"); } else { // 数据库已经存在了, 啥都不必做即可 System.out.println("[DataBaseManager] 数据库已经存在!"); } } public void deleteDB() { File file = new File("./data/meta.db"); boolean ret = file.delete(); if (ret) { System.out.println("[DataBaseManager] 删除数据库文件成功!"); } else { System.out.println("[DataBaseManager] 删除数据库文件失败!"); } File dataDir = new File("./data"); // 使用 delete 删除目录的时候, 需要保证目录是空的. ret = dataDir.delete(); if (ret) { System.out.println("[DataBaseManager] 删除数据库目录成功!"); } else { System.out.println("[DataBaseManager] 删除数据库目录失败!"); } } private boolean checkDBExists() { File file = new File("./data/meta.db"); if (file.exists()) { return true; } return false; } // 这个方法用来建表. // 建库操作并不需要手动执行. (不需要手动创建 meta.db 文件) // 首次执行这里的数据库操作的时候, 就会自动的创建出 meta.db 文件来 (MyBatis 帮我们完成的) private void createTable() { metaMapper.createExchangeTable(); metaMapper.createQueueTable(); metaMapper.createBindingTable(); System.out.println("[DataBaseManager] 创建表完成!"); } // 给数据库表中, 添加默认的数据. // 此处主要是添加一个默认的交换机. // RabbitMQ 里有一个这样的设定: 带有一个 匿名 的交换机, 类型是 DIRECT. private void createDefaultData() { // 构造一个默认的交换机. Exchange exchange = new Exchange(); exchange.setName(""); exchange.setType(ExchangeType.DIRECT); exchange.setDurable(true); exchange.setAutoDelete(false); metaMapper.insertExchange(exchange); System.out.println("[DataBaseManager] 创建初始数据完成!"); }
🌲封装其他操作
除此之外我们希望对其他的增加、删除、查看操作也在该类进行封装一下
代码实现如下:
// 把其他的数据库的操作, 也在这个类中封装一下. public void insertExchange(Exchange exchange) { metaMapper.insertExchange(exchange); } public List<Exchange> selectAllExchanges() { return metaMapper.selectAllExchanges(); } public void deleteExchange(String exchangeName) { metaMapper.deleteExchange(exchangeName); } public void insertQueue(MSGQueue queue) { metaMapper.insertQueue(queue); } public List<MSGQueue> selectAllQueues() { return metaMapper.selectAllQueues(); } public void deleteQueue(String queueName) { metaMapper.deleteQueue(queueName); } public void insertBinding(Binding binding) { metaMapper.insertBinding(binding); } public List<Binding> selectAllBindings() { return metaMapper.selectAllBindings(); } public void deleteBinding(Binding binding) { metaMapper.deleteBinding(binding); }
⭕总结
关于《【消息队列开发】 实现DataBaseManager类》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!