学习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: 简约 & 强大并存 ...
随机推荐
- linux进程控制函数详解
进程控制 fork函数 创建一个子进程. pid_t fork(void); 失败返回-1:成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0 pid_t类型表示进程ID,但为了表示-1, ...
- xBIM 基础09 WeXplorer 基本应用
系列目录 [已更新最新开发文章,点击查看详细] 在本教程中,将学习如何创建最基本和最直接的查看器. 除了展示建筑模型外,不做其他任何操作.它将只使用内置导航,但是不会对按钮做出事件响应. &l ...
- 新型查询系统impala
这羊头很酷... Apache Impala是Apache Hadoop的开源本地分析数据库.Impala由Cloudera,MapR,Oracle和Amazon提供. 在Hadoop上进行BI风格的 ...
- inkscape
最近的论文需要把latex公式放到图里,于是想起了装了之后一直没怎么用的inkscape.因为visio貌似没法直接贴latex格式的公式. 找了几个用法: http://blog.sciencene ...
- (转载) 据说年薪30万的Android程序员必须知道的
据说年薪30万的Android程序员必须知道的帖子 标签: android 2015-03-12 16:52 28705人阅读 评论(14) 收藏 举报 Android中国开发精英 目前包括: And ...
- swift语言点评十二-Subscripts
Classes, structures, and enumerations can define subscripts, which are shortcuts for accessing the m ...
- 《Unix环境高级编程》读书笔记 第4章-文件和目录
1. stat结构的基本形式: on error 24. 设备特殊文件 每个文件系统所在的存储设备都由其主.次设备号表示. 设备号所用的数据类型是基本系统数据类型dev_t. 主设备号标识设备驱动程序 ...
- jQuery 完整 ajax示例
$(function(){ //请求参数 var list = {}; // $.ajax({ //请求方式 type : "POST", //请求的媒体类型 contentTyp ...
- json转换成Map
1.如果转换的是Map.或者是简单的对象 package com.gc.action; import java.util.Map; import net.sf.json.JSONObject; /** ...
- SVN学习总结(2)——SVN冲突解决
在我们用VS进行项目合作开发的过程中,SVN的提交控制是至关重要的,大家不可避免的都遇到过SVN冲突的问题,开发的时候,应该认真学习SVN的知识,减少冲突,集中时间放在开发上. 解决冲突有三种方式: ...