国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

貴州網(wǎng)站建設關(guān)鍵詞代發(fā)排名首頁

貴州網(wǎng)站建設,關(guān)鍵詞代發(fā)排名首頁,文化網(wǎng)站策劃,網(wǎng)站建設教程視頻教程目錄 一、數(shù)據(jù)庫設計 1.1、數(shù)據(jù)庫選擇 1.2、環(huán)境配置 1.3、建庫建表接口實現(xiàn) 1.4、封裝數(shù)據(jù)庫操作 1.5、針對 DataBaseManager 進行單元測試 一、數(shù)據(jù)庫設計 1.1、數(shù)據(jù)庫選擇 MySQL 是我們最熟悉的數(shù)據(jù)庫,但是這里我們選擇使用 SQLite,原因如下&am…

目錄

一、數(shù)據(jù)庫設計

1.1、數(shù)據(jù)庫選擇

1.2、環(huán)境配置

1.3、建庫建表接口實現(xiàn)

1.4、封裝數(shù)據(jù)庫操作

1.5、針對 DataBaseManager 進行單元測試


一、數(shù)據(jù)庫設計


1.1、數(shù)據(jù)庫選擇

MySQL 是我們最熟悉的數(shù)據(jù)庫,但是這里我們選擇使用 SQLite,原因如下:

  1. SQLite 比 MySQL 更輕量:一個完整的 SQLite 數(shù)據(jù)庫,只有一個單獨的可執(zhí)行文件(不到 1M).
  2. SQLite 操作簡便:SQLite 只是一個本地數(shù)據(jù)庫,相當于是直接操作本地的硬盤.
  3. SQLite 應用也非常廣泛:在一些性能不高的設備上,SQLite 是數(shù)據(jù)庫的首選,尤其是移動端和嵌入式設備(Android 系統(tǒng)就是內(nèi)置的 SQLite).

1.2、環(huán)境配置

在 java?中直接使用 maven 把 SQLite 依賴引入即可(版本自行考慮)~

        <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc --><dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.41.2.1</version></dependency>

配置如下

spring:datasource:url: jdbc:sqlite:./data/meta.dbusername:password:driver-class-name: org.sqlite.JDBC

url:SQLite 的工作路徑,用來存儲數(shù)據(jù)在某個指定的文件中.

username & password:對于 SQLite 來說,不需要使用 用戶名密碼.? MySQL 是一個客戶端服務器結(jié)構(gòu)的程序,而 SQLite 則不是客戶端服務器結(jié)構(gòu)的程序,只有本地主機能訪問.

Ps:SQLite 雖然和 MySQL 不太一樣,但是都可以通過 MyBatis 這樣的框架來使用.

1.3、建庫建表接口實現(xiàn)

存儲的數(shù)據(jù)就是:交換機、隊列、綁定.

這里我們使用 MyBatis 來完成相關(guān)的 CRUD.

mapper 接口中提供三個建庫建表操作和針對這三個庫表進行 CRUD 的操作.

@Mapper
public interface MetaMapper {//三個核心建表方法void createExchangeTable();void createQueueTable();void createBindingTable();//基于上述三個表,進行 插入、刪除、查詢 操作void insertExchange(Exchange exchange);List<Exchange> selectAllExchange();void deleteExchange(String exchangeName);void insertQueue(MSGQueue queue);List<MSGQueue> selectAllQueue();void deleteQueue(String queueName);void insertBinding(Binding binding);List<Binding> selectAllBinding();void deleteBinding(Binding binding);}

對應的實現(xiàn)如下:

    <update id="createExchangeTable">create table if not exists exchange (name varchar(50) primary key,type int,durable boolean,autoDelete boolean,arguments varchar(1024));</update><update id="createQueueTable">create table if not exists queue (name varchar(50) primary key,durable boolean,exclusive boolean,autoDelete boolean,arguments varchar(1024));</update><update id="createBindingTable">create table if not exists binding (exchangeName varchar(50),queueName varchar(50),bindingKey varchar(256))</update><insert id="insertExchange" parameterType="com.example.rabbitmqproject.mqserver.core.Exchange">insert into exchange values (#{name}, #{type}, #{durable}, #{autoDelete}, #{arguments});</insert><select id="selectAllExchange" resultType="com.example.rabbitmqproject.mqserver.core.Exchange">select * from exchange;</select><delete id="deleteExchange" parameterType="com.example.rabbitmqproject.mqserver.core.Exchange">delete from exchange where name = #{name};</delete><insert id="insertQueue" parameterType="com.example.rabbitmqproject.mqserver.core.MSGQueue">insert into queue values(#{name}, #{durable}, #{exclusive}, #{autoDelete}, #{arguments});</insert><select id="selectAllQueue" resultType="com.example.rabbitmqproject.mqserver.core.MSGQueue">select * from queue;</select><delete id="deleteQueue">delete from queue where name = #{name};</delete><insert id="insertBinding">insert into binding values (#{exchangeName}, #{queueName}, #{bindingKey});</insert><select id="selectAllBinding" resultType="com.example.rabbitmqproject.mqserver.core.Binding">select * from binding;</select><delete id="deleteBinding">delete from binding where exchangeName = #{exchangeName} and queueName = #{queueName};</delete>

1.4、封裝數(shù)據(jù)庫操作

這里我們通過定制化 代碼 的方式來自動完成建庫建表的操作(符合?RabbitMQ 中間件的設定).

創(chuàng)建 DataBaseManager 類,來完成數(shù)據(jù)庫相關(guān)的操作,注意細節(jié)如下:

  1. 初始化方法:一般談到初始化,都會用到 構(gòu)造方法,但是這里我們使用一個 普通的方法 —— init();構(gòu)造方法一般是用來初始化類的屬性,不會涉及到太多的業(yè)務邏輯,而此處的初始化,帶有業(yè)務邏輯,還是單獨領出來,手動來調(diào)用比較合適.
  2. 建庫建表邏輯:這里期望,broker server 啟動的時候做出如下邏輯判斷:
    1. 如果數(shù)據(jù)庫已經(jīng)存在(表存在),不做任何操作.
    2. 如果數(shù)據(jù)庫不存在,則建庫建表,構(gòu)造默認數(shù)據(jù).

Ps:怎么判定數(shù)據(jù)庫存在或者不存在?就判定 meta.db 文件是否存在即可(配置文件中的 url).

public class DataBaseManager {//這里不使用 Autowired 注解獲取,因為當前這個類需要我們后面手動管理private MetaMapper metaMapper;//針對數(shù)據(jù)庫進行初始化public void init() {//手動獲取到 MetaMappermetaMapper = RabbitmqProjectApplication.context.getBean(MetaMapper.class);if(!checkDBExists()) {//數(shù)據(jù)庫不存在,就進行建庫建表操作//先創(chuàng)建出目錄結(jié)構(gòu)(否則會報錯:找不到目錄結(jié)構(gòu))File dataDir = new File("./data");dataDir.mkdirs();//創(chuàng)建數(shù)據(jù)庫createTable();//插入默認數(shù)據(jù)createDefaultData();System.out.println("[DataBaseManager] 數(shù)據(jù)庫初始化完成!");} else {//數(shù)據(jù)庫存在,什么都不做即可System.out.println("[DataBaseManager] 數(shù)據(jù)庫已存在!");}}private boolean checkDBExists() {File file = new File("./data/meta.db");return file.exists();}private void createTable() {metaMapper.createExchangeTable();metaMapper.createQueueTable();metaMapper.createBindingTable();System.out.println("[DataBaseManager] 創(chuàng)建表完成!");}/*** 添加默認交換機* 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] 創(chuàng)建初始數(shù)據(jù)完成!");}//把數(shù)據(jù)庫中其他操作也在這里封裝一下public void insertExchange(Exchange exchange) {metaMapper.insertExchange(exchange);}public List<Exchange> selectAllExchange() {return metaMapper.selectAllExchange();}public void deleteExchange(String exchangeName) {metaMapper.deleteExchange(exchangeName);}public void insertQueue(MSGQueue queue) {metaMapper.insertQueue(queue);}public List<MSGQueue> selectAllQueue() {return metaMapper.selectAllQueue();}public void deleteQueue(String queueName) {metaMapper.deleteQueue(queueName);}public void insertBinding(Binding binding) {metaMapper.insertBinding(binding);}public List<Binding> selectAllBinding() {return metaMapper.selectAllBinding();}public void deleteBinding(Binding binding) {metaMapper.deleteBinding(binding);}public void deleteDB() {//刪除文件File file = new File("./data/meta.db");boolean res = file.delete();if(res) {System.out.println("[DataBaseManager] 數(shù)據(jù)庫文件刪除完畢!");} else {System.out.println("[DataBaseManager] 數(shù)據(jù)庫文件刪除失敗!");}//刪除目錄File dataDir = new File("./data");boolean ret = dataDir.delete();if(ret) {System.out.println("[DataBaseManager] 數(shù)據(jù)庫目錄刪除完成!");} else {System.out.println("[DataBaseManager] 數(shù)據(jù)庫目錄刪除失敗!");}}}

1.5、針對 DataBaseManager 進行單元測試

設計單元測試,這里的要求就是單元測試用例和用例之間是需要相互獨立的,不會干擾,例如以下情況:

測試過程中,向數(shù)據(jù)庫中插入數(shù)據(jù) a .

在針對 b 進行測試,可能 a 這里的數(shù)據(jù)會對 b 造成干擾.

Ps:這里不一定是數(shù)據(jù)庫,也可能是其他方面,例如是否搞了一個文件,是否占用了端口...

@SpringBootTest
public class DataBaseManagerTests {private DataBaseManager dataBaseManager = new DataBaseManager();@BeforeEachpublic void setUp() {RabbitmqProjectApplication.context = SpringApplication.run(RabbitmqProjectApplication.class);dataBaseManager.init();}@AfterEachpublic void setclose() {//此處不能直接刪除 數(shù)據(jù)庫文件 ,需要先關(guān)閉 context 對象//此處 context 對象持有了 MetaMapper 的實例, MetaMapper 又打開了 meta.db 數(shù)據(jù)庫//如果 meta.db 被別人打開了,此時刪除文件是不會成功的(Windows 系統(tǒng)限制, Linux 則不會)//另一方面 context 會占用 8080 端口,此處的 close 也是釋放 8080 端口RabbitmqProjectApplication.context.close();dataBaseManager.deleteDB();}@Testpublic void testInitTable() {List<Exchange> exchanges = dataBaseManager.selectAllExchange();List<MSGQueue> msgQueues = dataBaseManager.selectAllQueue();List<Binding> bindings = dataBaseManager.selectAllBinding();Assertions.assertEquals(1, exchanges.size());Assertions.assertEquals("", exchanges.get(0).getName());Assertions.assertEquals(ExchangeType.DIRECT, exchanges.get(0).getType());Assertions.assertEquals(0, msgQueues.size());Assertions.assertEquals(0, bindings.size());}private Exchange createTestExchange(String exchangeName) {Exchange  exchange = new Exchange();exchange.setName(exchangeName);exchange.setType(ExchangeType.FANOUT);exchange.setDurable(true);exchange.setAutoDelete(false);exchange.setArguments("aaa", 1);exchange.setArguments("bbb", 2);return exchange;}@Testpublic void insertExhangeTest() {Exchange exchange = createTestExchange("testExchange");dataBaseManager.insertExchange(exchange);List<Exchange> exchanges = dataBaseManager.selectAllExchange();Assertions.assertEquals(2, exchanges.size());Exchange testExchange = exchanges.get(1);Assertions.assertEquals("testExchange", testExchange.getName());Assertions.assertEquals(ExchangeType.FANOUT, testExchange.getType());Assertions.assertEquals(true, testExchange.isDurable());Assertions.assertEquals(false, testExchange.isAutoDelete());Assertions.assertEquals(1, testExchange.getArguments("aaa"));Assertions.assertEquals(2, testExchange.getArguments("bbb"));}@Testpublic void deleteExchangeTest() {Exchange exchange = createTestExchange("testExchange");dataBaseManager.insertExchange(exchange);List<Exchange> exchanges = dataBaseManager.selectAllExchange();Assertions.assertEquals(2, exchanges.size());Assertions.assertEquals("testExchange", exchanges.get(1).getName());//刪除dataBaseManager.deleteExchange("testExchange");exchanges = dataBaseManager.selectAllExchange();Assertions.assertEquals(1, exchanges.size());}private MSGQueue createTestQueue(String queueName) {MSGQueue queue = new MSGQueue();queue.setName(queueName);queue.setDurable(true);queue.setExclusive(false);queue.setAutoDelete(false);queue.setArguments("aaa", 1);queue.setArguments("bbb", 2);return queue;}@Testpublic void testInsertQueue() {MSGQueue queue = createTestQueue("testQueue");dataBaseManager.insertQueue(queue);List<MSGQueue> queues = dataBaseManager.selectAllQueue();Assertions.assertEquals(1, queues.size());MSGQueue msgQueue = queues.get(0);Assertions.assertEquals("testQueue", msgQueue.getName());Assertions.assertEquals(true, msgQueue.isDurable());Assertions.assertEquals(false, msgQueue.isExclusive());Assertions.assertEquals(false, msgQueue.isAutoDelete());Assertions.assertEquals(1, msgQueue.getArguments("aaa"));Assertions.assertEquals(2, msgQueue.getArguments("bbb"));}@Testpublic void testDeleteQueue() {MSGQueue queue = createTestQueue("testQueue");dataBaseManager.insertQueue(queue);List<MSGQueue> queues = dataBaseManager.selectAllQueue();Assertions.assertEquals(1, queues.size());//刪除dataBaseManager.deleteQueue("testQueue");queues = dataBaseManager.selectAllQueue();Assertions.assertEquals(0, queues.size());}private Binding createTestBinding(String exchangeName, String queueName) {Binding binding = new Binding();binding.setExchangeName(exchangeName);binding.setQueueName(queueName);binding.setBindingKey("testBindingKey");return binding;}@Testpublic void testInsertAndDeleteBinding() {Binding binding = createTestBinding("testExchange", "testQueue");dataBaseManager.insertBinding(binding);List<Binding> bindingList = dataBaseManager.selectAllBinding();Assertions.assertEquals(1, bindingList.size());binding = bindingList.get(0);Assertions.assertEquals("testExchange", binding.getExchangeName());Assertions.assertEquals("testQueue", binding.getQueueName());Assertions.assertEquals("testBindingKey", binding.getBindingKey());//刪除dataBaseManager.deleteBinding(binding);bindingList = dataBaseManager.selectAllBinding();Assertions.assertEquals(0, bindingList.size());}}

當然,我只是做了簡單的設計測試用例,實際上站在更嚴謹?shù)慕嵌?#xff0c;還需要設計更豐富的測試用例~

相比于 功能/業(yè)務代碼,測試用例代碼編寫起來雖然比較無聊,但是重要性是非常大的,這些操作會大大提高整個項目的開發(fā)效率.

Ps:單元測試,本來就是開發(fā)要搞的活,寫代碼不可能沒有 bug,進行周密的測試,是應對 bug 最有效的手段.

?

http://aloenet.com.cn/news/30869.html

相關(guān)文章:

  • 濟南集團網(wǎng)站建設方案做公司網(wǎng)站的公司
  • 做照片相冊最好的網(wǎng)站自己如何注冊一個網(wǎng)站
  • 武漢做商城網(wǎng)站seo排名關(guān)鍵詞點擊
  • 湖北省稅務局網(wǎng)站建設方sem和seo哪個工作好
  • 網(wǎng)站建設怎樣回答客戶問題優(yōu)化怎么做
  • ofbiz做的網(wǎng)站營銷方案策劃
  • 如何用wordpress做視頻網(wǎng)站品牌seo培訓咨詢
  • 怎么做汽車網(wǎng)站seo入門免費教程
  • 婦科醫(yī)院網(wǎng)站建設怎么做汽車營銷活動策劃方案
  • wordpress代碼實現(xiàn)怎么做seo關(guān)鍵詞優(yōu)化
  • 嘉興做微網(wǎng)站多少錢seo推廣優(yōu)化多少錢
  • 黑龍江疫情太嚴重了廣州網(wǎng)站優(yōu)化
  • 做網(wǎng)站是需要多少錢武漢大學人民醫(yī)院洪山院區(qū)
  • 交友網(wǎng)站美女要一起做外貿(mào)跨境網(wǎng)站建站
  • 怎么做犬舍網(wǎng)站網(wǎng)絡營銷有哪些推廣方式
  • 電子商務網(wǎng)站建設 上海廣州短視頻代運營
  • 自己怎么設置會員網(wǎng)站營銷方案怎么寫?
  • 網(wǎng)站開發(fā)php還是java百度詞條
  • 接單網(wǎng)站源碼東莞好的網(wǎng)站國外站建設價格
  • 陜西建設注冊中心網(wǎng)站公司推廣文案
  • 怎樣建設網(wǎng)站施工上海網(wǎng)站優(yōu)化
  • 維護網(wǎng)站建設空間出租百度深圳總部
  • wordpress 手機布局中國seo高手排行榜
  • 杭州市建設住房保障局網(wǎng)站有免費做網(wǎng)站的嗎
  • 湖南門戶網(wǎng)站建設鄭州seo排名公司
  • 網(wǎng)站開發(fā)都是用什么做的百度自己的宣傳廣告
  • 如室室內(nèi)設計官網(wǎng)網(wǎng)站推廣優(yōu)化的方法
  • 怎么查看網(wǎng)站有沒有做競價免費網(wǎng)站推廣工具
  • 無形資產(chǎn) 網(wǎng)站開發(fā)排位及資訊
  • eclipse做企業(yè)網(wǎng)站品牌策劃方案怎么做