承上文,本次做的工作包括:
1、连接数据库
2、执行SQL(查询)
3、获取返回值,并且放入Record
4、Record具备dataMap和getStr(col string)等数据和方法
5、可以获取若干的参数(目前只接收string类型)
先谈一下感受,因为是从Java移植过来,有几个地方还是很不同的,一是没有JDBC,有一个database/sql的包比较类似。二是Go不是完全面向对象语言,不像之前强调类、属性、行为这样的一个固有结构。第三,搞了有一会儿了,因为基础不熟,就是Go中默认的list,和Java的ArrayList等完全不同,无法直接相互替代(也许有办法替代,只是我不知道)。
直接放示例代码(完整代码整理后上传)。
1、连接数据库
这个一搜一大把,说不说也无妨,目前还没有和配置文件分离。
2、执行SQL(查询)
作为客户端,那么需求就应该是这样的:
rows, e := DB.Query("select * from user where id in (?,?,?)","1","2","3")
这里Query的代码(不是完整代码,不包括接收多个参数):
func Query(sql string, para ...string) ArrayList{
var dataList ArrayList
//获取参数值
for i := 0; i < len(para); i++ {
}
rows, err := DB.Query(sql)
if err == nil {
//errors.New("query incur error")
}
columns, err := rows.Columns()
values := make([]string, len(columns))
scanArgs := make([]interface{}, len(values))
for i := range values {
scanArgs[i] = &values[i]
}
for rows.Next() {
err = rows.Scan(scanArgs...)
if err != nil {
panic(err.Error())
}
var value string
var record Record
record.dataMap = make(map[string]string)
for i, col := range values {
value = string(col)
record.dataMap[columns[i]] = value
//fmt.Println("map:%s",record.dataMap)
}
//fmt.Println("-----------------------------------")
dataList.Add(record)
}
if err = rows.Err(); err != nil {
panic(err.Error())
}
return dataList
}
3、获取返回值,并且放入Record
刚刚代码里的ArrayList,是手动实现的,当然手动指额外粘贴进来的(代码来源)。
虽然返回了ArrayList,但是和Java不同,没有泛型,所以还得强制转换成Record。
for i:=0;i<recs.Size();i++ {
rec,_:= recs.Get(i).(gdb.Record)
fmt.Println("rec",rec)
}
4、Record具备dataMap和getStr(col string)等数据和方法
Record的定义(这是最基本的,之后陆续添加):
type Record struct {
dataMap map[string]string
}
func (record Record) getStr(column string) string {
dm := record.dataMap
return dm[column]
}
5、可以获取若干的参数(目前只接收string类型)
方法名这样定义即可接收多个参数:
func Query(sql string, para ...string) ArrayList{
var dataList ArrayList
//获取参数值
for i := 0; i < len(para); i++ {
}
......
}
实现时用stmt传入参数即可。