參考:xorm操作指南,這邊有一些配置或者其他的數據庫配置(主要是mysql)會省去,具體查看該文檔。
文章目錄
1、特性
- 支持Struct和數據庫表之間的靈活映射,並支持自動同步
- 事務支持,支持嵌套事務(支持類JAVA Spring的事務傳播機制)
- 同時支持原始SQL語句和ORM操作的混合執行
- 使用連寫來簡化調用
- 支持使用Id, In, Where, Limit, Join, Having, Table, Sql, Cols等函數和結構體等方式作爲條件
- 支持級聯加載Struct
- 支持類ibatis方式配置SQL語句(支持xml配置文件、json配置文件、xsql配置文件,支持pongo2、jet、html/template模板和自定義實現配置多種方式)
- 支持動態SQL功能
- 支持一次批量混合執行多個CRUD操作,並返回多個結果集
- 支持數據庫查詢結果直接返回Json字符串和xml字符串
- 支持SqlMap配置文件和SqlTemplate模板密文存儲和解析
- 支持緩存
- 支持主從數據庫(Master/Slave)數據庫讀寫分離
- 支持根據數據庫自動生成xorm的結構體
- 支持記錄版本(即樂觀鎖)
- 支持查詢結果集導出csv、tsv、xml、json、xlsx、yaml、html功能
- 支持SQL Builder github.com/go-xorm/builder
這些xorm的特性看下來,感覺和你在java中用mybatis或者hibernate還是比較類似的。主要開發比較關注的特性有下面這些(我覺得):
1 支持實體和表的屬性映射、2 事務傳播的支持,spring的事務傳播的實現可以參考我的csdn文章、5 和mybatis之前的分頁插件還有其他一些插件還是挺類似的 7 自己寫sql,這個功能我覺得很強 14 這個有點類似hibernate的逆向工程
2、安裝
安裝很簡單,安裝命令:go get -u github.com/xormplus/xorm
3、Orm引擎(包含配置)
他這邊有一個說明,感覺還是很有用的:
在xorm裏面,可以同時存在多個Orm引擎,一個Orm引擎稱爲Engine,一個Engine一般只對應一個數據庫。
感覺這個東西好處在於說我一個項目可能存在多個數據庫,而不是傳統的web架構,比如說現在在做的遊戲,可能跨服和單區服的數據庫不在同一個庫,那麼這個功能就派上用處了。就是不同的場景傳入不同的數據引擎以達到操作不同數據庫的目的。
1、創建(mysql爲例)
這邊以連接mysql數據爲例:
import (
_ "github.com/go-sql-driver/mysql"
"github.com/xormplus/xorm"
)
var engine *xorm.Engine
func main() {
var err error
engine, err = xorm.NewEngine("mysql", "root:123@/test?charset=utf8")
}
2、ping操作
創建完成engine之後,並沒有立即連接數據庫,此時可以通過engine.Ping()來進行數據庫的連接測試是否可以連接到數據庫。
-
另外對於某些數據庫有連接超時設置的,可以通過起一個定期Ping的Go程來保持連接鮮活。
具體的操作應該是看對應的場景是否有對應的需求。
3、操作日誌
配置對應的日誌輸出級別和sql的展示,這個和hibernate有點類似。具體的配置如下:
1、配置輸出sql
engine.ShowSQL(true)
,則會在控制檯打印出生成的SQL語句;
2、配置打印日誌級別
engine.Logger().SetLevel(core.LOG_DEBUG)
,則會在控制檯打印調試及以上的信息;
3、配置輸出到文件
如果需要配置輸出到文件的話,需要通過調用 NewSimpleLogger(w io.Writer)
接收一個io.Writer
接口,具體方式如下:
f, err := os.Create("sql.log")
if err != nil {
println(err.Error())
return
}
engine.SetLogger(xorm.NewSimpleLogger(f))
4、連接池操作
這個和java的數據庫框架類似的設置操作:
如果需要設置連接池的空閒數大小,可以使用
engine.SetMaxIdleConns()
來實現。
-
如果需要設置最大打開連接數,則可以使用engine.SetMaxOpenConns()
來實現。
4、表-結構體 映射
1、映射規則配置
1-名稱映射規則
主要負責結構體名稱到表名和結構體field到表字段的名稱 映射。由core.IMapper接口的實現者來管理,xorm內置了三種IMapper實現.
- core.SnakeMapper:支持struct爲駝峯式命名,表結構爲下劃線命名之間的轉換,這個是默認的Maper;
- core.SameMapper:支持結構體名稱和對應的表名稱以及結構體field名稱與對應的表字段名稱相同的命名;
- core.GonicMapper:和SnakeMapper很類似,但是對於特定詞支持更好,比如ID會翻譯成id而不是i_d。
2-設置方法
engine.SetMapper(core.SameMapper{})
3-混合使用和自定義
- 如果你使用了別的命名規則映射方案,也可以自己實現一個IMapper
- 表名稱和字段名稱的映射規則默認是相同的,當然也可以設置爲不同,如:
//表名的映射和字段映射分開,這個還是比較靈活的。 engine.SetTableMapper(core.SameMapper{}) engine.SetColumnMapper(core.SnakeMapper{})
4-對應的類型映射
前綴映射,這個感覺沒什麼太多用處,可以參考:前綴映射
2、自定義映射和映射規則優先級
1-自定義表名和優先級
這邊看了一下第一種自定義臨時表名的方法還是有點魔幻的,沒找到對應資料,看了源碼還是沒怎麼理解他的處理,正常第二種方式應該最常用, 後面再研究第一種方式吧
第一種方式:通過engine.Table()(engine是xorm引擎對象) 方法可以改變struct對應的數據庫表的名稱
第二種方式:實現TableName() string
接口,就跟下面這樣,我隨便截了個項目中的圖
第三種方式:就是我們上面說的 Mapper 自動映射的表名
上述三個方法按照順序優先級執行。mapper排在最後,留給很大的自定義空間。
2-字段映射
字段映射有兩種方式,感覺這個自定義的空間還是有的
第一種方式:通過sturct中field對應的Tag中使用**xorm:"‘column_name’"**可以使該field對應的Column名稱爲指定名稱。(這裏使用兩個單引號將Column名稱括起來是爲了防止名稱衝突,因爲我們在Tag中還可以對這個Column進行更多的定義。如果名稱不衝突的情況,單引號也可以不使用。)
第二種方式:Mapper 自動映射的字段名
同樣是按照前後優先級,Mapper映射的優先級最低
3-Column屬性定義
Column屬性tag定義不只是定義名稱映射,還可以定義其他的屬性。我這邊只把可能會在項目中常用到的列舉出來,具體的還是看原文:Column屬性定義
Tag屬性名 | 作用說明 |
---|---|
name | 當前field對應的字段的名稱,可選,如不寫,則自動根據field名字和轉換規則命名,如與其它關鍵字衝突,請使用單引號括起來。 |
pk | 是否是Primary Key,如果在一個struct中有多個字段都使用了此標記,則這多個字段構成了複合主鍵,支持int32,int,int64,uint32,uint,uint64,string這7種Go的數據類型 |
[not ]null 或 notnull | 是否可以爲空 |
autoincr | 是否自增 |
unique或unique(uniquename) | 是否是唯一,如不加括號則該字段不允許重複;如加上括號,則括號中爲聯合唯一索引的名字 |
- | 這個Field將不進行字段映射 |
-> | 這個Field將只寫入到數據庫而不從數據庫讀取 |
<- | 這個Field將只從數據庫讀取,而不寫入到數據庫 |
created | 這個Field將在Insert時自動賦值爲當前時間 |
updated | 這個Field將在Insert或Update時自動賦值爲當前時間 |
default 0或default(0) | 設置默認值,緊跟的內容如果是Varchar等需要加上單引號 |
4-Column映射其他規則
1、如果field名稱爲Id而且類型爲int64並且沒有定義tag,則會被xorm視爲主鍵,並且擁有自增屬性。如果想用Id以外的名字或非int64類型做爲主鍵名,必須在對應的Tag上加上xorm:"pk"來定義主鍵(如果是Id字段,但是加上了xorm的tag並且沒有聲明爲pk,應該是不會被當成主鍵的。)
2、string類型默認映射爲varchar(255),如果需要不同的定義,可以在tag中自定義,如:varchar(1024)
3、支持type MyString string等自定義的field,支持Slice, Map等field成員,這些成員默認存儲爲Text類型,並且默認將使用Json格式來序列化和反序列化。
4、支持數據庫字段類型爲Blob類型。如果是Blob類型,則先使用Json格式序列化再轉成[]byte格式。如果是[]byte或者[]uint8,則不做轉換二十直接以二進制方式存儲。
5、實現了Conversion接口的類型或者結構體,將根據接口的轉換方式在類型和數據庫記錄之間進行相互轉換,這個接口的優先級是最高的。
就像下面這樣,順便說一下接口繼承的快捷鍵是Ctrl + i,拿去不謝
xorm各個數據庫對應表結構類型,查看原文,這邊就不給出了:Column屬性定義