这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
一、CRUD
这些是数据库比较常用的操作,就只是列举下操作,不深入探讨了。
1、建库建表
2、查询
(1)单行查询
(2)多行查询
3、插入
4、更新
5、删除
二、MySql预处理
普通SQL语句执行过程:
预处理执行过程:
预处理执行过程:
为什么要预处理?
- 优化MySQL服务器重复执行SQL的方法,可以提升服务器性能,提前让服务器编译,一次编译多次执行,节省后续编译的成本。
- 避免SQL注入问题。
SQL注入问题
// sql注入示例
func sqlInjectDemo(name string) {
sqlStr := fmt.Sprintf("select id, name, age from user where name='%s'", name)
fmt.Printf("SQL:%s\n", sqlStr)
var u user
err := db.QueryRow(sqlStr).Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Printf("exec failed, err:%v\n", err)
return
}
fmt.Printf("user:%#v\n", u)
}
究竟会出现哪些问题呢? 比如我此时根本不知道数据库的信息,但是我却可以通过下面这条语句,访问数据库信息
sqlInjectDemo("xxx' or 1=1#")
//控制台显示:
SQL:select id, name, age from user where name='xxx' or 1=1#'
user:main.user{id:1, age:18, name:"ggboy"}
因为or 1=1,会执行后半部分
今天还学了sqlx这个库的增删改查。明天要步入中间件之类的学习!