写一个golang中 用户表的dao层 使用interface
时间: 2023-12-14 22:37:07 浏览: 88
好的,以下是一个简单的用户表的 DAO 层实现,使用 interface:
```go
package dao
import (
"database/sql"
"errors"
)
type User struct {
ID int64 `json:"id"`
Username string `json:"username"`
Password string `json:"password"`
}
type UserDao interface {
Add(user *User) (int64, error)
GetById(id int64) (*User, error)
Delete(id int64) error
}
type userDao struct {
db *sql.DB
}
func NewUserDao(db *sql.DB) UserDao {
return &userDao{db: db}
}
func (u *userDao) Add(user *User) (int64, error) {
result, err := u.db.Exec("INSERT INTO users (username, password) VALUES (?, ?)", user.Username, user.Password)
if err != nil {
return 0, err
}
return result.LastInsertId()
}
func (u *userDao) GetById(id int64) (*User, error) {
row := u.db.QueryRow("SELECT id, username, password FROM users WHERE id = ?", id)
user := &User{}
err := row.Scan(&user.ID, &user.Username, &user.Password)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, nil
}
return nil, err
}
return user, nil
}
func (u *userDao) Delete(id int64) error {
_, err := u.db.Exec("DELETE FROM users WHERE id = ?", id)
return err
}
```
上面的代码中,我们定义了一个 `UserDao` 接口,包含了 `Add`、`GetById` 和 `Delete` 三个方法。然后,我们实现了这个接口,定义了 `userDao` 结构体,并在 `NewUserDao` 函数中返回它的实例。
在 `Add` 方法中,我们向数据库中插入一个新用户。在 `GetById` 方法中,我们根据用户 ID 查询数据库中的用户记录。在 `Delete` 方法中,我们删除数据库中指定 ID 的用户记录。如果出现错误,我们会将其返回给调用者。
当我们需要使用 DAO 层时,我们可以通过 `NewUserDao` 函数创建一个实例,并调用其方法。例如:
```go
package main
import (
"database/sql"
"fmt"
"log"
"github.com/your-username/your-project/dao"
)
func main() {
db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
if err != nil {
log.Fatal(err)
}
defer db.Close()
userDao := dao.NewUserDao(db)
// 添加一个新用户
user := &dao.User{Username: "testuser", Password: "testpassword"}
id, err := userDao.Add(user)
if err != nil {
log.Fatal(err)
}
fmt.Printf("New user ID is %d\n", id)
// 根据 ID 查询用户
result, err := userDao.GetById(id)
if err != nil {
log.Fatal(err)
}
if result != nil {
fmt.Printf("User: %+v\n", *result)
}
// 删除用户
err = userDao.Delete(id)
if err != nil {
log.Fatal(err)
}
}
```
这样,我们就可以使用 DAO 层来操作数据库中的用户表了。
阅读全文