GO从入门到进阶教程系列 - 研发高性能ORM框架操作mysql篇

2 篇文章 0 订阅
2 篇文章 0 订阅

     上一篇教程我们了解到了基础的GO语法,今天我们来学习如何使用GO操作mysql,下面就直接进入步骤操作环节

1. 先获取mysql驱动,类似Java加载驱动jar, 通过window cmd命令或者Linux控制台执行

go get github.com/go-sql-driver/mysql

2. 我们先写个数据库连接对象方便扩展

// 数据库配置
type DBConfig struct {
	Host      string // 地址IP
	Port      int    // 数据库端口
	Database  string // 数据库名称
	Username  string // 账号
	Password  string // 密码
}

3. 通过数据库配置进行mysql实例化

func NewMysql() (*sql.DB, error) {
	// 初始化mysql连接参数
	conf := DBConfig{
		Host:     "127.0.0.1",
		Port:     3306,
		Database: "test",
		Username: "root",
		Password: "123456",
	}
	// 定义占位符字符串,使用配置值替换%s和%d
	link := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", conf.Username, conf.Password, conf.Host, conf.Port, conf.Database)
	// 打开mysql获得实例对象
	db, err := sql.Open("mysql", link)
	// 打开mysql失败,返回nil对象,以及返回err对象
	if err != nil {
		panic(util.AddStr("mysql初始化失败: ", err.Error()))
		return nil, errors.New("mysql初始化失败: " + err.Error())
	}
	// 打开mysql成功返回db对象,err=nil
	return db, nil
}

4. 获得mysql操作实例后,进行增删查改操作(由于时间关系,暂时只写了新增示例,包含事务和非事务)

func CRUD(db *sql.DB) error {
	// 编写需要执行的sql
	createSql := "insert test_user(username, password, age, sex) values(?,?,?,?)"
	// 预编译sql
	stmt, err := db.Prepare(createSql)
	if err != nil {
		panic("预编译失败: " + err.Error())
	}
	// 提交编译sql对应参数
	ret, err := stmt.Exec("zhangsan", "123456", 18, 1)
	if err != nil {
		panic("提交数据失败: " + err.Error())
	}
	// 保存成功后获取自增ID
	fmt.Println(ret.LastInsertId())
	return nil
}
func CRUD1(db *sql.DB) error {
	// 编写需要执行的sql
	createSql := "insert test_user(username, password, age, sex) values(?,?,?,?)"
	// 预编译sql,事务模式
	tx, err := db.Begin()
	if err != nil {
		panic("开启事务失败: " + err.Error())
	}
	stmt, err := tx.Prepare(createSql)
	if err != nil {
		tx.Rollback() // 回滚事务
		panic("预编译失败: " + err.Error())
	}
	// 提交编译sql对应参数
	ret, err := stmt.Exec("zhangsan", "123456", 18, 1)
	if err != nil {
		tx.Rollback() // 回滚事务
		panic("提交数据失败: " + err.Error())
	}
	// 保存成功后获取自增ID
	fmt.Println(ret.LastInsertId())
	tx.Commit() // 提交事务
	return nil
}

5. 最后执行测试用例test

func TestMysql1(t *testing.T) {
	db, err := NewMysql()
	if err != nil {
		panic(err)
	}
	CRUD(db)
}

func TestMysql2(t *testing.T) {
	db, err := NewMysql()
	if err != nil {
		panic(err)
	}
	CRUD1(db)
}

上面的几个示例基本涵盖GO操作mysql的用法,下一篇文章我会讲解如何封装可扩展性强的mysql底层,敬请期待!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值