# 執行SQL查詢的11種常用方式
### 第1種方式
~~~
sql_1_1 := "select * from user"
results, err := engine.QueryBytes(sql_1_1)
//SqlMapClient和SqlTemplateClient傳參方式類同如下2種,具體參見第6種方式和第7種方式
sql_1_2 := "select id,userid,title,createdatetime,content from Article where id=?"
results, err := db.SQL(sql_1_2, 2).QueryBytes()
sql_1_3 := "select id,userid,title,createdatetime,content from Article where id=?id"
paramMap_1_3 := map[string]interface{}{"id": 2}
results, err := db.SQL(sql_1_3, ¶mMap_1_3).QueryBytes()
~~~
當調用QueryBytes時,第一個返回值results為[]map[string][]byte的形式。
### 第2種方式
~~~
sql_2_1 := "select * from user"
results, err := engine.QueryString(sql_2_1)
//SqlMapClient和SqlTemplateClient傳參方式類同如下2種,具體參見第6種方式和第7種方式
sql_2_2 := "select id,userid,title,createdatetime,content from Article where id=?"
results, err := db.SQL(sql_2_2, 2).QueryString()
sql_2_3 := "select id,userid,title,createdatetime,content from Article where id=?id"
paramMap_2_3 := map[string]interface{}{"id": 2}
results, err := db.SQL(sql_2_3, ¶mMap_2_3).QueryString()
~~~
當調用QueryString時,第一個返回值results為[]map[string]string的形式。
### 第3種方式
~~~
//Value類型本質是[]byte,具有一系列類型轉換函數
sql_2_1 := "select * from user"
results, err := engine.QueryValue(sql_2_1)
//SqlMapClient和SqlTemplateClient傳參方式類同如下2種,具體參見第6種方式和第7種方式
sql_2_2 := "select id,userid,title,createdatetime,content from Article where id=?"
results, err := db.SQL(sql_2_2, 2).QueryValue()
title := results[0]["title"].String()
sql_2_3 := "select id,userid,title,createdatetime,content from Article where id=?id"
paramMap_2_3 := map[string]interface{}{"id": 2}
results, err := db.SQL(sql_2_3, ¶mMap_2_3).QueryValue()
~~~
當調用QueryValue時,第一個返回值results為[]map[string]xorm.Value的形式。xorm.Value類型本質是[]byte,具有一系列類型轉換函數
### 第4種方式:返回的結果類型為 xorm.Result
~~~
//xorm.Value類型本質是[]byte,具有一系列類型轉換函數
sql_2_1 := "select * from user"
results, err := engine.QueryResult(sql_2_1).List()
//SqlMapClient和SqlTemplateClient傳參方式類同如下2種,具體參見第6種方式和第7種方式
sql_2_2 := "select id,userid,title,createdatetime,content from Article where id=?"
result, err := db.SQL(sql_2_2, 2).QueryResult().List()
title := result[0]["createdatetime"].Time("2006-01-02T15:04:05.999Z")
content := result[0]["content"].NullString()
sql_2_3 := "select id,userid,title,createdatetime,content from Article where id=?id"
paramMap_2_3 := map[string]interface{}{"id": 2}
results, err := db.SQL(sql_2_3, ¶mMap_2_3).QueryResult().List()
~~~
當調用QueryResult時,第一個返回值results為xorm.Result的形式。
### 第5種方式
~~~
sql_3_1 := "select * from user"
results, err := engine.QueryInterface(sql_3_1)
//SqlMapClient和SqlTemplateClient傳參方式類同如下2種,具體參見第6種方式和第7種方式
sql_3_2 := "select id,userid,title,createdatetime,content from Article where id=?"
results, err := db.SQL(sql_3_2, 2).QueryInterface()
sql_3_3 := "select id,userid,title,createdatetime,content from Article where id=?id"
paramMap_3_3 := map[string]interface{}{"id": 2}
results, err := db.SQL(sql_3_3, ¶mMap_3_3).QueryInterface()
//Query方法返回的是一個ResultMap對象,它有List(),Count(),ListPage(),Json(),Xml()
//Xml(),XmlIndent(),SaveAsCSV(),SaveAsTSV(),SaveAsHTML(),SaveAsXML(),SaveAsXMLWithTagNamePrefixIndent(),
//SaveAsYAML(),SaveAsJSON(),SaveAsXLSX()系列實用函數
sql_3_4 := "select * from user"
//List()方法返回查詢的全部結果集,類型為[]map[string]interface{}
results, err := engine.Sql(sql_3_4).Query().List()
//當然也支持這種方法,將數據庫中的時間字段格式化,時間字段對應的golang數據類型為time.Time
//當然你也可以在數據庫中先使用函數將時間類型的字段格式化成字符串,這里只是提供另外一種方式
//該方式會將所有時間類型的字段都格式化,所以請依據您的實際需求按需使用
results, err := engine.Sql(sql_3_4).QueryWithDateFormat("20060102").List()
sql_3_5 := "select * from user where id = ? and age = ?"
results, err := engine.Sql(sql_3_5, 7, 17).Query().List()
sql_3_6 := "select * from user where id = ?id and age = ?age"
paramMap_3_6 := map[string]interface{}{"id": 7, "age": 17}
results, err := engine.Sql(sql_3_6, ¶mMap_3_6).Query().List()
//此Query()方法返回對象還支持ListPage()方法和Count()方法,這兩個方法都是針對數據庫查詢出來后的結果集進行操作
//此Query()方法返回對象還支持Xml()方法、XmlIndent()方法和Json()方法,相關內容請閱讀之后的章節
//ListPage()方法并非數據庫分頁方法,只是針對數據庫查詢出來后的結果集[]map[string]interface{}對象取部分切片
//例如以下例子,是取結果集的第1條到第50條記錄
results, err := engine.Sql(sql_3_5, 7, 17).Query().ListPage(1,50)
//例如以下例子,是取結果集的第13條到第28條記錄
results, err := engine.Sql(sql_3_5, 7, 17).Query().ListPage(13,28)
//此Count()方法也并非使用數據庫count函數查詢數據庫某條件下的記錄數,只是針對Sql語句對數據庫查詢出來后的結果集[]map[string]interface{}對象的數量
//此Count()方法也并非Engine對象和Session對象下的Count()方法,使用時請區分場景
count, err := engine.Sql(sql_3_5, 7, 17).Query().Count()
~~~
當調用QueryInterface,List或ListPage時,第一個返回值results為[]map[string]interface{}的形式。
### 第6種方式:使用SqlMapClient調用SqlMap配置執行Sql語句
~~~
sql_id_4_1 := "sql_4_1" //配置文件中sql標簽的id屬性,SqlMap的key
results, err := engine.SqlMapClient(sql_id_4_1).Query().List()
sql_id_4_2 := "sql_4_2"
results, err := engine.SqlMapClient(sql_id_4_2, 7, 17).Query().List()
sql_id_4_3 := "sql_4_3"
paramMap_4_3 := map[string]interface{}{"id": 7, "name": "xormplus"}
results1, err := engine.SqlMapClient(sql_id_4_3, ¶mMap_4_3).Query().List()
~~~
### 第7種方式:使用SqlTemplateClient調用SqlTemplate模板執行Sql語句
~~~
sql_key_5_1 := "select.example.stpl" //配置文件名,SqlTemplate的key
//執行的 sql:select * from user where id=7
//如部分參數未使用,請記得使用對應類型0值,如此處name參數值為空字符串,模板使用指南請詳見pongo2
paramMap_5_1 := map[string]interface{}{"count": 2, "id": 7, "name": ""}
results, err := engine.SqlTemplateClient(sql_key_5_1, ¶mMap_5_1).Query().List()
//執行的 sql:select * from user where name='xormplus'
//如部分參數未使用,請記得使用對應類型0值,如此處id參數值為0,模板使用指南請詳見pongo2
paramMap_5_2 := map[string]interface{}{"id": 0, "count": 2, "name": "xormplus"}
results, err := engine.SqlTemplateClient(sql_key_5_1, ¶mMap_5_2).Query().List()
~~~
當調用List或ListPage時,第一個返回值results為[]map[string]interface{}的形式。
### 第8種方式:返回的結果類型為對應的[]interface{}
~~~
var categories []Category
err := engine.Sql("select * from category where id =?", 16).Find(&categories)
paramMap_6 := map[string]interface{}{"id": 2}
err := engine.Sql("select * from category where id =?id", ¶mMap_6).Find(&categories)
~~~
### 第9種方式:返回的結果類型為對應的[]interface{}
~~~
sql_id_7_1 := "sql_7_1"
var categories []Category
err := engine.SqlMapClient(sql_id_7_1, 16).Find(&categories)
sql_id_7_2 := "sql_7_2"
var categories []Category
paramMap_7_2 := map[string]interface{}{"id": 25}
err := engine.SqlMapClient(sql_id_7_2, ¶mMap_7_2).Find(&categories)
~~~
### 第10種方式:返回的結果類型為對應的[]interface{}
~~~
//執行的 sql:select * from user where name='xormplus'
sql_key_8_1 := "select.example.stpl" //配置文件名,SqlTemplate的key
var users []User
paramMap_8_1 := map[string]interface{}{"id": 0, "count": 2, "name": "xormplus"}
err := engine.SqlTemplateClient(sql_key_8_1, ¶mMap_8_1).Find(&users)
~~~
### 第11種方式:查詢單條數據
使用Sql,SqlMapClient,SqlTemplateClient函數與Get函數組合可以查詢單條數據
以Sql與Get函數組合為例:
~~~
//獲得單條數據的值,并存為結構體
var article Article
has, err := db.Sql("select * from article where id=?", 2).Get(&article)
//獲得單條數據的值并存為map
var valuesMap1 = make(map[string]string)
has, err := db.Sql("select * from article where id=?", 2).Get(&valuesMap1)
var valuesMap2 = make(map[string]interface{})
has, err := db.Sql("select * from article where id=?", 2).Get(&valuesMap2)
var valuesMap3 = make(map[string]xorm.Value)
has, err := db.Sql("select * from article where id=?", 2).Get(&valuesMap3)
//獲得單條數據的值并存為xorm.Record
record := make(xorm.Record)
has, err = session.SQL("select * from article where id=?", 2).Get(&record)
id := record["id"].Int64()
content := record["content"].NullString()
//獲得單條數據某個字段的值
var title string
has, err := db.Sql("select title from article where id=?", 2).Get(&title)
var id int
has, err := db.Sql("select id from article where id=?", 2).Get(&id)
~~~
### 注:
* 第6種和第9種方式所使用的SqlMap配置文件內容如下
```xml
<sqlMap>
<sql id="sql_4_1">
select * from user
</sql>
<sql id="sql_4_2">
select * from user where id=? and age=?
</sql>
<sql id="sql_4_3">
select * from user where id=?id and name=?name
</sql>
<sql id="sql_id_7_1">
select * from category where id =?
</sql>
<sql id="sql_id_7_2">
select * from category where id =?id
</sql>
</sqlMap>
```
* 第7種和第10種方式所使用的SqlTemplate配置文件內容如下,文件名:select.example.stpl,路徑為engine.SqlMap.SqlMapRootDir配置目錄下的任意子目錄中。使用模板方式配置Sql較為靈活,可以使用pongo2引擎的相關功能靈活組織Sql語句以及動態SQL拼裝。
~~~
select * from user
where
{% if count>1%}
id=?id
{% else%}
name=?name
{% endif %}
~~~
* 除以上1種方式外,本庫還支持另外3種方式,由于這3種方式支持一次性批量混合CRUD操作,返回多個結果集,且支持多種參數組合形式,內容較多,場景比較復雜,因此不在此處贅述。
* 欲了解另外3種方式相關內容您可移步[批量SQL操作](http://www.hmoore.net/xormplus/xorm/167121)章節,此3種方式將在此章節單獨說明
* 采用Sql(),SqlMapClient(),SqlTemplateClient()方法執行sql調用Find()方法,與ORM方式調用Find()方法不同,此時Find()方法中的參數,即結構體的名字不需要與數據庫表的名字映射(因為前面的Sql()方法已經確定了SQL語句),但字段名需要和數據庫查詢結果集中的字段名字做映射。使用Find()方法需要自己定義查詢返回結果集的結構體,如不想自己定義結構體可以使用Query()方法,返回[]map[string]interface{},兩種方式請依據實際需要選用。
舉例:多表聯合查詢例子如下
~~~
//執行的SQL如下,查詢的是article表與category表,查詢的表字段是這兩個表的部分字段
sql := `SELECT
article.id,
article.title,
article.isdraft,
article.lastupdatetime,
category.name as categoryname
FROM
article,
category
WHERE
article.categorysubid = category. ID
AND category. ID = 4`
//我們可以定義一個結構體,注意:結構體中的字段名和上面執行的SQL語句字段名映射,字段數據類型正確
//當然你還可以給這個結構體加更多其他字段,但是如果執行上面的SQL語句時,這些其他字段只會被賦值對應數據類型的零值
type CategoryInfo struct {
Id int
Title string
Categoryname string
Isdraft int
Lastupdatetime time.Time
}
var categoryinfo []CategoryInfo
//執行sql,返回值為error對象,同時查詢的結果集會被賦值給[]CategoryInfo
//同理,此處也可以使用SqlMapClient(),SqlTemplateClient()函數來獲取sql
err = db.Sql(sql).Find(&categoryinfo)
if err != nil {
t.Fatal(err)
}
t.Log(categoryinfo)
t.Log(categoryinfo[0].Categoryname)
t.Log(categoryinfo[0].Id)
t.Log(categoryinfo[0].Title)
t.Log(categoryinfo[0].Isdraft)
t.Log(categoryinfo[0].Lastupdatetime)
~~~
- xorm
- 創建Orm引擎
- 定義表結構體
- 名稱映射規則
- 前綴映射,后綴映射和緩存映射
- 使用Table和Tag改變名稱映射
- Column屬性定義
- 表結構操作
- 獲取數據庫信息
- 表操作
- 創建索引和唯一索引
- 同步數據庫結構
- 導入導出SQL腳本
- SqlMap及SqlTemplate模板
- 初始化SqlMap配置文件及SqlTemplate模板
- SqlMap及SqlTemplate相關功能API
- SqlMap配置文件及SqlTemplate模板加密存儲及解析
- 手動管理SqlMap配置及SqlTemplate模板
- 插入數據
- ORM方式插入數據
- 執行SQL命令插入數據
- 創建時間Created
- 查詢和統計數據
- ORM方式查詢和統計數據
- 查詢條件方法
- 臨時開關方法
- Get方法
- Find方法
- Join的使用
- Iterate方法
- Count方法
- Rows方法
- Sum系列方法
- Exist方法
- 子查詢
- 執行SQL查詢
- 執行SQL查詢的11種常用方式
- 查詢返回json或xml字符串
- 鏈式查詢據操返回某條記錄的某個字段的值
- SqlTemplateClient執行過程
- 關于數據庫分頁查詢
- 更新數據
- ORM方式更新數據
- Update方法
- 樂觀鎖Version
- 更新時間Updated
- 執行SQL命令更新數據
- 刪除數據
- ORM方式刪除數據
- Delete方法
- 軟刪除Deleted
- 執行SQL命令刪除數據
- 事務處理
- 簡單事務模型
- 嵌套事務模型
- 八種事務類型及事務傳播機制
- 簡單事務相關API
- 嵌套事務相關API
- 嵌套事務示例代碼
- 主從數據庫(Master/Slave)讀寫分離
- 創建引擎組
- 負載策略
- 引擎組其他配置方法
- 數據庫讀寫分離
- 批量混合SQL操作
- SQL Builder
- 緩存
- 事件
- 數據導出
- Dump數據庫結構和數據
- 查詢結果集導出csv、tsv、xml、json、xlsx、yaml、html
- 多Sheet頁數據導出
- 日志
- 連接池
- xorm 工具
- 常見問題
- 感謝支持