0


消息队列 -封装数据库的操作

前言

上一篇博客我们写了, 关于交换机, 队列,绑定, 写入数据库的一些建库建表的操作 这一篇博客中,我们将建库建表操作,封装一下实现层一个类来供上层服务的调用 , 并在写完该类之后, 测试代码是否完整

实现封装

在写完上述的接口类 与 xml 后, 我们想要 创建一个类 ,来调用 接口类中的各种方法 , 并对数据库完成一些操作

创建DataBaseManager 类

在这个类中, 我们 需要完成对数据库的建库建表操作 , 并封装 一些关于表的增删查改方法(这里说一下, 因为我们使用的数据库是SQLite 是一个文件, 所以当调用建表操作的时候就自动建库了)

对于各种方法的介绍, 都写进代码里面了 ,自行阅读即可

  1. packagecom.example.demo.mqServer.dataCenter;importcom.example.demo.MqApplication;importcom.example.demo.mqServer.core.Binding;importcom.example.demo.mqServer.core.Exchange;importcom.example.demo.mqServer.core.ExchangeType;importcom.example.demo.mqServer.core.MSGQueue;importcom.example.demo.mqServer.mapper.MateMapper;importjava.io.File;importjava.util.List;publicclassDataBaseManager{privateMateMapper mateMapper;// 针对数据库进行初始化publicvoidinit(){// 手动获取matemapper 对象
  2. mateMapper =MqApplication.context.getBean(MateMapper.class);// 手动的获取到 MetaMapperif(!checkDBExists()){//如果数据库不存在,就进行建表操作// 先创建一个data目录File dataDir =newFile("./data");
  3. dataDir.mkdirs();createTable();// 插入默认数据createDefaultData();System.out.println("[DataBaseManager] 数据库初始化完成!");}else{// 数据库已经存在了, 啥都不必做即可System.out.println("[DataBaseManager] 数据库已经存在!");}}// 删除数据库, 及删除文件 也删除目录 publicvoiddeleteDB(){File file =newFile("./data/meta.db");boolean ret = file.delete();if(ret){System.out.println("[DataBaseManager] 删除数据库文件成功!");}else{System.out.println("[DataBaseManager] 删除数据库文件失败!");}File dataDir =newFile("./data");// 使用 delete 删除目录的时候, 需要保证目录是空的.
  4. ret = dataDir.delete();if(ret){System.out.println("[DataBaseManager] 删除数据库目录成功!");}else{System.out.println("[DataBaseManager] 删除数据库目录失败!");}}// 检查是否存在meta.db 文件privatebooleancheckDBExists(){File file =newFile("./data/meta.db");return file.exists();}// 这个方法用来建表.// 建库操作并不需要手动执行. (不需要手动创建 meta.db 文件)// 首次执行这里的数据库操作的时候, 就会自动的创建出 meta.db 文件来 (MyBatis 帮我们完成的)privatevoidcreateTable(){
  5. mateMapper.createExchangeTable();
  6. mateMapper.createQueueTable();
  7. mateMapper.createBindingTable();System.out.println("[DataBaseManager] 创建表完成!");}// 给数据库表中, 添加默认的数据.// 此处主要是添加一个默认的交换机.// RabbitMQ 里有一个这样的设定: 带有一个 匿名 的交换机, 类型是 DIRECT.privatevoidcreateDefaultData(){// 先构建一个交换机Exchange exchange =newExchange();
  8. exchange.setName("");
  9. exchange.setType(ExchangeType.direct);
  10. exchange.setDurable(true);
  11. exchange.setAutoDelete(false);
  12. mateMapper.insertExchange(exchange);System.out.println("[DataBaseManager] 创建初始数据完成!");}publicvoidinsertExchange(Exchange exchange){
  13. mateMapper.insertExchange(exchange);}publicList<Exchange>selectAllExchanges(){return mateMapper.selectAllExchanges();}publicvoiddeleteExchange(String exchangeName){
  14. mateMapper.deleteExchange(exchangeName);}publicvoidinsertQueue(MSGQueue queue){
  15. mateMapper.insertQueue(queue);}publicList<MSGQueue>selectAllQueues(){return mateMapper.selectAllQueues();}publicvoiddeleteQueue(String queueName){
  16. mateMapper.deleteQueue(queueName);}publicvoidinsertBinding(Binding binding){
  17. mateMapper.insertBinding(binding);}publicList<Binding>selectAllBindings(){return mateMapper.selectAllBindings();}publicvoiddeleteBinding(Binding binding){
  18. mateMapper.deleteBinding(binding);}}

另一种获取Bean对象的方式

对DataBaseManager 类的 解释, 我们知道 想要 获取 Bean对象 一般情况下 我们使用的 @Autowired注解, 但是这个类 我们想要手动 来操作, 使用@Autowired 就在一开始就存入了 , 所以我们教大家另一种 获取Bean对象的方式

步骤1: 找到启动类 , 在启动类中添加一个静态成员
public static ConfigurableApplicationContext context;
步骤2: 使用context 等于 run方法结果
步骤3: 在DataBaseManager 中使用 context 来实现对象装配
mateMapper = MqApplication.context.getBean(MateMapper.class);

  1. packagecom.example.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;@SpringBootApplicationpublicclassMqApplication{// 在启动类创建一个静态成员, 用来手动的获取bean对象publicstaticConfigurableApplicationContext context;publicstaticvoidmain(String[] args){
  2. context =SpringApplication.run(MqApplication.class, args);}}

对数据库进行单元测试

但我们,每写完一个模块的时候, 我们就应该对该模块就行单元测试 ,
接下来我们对数据库进行单元测试
单元测试是在想要测试的类中点击Generate , 会出现一个Test ,点击Test
在这里插入图片描述
在这里插入图片描述
这个Test(安装Junit的插件-这里就不介绍了) , 然后选择你想要测试的方法,点击OK
在这里插入图片描述
会在Test包中生成对应的类 , 在这个类中加上@SpringBootTest 注解 ,就可以正常使用了
在这里插入图片描述
测试代码如下

  1. packagecom.example.demo.mqServer.dataCenter;importcom.example.demo.MqApplication;importcom.example.demo.mqServer.core.Binding;importcom.example.demo.mqServer.core.Exchange;importcom.example.demo.mqServer.core.ExchangeType;importcom.example.demo.mqServer.core.MSGQueue;importorg.junit.jupiter.api.AfterEach;importorg.junit.jupiter.api.Assertions;importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.Test;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.test.context.SpringBootTest;importjava.util.List;importstaticorg.junit.jupiter.api.Assertions.*;@SpringBootTestclassDataBaseManagerTest{privateDataBaseManager dataBaseManager =newDataBaseManager();// 接下来下面这里需要编写多个 方法 . 每个方法都是一个/一组单元测试用例.// 还需要做一个准备工作. 需要写两个方法, 分别用于进行 "准备工作" 和 "收尾工作"// 使用这个方法, 来执行准备工作. 每个用例执行前, 都要调用这个方法.@BeforeEachpublicvoidsetUp(){// 由于在 init 中, 需要通过 context 对象拿到 metaMapper 实例的.// 所以就需要先把 context 对象给搞出来.MqApplication.context =SpringApplication.run(MqApplication.class);
  2. dataBaseManager.init();}// 使用这个方法, 来执行收尾工作. 每个用例执行后, 都要调用这个方法.@AfterEachpublicvoidtearDown(){// 这里要进行的操作, 就是把数据库给清空~~ (把数据库文件, meta.db 直接删了就行了)// 注意, 此处不能直接就删除, 而需要先关闭上述 context 对象!!// 此处的 context 对象, 持有了 MetaMapper 的实例, MetaMapper 实例又打开了 meta.db 数据库文件.// 如果 meta.db 被别人打开了, 此时的删除文件操作是不会成功的 (Windows 系统的限制, Linux 则没这个问题).// 另一方面, 获取 context 操作, 会占用 8080 端口. 此处的 close 也是释放 8080.MqApplication.context.close();
  3. dataBaseManager.deleteDB();}@TestpublicvoidtestInitTable(){// 由于 init 方法, 已经在上面 setUp 中调用过了. 直接在测试用例代码中, 检查当前的数据库状态即可.// 直接从数据库中查询. 看数据是否符合预期.// 查交换机表, 里面应该有一个数据(匿名的 exchange); 查队列表, 没有数据; 查绑定表, 没有数据.List<Exchange> exchangeList = dataBaseManager.selectAllExchanges();List<MSGQueue> queueList = dataBaseManager.selectAllQueues();List<Binding> bindingList = dataBaseManager.selectAllBindings();// 直接打印结果, 通过肉眼来检查结果, 固然也可以. 但是不优雅, 不方便.// 更好的办法是使用断言.// System.out.println(exchangeList.size());// assertEquals 判定结果是不是相等.// 注意这俩参数的顺序. 虽然比较相等, 谁在前谁在后, 无所谓.// 但是 assertEquals 的形参, 第一个形参叫做 expected (预期的), 第二个形参叫做 actual (实际的)Assertions.assertEquals(1, exchangeList.size());Assertions.assertEquals("", exchangeList.get(0).getName());Assertions.assertEquals(ExchangeType.direct, exchangeList.get(0).getType());Assertions.assertEquals(0, queueList.size());Assertions.assertEquals(0, bindingList.size());}privateExchangecreateExchange(String name){Exchange exchange =newExchange();
  4. exchange.setName(name);
  5. exchange.setAutoDelete(false);
  6. exchange.setDurable(true);
  7. exchange.setType(ExchangeType.fanout);
  8. exchange.setArguments("aaa",1);
  9. exchange.setArguments("bbb",2);return exchange;}@TestpublicvoidinsertExchange(){Exchange exchange =createExchange("testExchange");
  10. dataBaseManager.insertExchange(exchange);// 插入完毕之后, 查询结果List<Exchange> exchangeList = dataBaseManager.selectAllExchanges();Assertions.assertEquals(2, exchangeList.size());Exchange newExchange = exchangeList.get(1);Assertions.assertEquals("testExchange", newExchange.getName());Assertions.assertEquals(ExchangeType.fanout, newExchange.getType());Assertions.assertEquals(false, newExchange.isAutoDelete());Assertions.assertEquals(true, newExchange.isDurable());Assertions.assertEquals(1, newExchange.getArguments("aaa"));Assertions.assertEquals(2, newExchange.getArguments("bbb"));System.out.println("insertExchange测试成功");}@TestpublicvoidtestDeleteExchange(){// 先构造一个交换机, 插入数据库; 然后再按照名字删除即可!Exchange exchange =createExchange("testExchange");
  11. dataBaseManager.insertExchange(exchange);List<Exchange> exchangeList = dataBaseManager.selectAllExchanges();Assertions.assertEquals(2, exchangeList.size());Assertions.assertEquals("testExchange", exchangeList.get(1).getName());// 进行删除操作
  12. dataBaseManager.deleteExchange("testExchange");// 再次查询
  13. exchangeList = dataBaseManager.selectAllExchanges();Assertions.assertEquals(1, exchangeList.size());Assertions.assertEquals("", exchangeList.get(0).getName());System.out.println("testDeleteExchange测试成功");}privateMSGQueuecreateTestQueue(String queueName){MSGQueue queue =newMSGQueue();
  14. queue.setName(queueName);
  15. queue.setDurable(true);
  16. queue.setAutoDelete(false);
  17. queue.setExclusive(false);
  18. queue.setArguments("aaa",1);
  19. queue.setArguments("bbb",2);return queue;}@TestpublicvoidtestInsertQueue(){MSGQueue queue =createTestQueue("testQueue");
  20. dataBaseManager.insertQueue(queue);List<MSGQueue> queueList = dataBaseManager.selectAllQueues();Assertions.assertEquals(1, queueList.size());MSGQueue newQueue = queueList.get(0);Assertions.assertEquals("testQueue", newQueue.getName());Assertions.assertEquals(true, newQueue.isDurable());Assertions.assertEquals(false, newQueue.isAutoDelete());Assertions.assertEquals(false, newQueue.isExclusive());Assertions.assertEquals(1, newQueue.getArguments("aaa"));Assertions.assertEquals(2, newQueue.getArguments("bbb"));System.out.println("testInsertQueue测试成功");}@TestpublicvoidtestDeleteQueue(){MSGQueue queue =createTestQueue("testQueue");
  21. dataBaseManager.insertQueue(queue);List<MSGQueue> queueList = dataBaseManager.selectAllQueues();Assertions.assertEquals(1, queueList.size());// 进行删除
  22. dataBaseManager.deleteQueue("testQueue");
  23. queueList = dataBaseManager.selectAllQueues();Assertions.assertEquals(0, queueList.size());System.out.println("testDeleteQueue测试成功");}privateBindingcreateTestBinding(String exchangeName,String queueName){Binding binding =newBinding();
  24. binding.setExchangeName(exchangeName);
  25. binding.setMsgQueueName(queueName);
  26. binding.setBindingKey("testBindingKey");return binding;}@TestpublicvoidtestInsertBinding(){Binding binding =createTestBinding("testExchange","testQueue");
  27. dataBaseManager.insertBinding(binding);List<Binding> bindingList = dataBaseManager.selectAllBindings();Assertions.assertEquals(1, bindingList.size());Assertions.assertEquals("testExchange", bindingList.get(0).getExchangeName());Assertions.assertEquals("testQueue", bindingList.get(0).getMsgQueueName());Assertions.assertEquals("testBindingKey", bindingList.get(0).getBindingKey());System.out.println("testInsertBinding测试成功");}@TestpublicvoidtestDeleteBinding(){Binding binding =createTestBinding("testExchange","testQueue");
  28. dataBaseManager.insertBinding(binding);List<Binding> bindingList = dataBaseManager.selectAllBindings();Assertions.assertEquals(1, bindingList.size());// 删除Binding toDeleteBinding =createTestBinding("testExchange","testQueue");
  29. dataBaseManager.deleteBinding(toDeleteBinding);
  30. bindingList = dataBaseManager.selectAllBindings();Assertions.assertEquals(0, bindingList.size());System.out.println("testDeleteBinding测试成功");}}
标签: 数据库 oracle jvm

本文转载自: https://blog.csdn.net/qq_56454895/article/details/132154787
版权归原作者 Mriacles 所有, 如有侵权,请联系我们删除。

“消息队列 -封装数据库的操作”的评论:

还没有评论