这次对gorm的查询功能做一个详细的说明,我在数据库中添加了几条测试用的数据。
查询所有
type User struct {
Id int `gorm:"primary_key" json:"id"`
Name string `json:"name"`
Age int `json:"age"`
Gender int `json:"gender"` //1:男、2:女
}
//查询所有
func (User) FindAll() (user []User){
conn := db.GetDb()
defer conn.Close()
conn.Find(&user) //select * from user
return
}
//测试
func TestFindAll(t *testing.T) {
user := new(entity.User)
users := user.FindAll()
for _,v := range users {
fmt.Println(v)
}
}
测试代码执行结果如下,数据库中的4条数据都被查询出来了。
这里的Find(&user)
相当于select * from user
这条sql,具体查哪张表是根据你传入的结构体决定的,所以结构体名称必须和数据库对应,如果数据库中是下划线命名,结构体就转换成驼峰的形式,如:user_info为表名时,结构体名称应该为UserInfo。这里的Find(&user)
还有一个作用就是把结果绑定至user中,所以这里一定要用指针作为参数传入。
根据主键查询
//根据id查询
func (user *User) FindById(){
conn := db.GetDb()
defer conn.Close()
conn.Find(&user)
return
}
//测试代码
func TestFindById(t *testing.T) {
user := new(entity.User)
user.Id = 1
user.FindById()
fmt.Println(user)
}
测试代码执行结果如下,数据库中id为1的数据被查询出来了。
给结构体中的主键字段设置了 gorm:"primary_key" json:"id"
后,gorm会根据user中的主键直接查询出对应的数据。
条件查询
//条件查询
func (User) FindByCondition(keyWord, keyValue string) (user User){
conn := db.GetDb()
defer conn.Close()
conn.Where(keyWord+" = ?",keyValue).Find(&user)
return
}
//测试代码
func TestFindByCondition(t *testing.T) {
keyWord := "age"
keyValue := "18"
users := entity.User{}.FindByCondition(keyWord, keyValue)
for _,v := range users {
fmt.Println(v)
}
}
测试代码执行结果如下,数据库中age为18的两条数据被查询出来了。
这里的Where(keyWord+" = ?",keyValue)
相当于sql中的where
表达式了,具体需要什么条件直接当作参数传入就行,?
可以作为占位符,后面的参数中传入,有几个?
,后面可以传入多个参数来一一对应。
还有一种条件查询的方式,使用map的k,v来作为条件和值
//map查询
func (User) FindByMap(condition map[string]interface{}) (user []User) {
conn := db.GetDb()
defer conn.Close()
conn.Where(condition).Find(&user)
return
}
//测试
func TestFindByMap(t *testing.T) {
users := entity.User{}.FindByMap(map[string]interface{}{"name": "tom", "age": 18})
for _,v := range users {
fmt.Println(v)
}
}
测试代码执行结果如下,数据库中name为tom、age为18的数据被查询出来了。
这里map的key就是条件,value就是值,gorm会根据map中包含的键值对作为条件来查询,具体用哪种条件查询就看实际场景了。
其它查询选项
除了以上简单的查询还gorm同样支持检索数量limt()、排序order()、计数count()等,用法也很简单,我放一个例子应该就能明白
//使用limit限制返回条数为1
func (User) FindUsers(keyWord, keyValue string) (user []User){
conn := db.GetDb()
defer conn.Close()
conn.Where(keyWord+" = ?",keyValue).Limit(1).Find(&user)
return
}
//测试age为18的记录(2条)
func TestFindUsers(t *testing.T) {
keyWord := "age"
keyValue := "18"
users := entity.User{}.FindUsers(keyWord,keyValue)
for _,v := range users {
fmt.Println(v)
}
}
测试代码执行结果如下,数据库中name为age为18的数据只返回了一条。
其它的方式查询与limit同理,直接拼在查询条件中就可以了。