总结

23 阅读3分钟

本节以客户customer和订单order为模型,并且以dao设计模式来实现他们的curd操作。

项目结构

image.png

准备数据库和表以及数据

create database gorm_demo;

customers | CREATE TABLE `customers` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  `deleted_at` datetime DEFAULT NULL,
  `name` varchar(100) NOT NULL,
  `address` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_customers_deleted_at` (`deleted_at`)
);

orders | CREATE TABLE `orders` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  `deleted_at` datetime DEFAULT NULL,
  `customer_id` int unsigned DEFAULT NULL,
  `product` varchar(255) DEFAULT NULL,
  `price` double DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_orders_deleted_at` (`deleted_at`)
) ;


INSERT INTO customers (name, address, email)
VALUES 
  ('John Doe', '123 Main St', 'john.doe@example.com'),
  ('Jane Doe', '456 Main St', 'jane.doe@example.com'),
  ('Jim Smith', '789 Main St', 'jim.smith@example.com');


INSERT INTO orders (customer_id, product, price)
VALUES
  (1, 'iPhone', 999.99),
  (1, 'Macbook Pro', 1499.99),
  (2, 'iPad', 499.99),
  (3, 'Apple Watch', 399.99);

在上面的代码中:

customers表有5个字段:

id:主键,自动递增。
name:客户姓名,类型为字符串,不能为空。
address:客户地址,类型为字符串,不能为空。
email:客户电子邮件,类型为字符串,不能为空,唯一。
created_at:客户创建时间,类型为时间戳,默认值为当前时间。

orders表有5个字段:

id:主键,自动递增。
customer_id:客户ID,类型为整数,不能为空。
product:产品名称,类型为字符串,不能为空。
price:产品价格,类型为十进制,不能为空。
created_at:订单创建时间,类型为时间戳,默认值为当前

创建并初始化项目

mkdir gorm_demo
cd gorm_demo
code .
go mod init gorm_demo

创建实体

创建一个entity文件夹,里面创建order.go和customer.go 文件内容如下:

order.go

package entity

import "gorm.io/gorm"

type Order struct {
	gorm.Model
	CustomerID uint
	Product    string
	Price      float32
}

customer.go

package entity

import (
	"github.com/jinzhu/gorm"
)

// Customer model
type Customer struct {
	gorm.Model
	Name    string `gorm:"type:varchar(100);not null"`
	Address string `gorm:"type:varchar(100);not null"`
	Email   string `gorm:"type:varchar(100);not null"`
}

创建连接数据库工具类

创建一个util文件夹,在该文件夹中创建db_util.go文件内容如下:

package util

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

var db *gorm.DB

func init() {
	var err error
	db, err = gorm.Open("mysql", "root:123456@/gorm_demo?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		panic("failed to connect database")
	}
}

func GetDB() *gorm.DB {
	return db
}

创建dao接口

创建一个dao文件夹,里面创建order_dao.go、customer_dao.go、order_dao_impl.go、customer_dao_impl.go文件,内容如下:

order_dao.go

package dao

import (
	"gorm_demo/entity"

	"github.com/jinzhu/gorm"
)

type OrderDAO interface {
	FindAllOrders(db *gorm.DB) ([]entity.Order, error)
	FindOrderByID(db *gorm.DB, id int) (entity.Order, error)
	CreateOrder(db *gorm.DB, order entity.Order) error
	UpdateOrder(db *gorm.DB, order entity.Order) error
	DeleteOrder(db *gorm.DB, order entity.Order) error
}

customer_dao.go

package dao

import (
	"gorm_demo/entity"

	"github.com/jinzhu/gorm"
)

// CustomerDAO interface
type CustomerDAO interface {
	CreateCustomer(db *gorm.DB, customer entity.Customer) (entity.Customer, error)
	GetCustomer(db *gorm.DB, id uint) (entity.Customer, error)
	GetAllCustomers(db *gorm.DB) ([]entity.Customer, error)
	UpdateCustomer(db *gorm.DB, customer entity.Customer) (entity.Customer, error)
	DeleteCustomer(db *gorm.DB, customer entity.Customer) error
}

order_dao_impl.go

package dao

import (
	"gorm_demo/entity"

	"github.com/jinzhu/gorm"
)

type OrderDAOImpl struct{}

func (odao *OrderDAOImpl) FindAllOrders(db *gorm.DB) ([]entity.Order, error) {
	var orders []entity.Order
	if err := db.Find(&orders).Error; err != nil {
		return nil, err
	}
	return orders, nil
}

func (odao *OrderDAOImpl) FindOrderByID(db *gorm.DB, id int) (entity.Order, error) {
	var order entity.Order
	if err := db.First(&order, id).Error; err != nil {
		return entity.Order{}, err
	}
	return order, nil
}

func (odao *OrderDAOImpl) CreateOrder(db *gorm.DB, order entity.Order) error {
	if err := db.Create(&order).Error; err != nil {
		return err
	}
	return nil
}

func (odao *OrderDAOImpl) UpdateOrder(db *gorm.DB, order entity.Order) error {
	if err := db.Save(&order).Error; err != nil {
		return err
	}
	return nil
}

func (odao *OrderDAOImpl) DeleteOrder(db *gorm.DB, order entity.Order) error {
	if err := db.Delete(&order).Error; err != nil {
		return err
	}
	return nil
}

customer_dao_impl.go

package dao

import (
	"gorm_demo/entity"

	"github.com/jinzhu/gorm"
)

// CustomerDAOImpl customer data access object implementation
type CustomerDAOImpl struct{}

// CreateCustomer method to create a new customer
func (dao CustomerDAOImpl) CreateCustomer(db *gorm.DB, customer entity.Customer) (entity.Customer, error) {
	err := db.Create(&customer).Error
	return customer, err
}

// GetCustomer method to get a customer by ID
func (dao CustomerDAOImpl) GetCustomer(db *gorm.DB, id uint) (entity.Customer, error) {
	var customer entity.Customer
	err := db.First(&customer, id).Error
	return customer, err
}

// GetAllCustomers method to get all customers
func (dao CustomerDAOImpl) GetAllCustomers(db *gorm.DB) ([]entity.Customer, error) {
	var customers []entity.Customer
	err := db.Find(&customers).Error
	return customers, err
}

// UpdateCustomer method to update a customer
func (dao CustomerDAOImpl) UpdateCustomer(db *gorm.DB, customer entity.Customer) (entity.Customer, error) {
	err := db.Save(&customer).Error
	return customer, err
}

func (dao *CustomerDAOImpl) DeleteCustomer(db *gorm.DB, customer entity.Customer) error {
	if err := db.Delete(&customer).Error; err != nil {
		return err
	}
	return nil
}

测试

package main

import (
	"fmt"
	"gorm_demo/dao"
	"gorm_demo/entity"
	"gorm_demo/util"

	_ "github.com/jinzhu/gorm/dialects/mysql"
)

func main() {

	db := util.GetDB()

	defer db.Close()

	db.AutoMigrate(&entity.Customer{}, &entity.Order{})

	customerDAO := dao.CustomerDAOImpl{}

	// Create a new customer
	newCustomer := entity.Customer{
		Name:    "John Doe",
		Address: "123 Main St",
		Email:   "john.doe@example.com",
	}
	createdCustomer, err := customerDAO.CreateCustomer(db, newCustomer)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("Created customer:", createdCustomer)

	// Get a customer by ID
	customer, err := customerDAO.GetCustomer(db, createdCustomer.ID)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("Retrieved customer:", customer)

	// Get all customers
	customers, err := customerDAO.GetAllCustomers(db)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("Retrieved customers:", customers)

	// Update a customer
	customer.Name = "Jane Doe"
	updatedCustomer, err := customerDAO.UpdateCustomer(db, customer)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("Updated customer:", updatedCustomer)

	// Delete a customer
	err = customerDAO.DeleteCustomer(db, customer)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("Deleted customer:", customer)
}