消息队列(2) - 数据库操作

前言

上一篇博客, 我们将消息队列的实体类创建完毕了,接下来呢,我们将交换机 , 队列, 绑定 这三个实体类存放到数据库中,因为这三个不需要频繁的增删查改,还要求一定的速度, 所以这里我们选择的是SQLIte 一个很轻量的数据库,

配置全局配置文件

①引入SQLite

在Java中想要使用SQLite十分简单, 引入SQLlite的依赖即可, 这里给大家放下依赖

<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
		<dependency>
			<groupId>org.xerial</groupId>
			<artifactId>sqlite-jdbc</artifactId>
			<version>3.41.0.1</version>
		</dependency>
全局配置文件, 放到application文件中, 对于SQLite来说, 没有用户名和密码,因为他是部署在本地的一个程序只能本地用户访问 , 对于URL 我将存储在data下面的meta.db文件中

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

mybatis:
  mapper-locations: classpath:mapper/**Mapper.xml

在resource中创建mapper包, 里面存放对应的注解 (也可以使用MyBatis新版的方式,直接在接口中写相对应的注解, 但是这个方式写比较复杂的SQL 语句挺麻烦的, 所以我们这儿继续使用老式的写法)

实现接口类

我们发现之前使用MySQL的时候, 都是直接写好创建表然后才启动服务器, 在整个项目中只部署一次, 但是这儿由于我们可能创建很多张表, 所以我们希望用代码来创建表

package com.example.demo.mqServer.mapper;

public interface MateMapper {
    
    

    void createExchangeTable();
    void createQueueTable();
    void createBindingTable();
}

创建接口对应的xml

xml还是不难写的, 只需要与实体类的属性对应上即可,
但是有一个问题被我们忽略了 , 那就是在 交换机和队列中 我们使用 一个属性 是用 哈希表来存储的, 而数据库中是没有哈希表的数据类型的, 我们还要将哈希表转换为, 数据库中的数据类型 , 怎么转换?
答: 我们先补充一个前置知识, 就是 MyBatis 在完成数据库操作的时候,会自动调用对象的get和set方法 , 我们利用这个规则, 将 哈希表 与 数据库数据类型 实现对应
我们使用Java自带的序列化方式来完成 哈希表 与 字符串 之间的相互转换, 为什么不使更常见的JSON格式呢,因为JSON一般序列化写入的文本文件,而我们这儿使用的是二进制文件的存储,虽然JSON也能转成2进制文件但比较麻烦,所以干脆就使用自带的了

 public String getArguments() {
    
    
        // 将当前的getArguments从map, 转换成String
        // SpringBoot 集成了JSON
        ObjectMapper objectMapper = new ObjectMapper();
        try {
    
    
           return objectMapper.writeValueAsString(arguments);
        } catch (JsonProcessingException e) {
    
    
            e.printStackTrace();
        }
        return "{}";
    }

    public void setArguments(String argumentsJson) {
    
    
        ObjectMapper objectMapper = new ObjectMapper();
        try {
    
    
            this.arguments = objectMapper.readValue(argumentsJson, new TypeReference<HashMap<String, Object>>() {
    
    });
        } catch (JsonProcessingException e) {
    
    
            e.printStackTrace();
        }

    }

在这儿补充一点, 本身MyBatis是支持创建多条SQL语句的, 但是只支持,MySQL 和Oracle ,所以SQLite只能采取这种方式,即多个方法的调用来创建

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mqServer.mapper.MateMapper">
    <update id="createExchangeTable">
        create table if no exists exchange(
            name varchar(50) primary key,
            type int,
            durable boolean,
            autoDelete boolean,
            arguments varchar(1024)
        );
    </update>
    <update id="createQueueTable">
        create table if no exists queue(
            name varchar(50) primary key,
            durable boolean,
            exclusive boolean,
            autoDelete boolean,
            arguments varchar(1024)
        );
    </update>
    <update id="createBindingTable">
        create table if no exists binding(
            exchangeName varchar(50),
            msgQueueName varchar(50),
            bindingKey varchar(256),
        );
    </update>

</mapper>

数据表的插入删除操作

上面我们,写了建立三个表的操作, 建立了表之后, 我们应该将对应的插入,查询,查找操作也同样添加进去
步骤1 : 在接口类MateMapper中创建关于插入查询, 删除的接口

  // 下面是关于这些表的插入与删除操作
    void insertExchange(Exchange exchange);
    List<Exchange> selectAllExchanges();
    void deleteExchange(String exchangeName);
    void insertQueue(MSGQueue queue);
    List<MSGQueue> selectAllQueues();
    void deleteQueue(String queueName);
    void insertBinding(Binding binding);
    List<Binding> selectAllBindings();
    void deleteBinding(Binding binding);

步骤2 : 在xml中实现相关的接口
这里给大家解释一下 parameterType 与 resultType 的区别
parameterType : 指的是传入参数的类型, 因为咱们不是传入基本的数据类型,而是传入一个对象, 所以需要设置一下, 里面的路径就是 对应的实体类
resultType : 指的是返回结果的类型, 一般是用在 select 查找方面

<insert id="insertExchange" parameterType="com.example.demo.mqServer.core.Exchange">
        insert into exchange values( #{
    
    name},#{
    
    type},#{
    
    durable},#{
    
    autoDelete},#{
    
    arguments});
    </insert>
    <select id="selectAllExchanges" resultType="com.example.demo.mqServer.core.Exchange">
        select * from exchange;
    </select>
    <delete id="deleteExchange" parameterType="java.lang.String">
        delete from exchange where name = #{
    
    exchangeName};
    </delete>
    <insert id="insertQueue" parameterType="com.example.demo.mqServer.core.MSGQueue">
        insert into queue values( #{
    
    name} , #{
    
    durable}, #{
    
    exclusive}, #{
    
    autoDelete} ,#{
    
    arguments});
    </insert>
    <select id="selectAllQueues" resultType="com.example.demo.mqServer.core.MSGQueue">
        select * from queue;
    </select>
    <delete id="deleteQueue" parameterType="java.lang.String">
        delete from queue where name = #{
    
    queueName};
    </delete>
    <insert id="insertBinding" parameterType="com.example.demo.mqServer.core.Binding">
        insert into binding values( #{
    
    exchangeName},#{
    
    msgQueueName},#{
    
    bindingKey});
    </insert>
    <select id="selectAllBindings" resultType="com.example.demo.mqServer.core.Binding">
        select * from binding;
    </select>
    <delete id="deleteBinding" parameterType="com.example.demo.mqServer.core.Binding">
        delete from binding where exchangeName = #{
    
    exchangeName} and msgQueueName = #{
    
    msgQueueName};
    </delete>

关于实现接口类的几个注意实现

  1. 不管是parameteType 还是 resultType 都要注意路径是否正确
  2. 注意SQL语句不要写错了
  3. 增删查改里面的 SQL 字段名 要与 实体类的相一致

猜你喜欢

转载自blog.csdn.net/qq_56454895/article/details/131968107
今日推荐