学习Go语言之简易ORM框架
抽象工厂模式常用于程序适配多种数据库,以达到开放扩展关闭修改的原则。
首先需要有一个思想就是数据库表结构都是固定,但是每种数据库语言存在差异性,因此使用接口规范功能,各种数据库有自己不同的语言实现,业务中也是使用接口操作,运行时根据配置实例化各种数据库实现。好处是增加新的数据库时,只需要用新的数据库语言实现即可,不用修改原来的代码。部署程序时,只需要修改配置即可适配不同的数据库。

一,数据模型(Model层)
package Model
type User struct {
Id int
UID string
LoginName string
PassWord string
}
func (t *User) TableName() string {
return "User"
}
myProject/MyORM/Model/Product.go
package Model
type Product struct {
Id int
UID string
Name string
Price float64
}
func (t *Product) TableName() string {
return "Product"
}
二,接口定义(Interface层)
package Data import (
"myProject/MyORM/Model"
) type IUser interface {
Add(entity *Model.User) bool
Edit(entity *Model.User) Model.User
}
myProject/MyORM/Data/IProduct.go
package Data import (
"myProject/MyORM/Model"
) type IProduct interface {
Add(entity *Model.Product) bool
Edit(entity *Model.Product) Model.Product
}
myProject/MyORM/Data/IProvider.go
♥ 抽象工厂接口
package Data
type IProvider interface {
GetUser() IUser
GetProduct() IProduct
}
三,接口实现(DAL层)
♣ 注意:Go语言的接口实现是隐式的,无须让实现接口的类型写出实现了哪些接口。这个设计被称为非侵入式设计。在类型中添加与接口签名一致的方法就可以实现该方法。
1.SQL实现
myProject/MyORM/SqlData/SqlUser.go
package SqlData import (
"fmt"
"myProject/MyORM/Model"
) type SqlUser struct {
} func (p *SqlUser) Add(entity *Model.User) bool {
fmt.Println("sql执行UserAdd")
return true
} func (p *SqlUser) Edit(entity *Model.User) Model.User {
fmt.Println("sql执行UserEdit")
return *entity
}
myProject/MyORM/SqlData/SqlProduct.go
package SqlData import (
"fmt"
"myProject/MyORM/Model"
) type SqlProduct struct {
} func (p *SqlProduct) Add(entity *Model.Product) bool {
fmt.Println("sql执行ProductAdd")
return true
} func (p *SqlProduct) Edit(entity *Model.Product) Model.Product {
fmt.Println("sql执行ProductEdit")
return *entity
}
myProject/MyORM/SqlData/SqlProvider.go
♥ SQL工厂实现
package SqlData import (
"myProject/MyORM/Data"
) type SqlProvider struct {
} func (p *SqlProvider) GetUser() Data.IUser {
return new(SqlUser)
} func (p *SqlProvider) GetProduct() Data.IProduct {
return new(SqlProduct)
}
2.Mysql实现
myProject/MyORM/MysqlData/MysqlUser.go
package MysqlData import (
"fmt"
"myProject/MyORM/Model"
) type MysqlUser struct {
} func (p *MysqlUser) Add(entity *Model.User) bool {
fmt.Println("mysql执行UserAdd")
return true
} func (p *MysqlUser) Edit(entity *Model.User) Model.User {
fmt.Println("mysql执行UserEdit")
return *entity
}
myProject/MyORM/MysqlData/MysqlProduct.go
package MysqlData import (
"fmt"
"myProject/MyORM/Model"
) type MysqlProduct struct {
} func (p *MysqlProduct) Add(entity *Model.Product) bool {
fmt.Println("mysql执行ProductAdd")
return true
} func (p *MysqlProduct) Edit(entity *Model.Product) Model.Product {
fmt.Println("mysql执行ProductEdit")
return *entity
}
myProject/MyORM/MysqlData/MysqlProvider.go
♥ MYSQL工厂实现
package MysqlData import (
"myProject/MyORM/Data"
) type MysqlProvider struct {
} func (p *MysqlProvider) GetUser() Data.IUser {
return new(MysqlUser)
} func (p *MysqlProvider) GetProduct() Data.IProduct {
return new(MysqlProduct)
}
三,业务逻辑(BLL层)
myProject/MyORM/Service/Factory.go
package Service import (
"myProject/MyORM/Data"
"myProject/MyORM/MysqlData"
"myProject/MyORM/SqlData"
)
// 设置配置
const db = "sql" // 简单工厂方法,根据配置加载不同的实现库
func Provider() Data.IProvider {
switch db {
case "sql":
return new(SqlData.SqlProvider)
case "mysql":
return new(MysqlData.MysqlProvider)
default:
panic("无法映射配置的数据库")
}
}
myProject/MyORM/Service/UserService.go
package Service import (
"myProject/MyORM/Data"
"myProject/MyORM/Model"
) type UserService struct {
} var user Data.IUser func init() {
user = Provider().GetUser()
} func (u *UserService) Add(entity *Model.User) bool {
return user.Add(entity)
} func (u *UserService) Update(entity *Model.User) Model.User {
return user.Edit(entity)
}
myProject/MyORM/Service/ProductService.go
package Service import (
"myProject/MyORM/Data"
"myProject/MyORM/Model"
) type ProductService struct {
} var product Data.IProduct func init() {
product = Provider().GetProduct()
} func (p *ProductService) Add(entity *Model.Product) bool {
return product.Add(entity)
} func (p *ProductService) Update(entity *Model.Product) Model.Product {
return product.Edit(entity)
}
四,界面展示(UI层)
myProject/MyORM/main.go
package main import (
"myProject/MyORM/Model"
"myProject/MyORM/Service"
) func main() {
user := &Model.User{
Id: ,
UID: "",
LoginName: "admin",
PassWord: "",
}
userService := new(Service.UserService)
userService.Add(user) product := &Model.Product{
Id: ,
UID: "",
Name: "苹果",
Price: 12.5,
}
productService := new(Service.ProductService)
productService.Update(product)
}

学习Go语言之简易ORM框架的更多相关文章
- Django学习(三)---Models(ORM框架)
1) Django 中Models是与数据库相关的,与数据库相关的代码一般写在 models.py中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在sett ...
- 基于Torndb的简易ORM
============================================================================ 原创作品,同意转载. 转载时请务必以超链接形式 ...
- 笔记:学习go语言的网络基础库,并尝试搭一个简易Web框架
在日常的 web 开发中,后端人员常基于现有的 web 框架进行开发.但单纯会用框架总感觉不太踏实,所以有空的时候还是看看这些框架是怎么实现的会比较好,万一要排查问题也快一些. 最近在学习 go 语言 ...
- 十四、EnterpriseFrameWork框架核心类库之简易ORM
在写本章前先去网上找了一下关于ORM的相关资料,以为本章做准备,发现很多东西今天才了解,所以在这里也对ORM做不了太深入的分析,但还是浅谈一下EFW框架中的设计的简易ORM:文中有一点讲得很有道理,D ...
- Android 数据库ORM框架GreenDao学习心得及使用总结<一>
转: http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读 ...
- 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结
转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...
- 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化
准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...
- golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍
golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...
- go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量
go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量 下载安装:go get github.com/astaxie/beego 首页 - beego: 简约 & 强大并存 ...
随机推荐
- [HEOI2016/TJOI2016] 排序 解题报告(二分答案/线段树分裂合并+set)
题目链接: https://www.luogu.org/problemnew/show/P2824 题目描述: 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在 ...
- 关于Java集合的小抄--转
原文地址:http://calvin1978.blogcn.com/articles/collection.html 在尽可能短的篇幅里,将所有集合与并发集合的特征.实现方式.性能捋一遍.适合所有&q ...
- HD-ACM算法专攻系列(5)——N!
题目描述: 源码: #include"iostream" using namespace std; int main() { int n, digit, carry, tmp; i ...
- Optional是以enum和泛型为基础的高阶类型
结论:1.optionals使用时需要检查:2.可以通过!+赋值语句转化为非optionals. Optional-Generic Enumeration enum Optional<T> ...
- ZBrush中功能强大的插件PaintStop
PaintStop是ZBrush®3.1的手绘插件,可以比较真实的模拟手绘风格,尤其是用水彩笔刷画水墨风格画.PaintStop插件可供用户免费使用. PaintStop是一款功能强大的插件,已经被添 ...
- Linxu基本指令
一.Linux权限的概念 Linux下有两种用户:普通用户和超级用户(). 普通用户:在linux下做有限的事情: 超级用户:可以在linux系统下做任何事情,不受限制. 普通用户的提示符是“$”,超 ...
- 路飞学城Python-Day15(模块二思维导图)
- Linux Eslint 命令行
Linux 命令行 ls : 查看所有文件 ls -la : 编列文件并展示权限 sudo chmod 777 -R 文件名 : 文件权限升级 cp : 复制 cp file_na ...
- Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
解决方法: 1.进入启动文件目录 2.将用户加入到docker 组 sudo gpasswd -a ${USER} docker 3.使用root用户 sudo su 4. 切换当前用户 su ${ ...
- python 正则表达式与re模块
一.正则表达式 用途 用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. #### 简单地说 就是用于字符串匹配的 字符组 在 ...