学习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: 简约 & 强大并存 ...
随机推荐
- BZOJ 2588 主席树
思路: 主席树 做完BZOJ 3123 觉得这是道水啊-- 然后狂RE 狂MLE 要来数据 忘把deep[1]设成1了----------. 啊wocccccccccccccccc //By Siri ...
- NVMe到底是什么?
转:http://www.expreview.com/42142.html 有关注SSD的朋友应该今年听到NVMe这个词的频率应该不低,随着高端SSD的战场已经抛弃SATA向PCI-E转移,老旧的AH ...
- localStorage、sessionStorage的区别
1.localStorage生命周期是永久的, sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了. ...
- C#如何生成一个随机种子for Random?
就这么写: Random rand = new Random((int)DateTime.Now.Ticks); 或者这么写: Random rand = new Random(new Guid(). ...
- H.264标准(一)mp4封装格式详解
在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...
- sql server 更新满足条件的某一条记录
上图数据:SNum为”18004XXXXX000001K2GW 4000 L1C“,OffLineStation为“OP1010”的有两条数据,当where条件中为上述两者时会同时更新这两条数据,并不 ...
- 优动漫PAINT-超简单灌木教程
超简单灌木教程~零基础神马的都能神还原哦! 优动漫PAINT下载:http://wm.makeding.com/iclk/?zoneid=18597 想要Get到更多有关优动漫的信息包括软件下载,可关 ...
- 优动漫 PAINT 导航窗口面板
导航窗口面板用于管理画布的视图.本节将介绍如何在其中缩放.旋转.翻转画布. 如何使用导航窗口面板 使用[导航窗口]面板便于把握整个画布,以下将为您详细介绍. 什么是[导航窗口]面板 [导航窗口]面板用 ...
- vue 键盘监听事件
<template> <div class="hello"> <input v-on:keyup.enter="submit" t ...
- JavaScript设计模式(biaoyansu)(2)
单例模式实例 (创建类模式): let elBalance = document.getElementById('balance') function init () { var a = new Di ...