【REST2SQL】06 GO 跨包接口重构代码

【REST2SQL】01RDB关系型数据库REST初设计
【REST2SQL】02 GO连接Oracle数据库
【REST2SQL】03 GO读取JSON文件
【REST2SQL】04 REST2SQL第一版Oracle版实现
【REST2SQL】05 GO 操作 达梦 数据库

对所有关系数据的操作都只有CRUD,采用Go 的接口interface{}重构代码,代码更简洁、易维护。

1 创建接口声明包

在 REST2sql目录下创建一个dbif的子目录,在此子目录下创建dbif.go包,文件组织结构如下图:
在这里插入图片描述
接口包代码如下:

// 数据库接口定义
package dbif

// 数据库操作接口
type CRUD interface {
	InsertData(string) string //插入,返回影响行数json字符串
	SelectData(string) string //查询, 返回查询结果json字符串
	UpdateData(string) string //更新,返回影响行数json字符串
	DeleteData(string) string //删除,返回影响行数json字符串
	IsResource(string) bool   //在系统对象表总查找资源是否有效,用户表或视图
}

2 dboracle包重构

2.1 引入接口包dbif

import (
	"database/sql/driver"
	"encoding/json"

	"io"
	"log"
	"rest2sql/config"
	db "rest2sql/dbif" //数据库接口包
	"strings"

	go_ora "github.com/sijms/go-ora/v2" // 1 go get github.com/sijms/go-ora/v2
)

2.2 声明CRUD4Oracle结构体

作为接口函数的接收者,或者说接口绑定对象。

type CRUD4Oracle struct {
	//Oracle的CRUD操作,结构体
}

2.3 创建New()构造函数

直接返回,结构体指针。

func New() db.CRUD {
	//创建结构体CRUD4Oracle
	return &CRUD4Oracle{}
}

2.4 实现接口的全部函数或方法

原来的CRUD函数加上接受者即可,或者说绑定结构体

// delete
func (crud *CRUD4Oracle) DeleteData(deleteSql string) string {}
// update
func (crud *CRUD4Oracle) UpdateData(updateSql string) string {}
// insert
func (crud *CRUD4Oracle) InsertData(insertSql string) string {}
// select查询,结果为json
func (crud *CRUD4Oracle) SelectData(sqls string) string {}

原来dothing包的资源检查函数 isRes( resName string) bool ,用接口重构,不同数据库实现稍微不同。

// REST请求时检查资源是否有效
func (crud *CRUD4Oracle) IsResource(resName string) bool {

	icurd := New()

	resname := strings.ToUpper(resName)

	resSQL := "select object_name from user_objects where object_type in ('TABLE','VIEW') and object_name = '" + resname + "'"

	//执行数据库查询
	result := icurd.SelectData(resSQL)
	//检查数据库是否有此表
	if strings.Contains(result, resname) {
		return true
	} else {
		return false
	}
}

3 dbdm包重构

和oracle重构类似,只有结构体和New() 不同

3.1 引入dbif包

import db "rest2sql/dbif"

3.2 声明CRUD4Dm结构体

type CRUD4Dm struct {
	//Dm的CRUD操作,结构体
}

3.3 创建New()构造函数

func New() db.CRUD {
	//创建结构体CRUD4Dm
	return &CRUD4Dm{}
}

3.4 实现接口的全部函数或方法

原来的CRUD函数加上接受者即可,或者说绑定结构体

/* 往表插入数据 */
func (crud *CRUD4Dm) InsertData(insertSql string) string {}
/* 删除表数据 */
func (crud *CRUD4Dm) DeleteData(deleteSql string) string {}
/* 修改表数据 */
func (crud *CRUD4Dm) UpdateData(updateSql string) string {}
/* 查询表数据 */
func (crud *CRUD4Dm) SelectData(sqlSelect string) string {}

// REST请求时检查资源是否有效
func (crud *CRUD4Dm) IsResource(resName string) bool {

	icurd := New()

	resname := strings.ToUpper(resName)

	resSQL := "select object_name from user_objects where object_type in ('TABLE','VIEW') and object_name = '" + resname + "'"

	//执行数据库查询
	result := icurd.SelectData(resSQL)
	//检查数据库是否有此表
	if strings.Contains(result, resname) {
		return true
	} else {
		return false
	}
}

4 Dothing包的重构

4.1 引入接口和数据库包

// dothing project dothing.go
package dothing

import (
	"encoding/json"
	"fmt"
	"net/http"
	"rest2sql/config"
	dm "rest2sql/dbdm"
	db "rest2sql/dbif"
	ora "rest2sql/dboracle"
	"strings"
)

4.2 声明接口全局变量

// 当前连接的数据库类型oracle
var (
	DBType string = config.Conf.DBType //数据库类型
	REST   string = config.Conf.REST   //支持的REST:GET,POST,PUT,DELETE
	SQL    string = config.Conf.SQL    //支持的SQL:SELECT,INSERT,UPDATE,DELETE
)
// 声明CRUD操作的全局接口变量
var Icrud db.CRUD

4.3 创建全局变量构造函数createDBType

// 根据数据库类型,创建crud对象
func createDBType() {
	switch DBType {
	case "oracle":
		Icrud = ora.New()
	case "dm":
		// 达梦
		Icrud = dm.New()
	default:
		// 不支持的数据库
	}
}

4.4 检查资源是否有效的调用

//资源名
	resName := req["ResName"].(string)

	// 检查是否有效资源
	if !Icrud.IsResource(resName) {
		//if !isRes(resName) {
		w.Write([]byte("\nerror:无效资源" + resName))
		return
	} else {
		//w.Write([]byte("\nresName:" + resName))
	}

4.5 doSQL重构

重构了switch case

// 根据请求参数执行不同的操作 
func doSQL(w http.ResponseWriter, req map[string]interface{}) {
	//w.Write([]byte("\ndoSQL()\n"))
	w.Write([]byte("\"Response\":"))
	//资源名sql语句
	resSQL := req["ResName"].(string)
	fmt.Println("SQL://", resSQL)
	sqlToUpper := strings.ToUpper(resSQL)
	sql6 := sqlToUpper[:6]
	var result string
	switch sql6 {
	case "SELECT":
		result = Icrud.SelectData(resSQL)
	case "INSERT":
		result = Icrud.InsertData(resSQL)
	case "UPDATE":
		result = Icrud.UpdateData(resSQL)
	case "DELETE":
		result = Icrud.DeleteData(resSQL)
	default:
		// 过滤sql ,只能执行 SELECT INSERT UPDATE DELETE
		result = "\"只能执行 SELECT INSERT UPDATE DELETE\""
	}
	fmt.Println("SQL://", resSQL)
	w.Write([]byte(result))
	w.Write([]byte("}"))
}

4.6 REST4种请求的重构

// get
//执行 sql并返回 json 结果
	fmt.Println("REST://", selectSQL)
	result := Icrud.SelectData(selectSQL)
// post
//执行 insertSQL 并返回 json 结果
	fmt.Println("REST://:", insertSQL)
	result := Icrud.InsertData(insertSQL)
// put 
//执行 insertSQL 并返回 json 结果
	fmt.Println("REST://", updateSQL)
	result := Icrud.UpdateData(updateSQL)
// delete
//执行 sql并返回 json 结果
	fmt.Println("REST://", deleteSQL)
	result := Icrud.DeleteData(deleteSQL)

5 测试结果

总体代码组织
在这里插入图片描述

Oracle OK
达梦dm OK

控制台执行日志:
在这里插入图片描述

浏览器请求及返回:

在这里插入图片描述

《06 完》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/302040.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

特斯拉难挽倒退?比亚迪为中国汽车市场改写历史

对于电动汽车这个新兴产业,特斯拉长期以来一直处于领头羊的位置,近年来也面临诸多测试。去年底欧洲报道特斯拉在瑞典遭遇罢工冲击,运营陷入诸多困扰,实在出人意料。更让人讶异的是,年终宣布新王者比亚迪在全球销量首次…

C语言——结构体类型(一)【结构体定义,创建,初始化和引用】

📝前言: 在实际编程过程中,我们可能会希望把一些关联的数据存放在一起,这样方便我们使用。但是这些数据的类型有时候并不一致,例如一个学生的信息:有名字(字符串),有年龄…

各大厂急招鸿蒙开发员,争抢鸿蒙工程师

去年9月,余承东宣布鸿蒙原生应用全面启动,华为开始了全面抛弃安卓的进程。 多家互联网公司也发布了鸿蒙OS的App开发工程师的岗位,开启了抢人大战。 有的企业开出了近百万的年薪招聘鸿蒙OS工程师,而华为甚至为鸿蒙OS资深架构师开…

python 各级目录文件读取

目录结构 import pytestdef test_01():# 同级文件with open(1.txt, r, encodingutf-8) as file:content file.read()print(content)def test_02():# 同级目录的下的文件with open(rupfile/2.txt, r, encodingutf-8) as file:content file.read()print(content)def test_03():…

大数据StarRocks(四) :常用命令

这次主要介绍生产工作中使用Starrocks时的常用命令 4.1 连接StarRocks 4.1.1 Linux命令行连接 [roothadoop1011 fe]# yum install mysql -y [roothadoop1011 fe]# mysql -h hadoop101 -uroot -P9030 -p4.1.2 Windows客户端 DBeaver 连接 4.2 常用命令 4.2.1 查看状态 1. 查…

低代码快速构建管理系统的实践思路

目录 一、前言 二、创建数据表 三、添加数据表属性 四、配置功能 五、数据筛选 六、数据集显示&功能发布 一、前言 很多时候,市场上的管理软件鱼龙混杂,找一些外包团队在实际应用中效果并不理想,项目中存在的问题也比较棘手。后面了…

视频如何制作微信表情?仅需一招在线制作

Gif动画表情包是当下一种非常流行的图片展示格式,能够通过gif格式的图片来调节聊天氛围或是传递信息,非常有趣。而gif动图现在也被各行各业的商家用作宣传使用,很吸引大众的目光。 那么,这种非常吸引人的gif动图是怎么制作的呢&a…

民营企业合规管理建设,重点有哪些?

民营企业在当前经济发展中占据着重要地位,但随之而来的是更多的法律法规和监管要求。因此,民营企业合规建设成为保障企业合法运营、稳定发展的关键。 首先,民营企业应重视法律遵从。确保企业各项经营活动符合国家法律法规和相关政策要求&…

rhel8安装

1. 2. 3. 4. 5. 6.默认 7.默认 8. 9.默认 10. 11. 12. 13.默认 14.默认 15.添加镜像 16.双击后,通过上下键选择第一个 (第二个是测试镜像并安装,就是比较慢,建议选择第一个) 17. 18. 19.让他自动分区就行了 20.开始安…

抖店入驻资质是什么?

我是电商珠珠 抖店的入驻资质是什么?这是很多新手关心的问题。 今天,我就来详细的跟大家讲一下。 一、营业执照 对于新手来说,准备一张个体的营业执照即可。营业执照可以去当地工商局免费办理,也可以去找代办。 代办的话需要…

《实战AI大模型》从入门到精通

文章目录 编辑推荐内容简介作者简介前言/序言入手传送门:参加抽奖 人工智能领域资深专家尤洋老师倾力打造,获得了李开复、周鸿祎、颜水成三位大咖鼎力推荐,一经上市就登上了京东“计算机与互联网”图书排行榜Top1的宝座。 编辑推荐 《实战AI…

10 分钟搞定 1 个门店,「沉浸式巡检」让巡查整改更身临其境

门店巡检起着确保品牌运营的标准性和规范性的作用,同时也是为了发现门店存在的问题和不足,为后续运营优化提供数据支撑。 不过,在实际的巡检过程中,效率问题却总是悬而未决。要让巡检真正发挥它的价值,就需要设置系统、…

编程模拟 NAT 网络地址转换(2024)

1.题目描述 参考计算机网络教材 188 页内容,模拟 NAT 路由器的工作过程,主要有 2 个步骤的工作:1、将收到的来自 内网报文中的私有源 IP 地址转换为 NAT 的外部合法 IP 地址,同时将传输层源端口号转换为 NAT 路 由器分配的端口号…

java数据结构与算法刷题-----LeetCode64. 最小路径和

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只…

ECharts 图表简单示例,中国地图

目录 ECharts官网链接: [ECharts](https://echarts.apache.org/zh/index.html)在项目中引入 Apache ECharts柱状图折线图饼图仪表盘中国地图完整示例代码 ECharts官网链接: ECharts 在项目中引入 Apache ECharts <!DOCTYPE html> <html><head><meta char…

Python编程+copilot+代码补全+提高效率

Python编程copilot代码补全提高效率 copilot是由Github和OpenAI合作开发的一款AI编程工具&#xff0c;它可以根据自然语言或部分代码&#xff0c;自动给出合适的代码补全建议。copilot支持多种编程语言&#xff0c;包括Python&#xff0c;也可以在Pycharm等主流IDE中使用。本资…

stm32cube keil5第二次下载程序不成功

1.第一次下载成功&#xff0c;第二次需要按重置键下载然后松开能下载成功。是因为之前stm32cube默认设置了nodebug模式。修改读写模式第二次就可以下载。 2.keil5每次不用按钮重置按钮刷新程序 keil5设置。

2024第九届上海国际智慧工地展览会-官 网

2024第九届上海国际智慧工地展览会 时间&#xff1a;2024年10月30-11月1日 地点&#xff1a;上海世博展览馆 主办单位&#xff1a;联合国人居署 上海市住房和城乡建设管理委员会 协办单位&#xff1a;上海世界城市日事务协调中心 智慧工地是一种应用信息化、智能化技术的施…

6类典型场景的无线AP选型和部署方案

你们好&#xff0c;我的网工朋友。 前段时间刚给你们来了篇解决无线频繁断网的技术文&#xff0c;《解决无线频繁断网&#xff0c;这个办法值得收藏&#xff01;》。 不少朋友私聊&#xff0c;说想再聊聊无线AP的选型和部署方案&#xff0c;这不就安排上了&#xff1f; 无线…

构建免费的Dokan和WooCommerce构建线上课程市场在线销售数字课程

我们知道创建良好的学习说明和材料很困难。但当涉及到销售时&#xff0c;就变得更加困难。如果您无法出售您的课程&#xff0c;那么没有什么比这更令人沮丧的了。 幸运的是&#xff0c;如果您使用的是 WordPress 网站&#xff0c;那么您可以非常轻松且免费地完成此操作。借助L…