1.这里用到的知识点
1.1结构体定义
1.变量定义的时候首字母大小写是有作用域的。大写全局访问,小写不能被外部包访问
2.内置了json函数 变量后面指定解析对应的json字段,空置不映射关键字
CorpName string `json:"CORP_NAME,omitempty"`
type chatUser struct {
UserCode string `json:"USER_CODE"`
UserName string `json:"USER_NAME"`
UserStatus string `json:"USER_STATUS"`
}
1.2结构体方法
参数用结构体,方法名后写
注意添加* 和不添加区别是值传递还是引用传递
func (user chatUser) toJson() {}
func (addUser *chatUser) addUser() {}
1.3UUID字符串操作
_(下划线,忽略不处理,这里是异常忽略不处理
newId, _ := uuid.NewUUID()
字符串替换类型后的方法
先转字符串
strings.Replace(newId.String(), "-", "", -1)
1.4数据库操作的函数
1.连接
2.预处理
3.执行参数
4.查询结果赋值
func (db *DB) Begin() (*Tx, error)
func (tx *Tx) Rollback() error
func (tx *Tx) Commit() error
2.demo增改查,修改那里有个事务处理
type chatUser struct {
UserCode string `json:"USER_CODE"`
UserName string `json:"USER_NAME"`
UserStatus string `json:"USER_STATUS"`
}
func (user chatUser) toJson() {
if (user == chatUser{}) {
fmt.Println("数据不存在")
return
}
str, err := json.Marshal(user)
if err == nil {
fmt.Println(string(str))
} else {
panic(err)
}
}
func (addUser *chatUser) addUser() {
if addUser == nil {
fmt.Println("用户信息为空")
return
}
if addUser.UserName == "" {
fmt.Println("用户名称为空")
return
}
if addUser.UserCode == "" {
fmt.Println("用户编码空")
return
} else {
checkUser := queryByUserCode(addUser.UserCode)
if checkUser != (chatUser{}) {
fmt.Printf("用户编码%s已经存在!!!\n", addUser.UserCode)
return
}
}
db, err := sql.Open("godror", `user="chat" password="chat" connectString="127.0.0.1:1521/orcl"`)
if err != nil {
panic(err)
}
err = db.Ping()
if err != nil {
panic(err)
}
stmt, err := db.Prepare("insert into chat_user cu(cu.id,cu.user_code,cu.user_name,cu.user_status) values (:1,:2,:3,:4)")
if err != nil {
panic(err)
}
defer stmt.Close()
newId, _ := uuid.NewUUID()
_, err = stmt.Exec(strings.Replace(newId.String(), "-", "", -1), addUser.UserCode, addUser.UserName, addUser.UserStatus)
if err != nil {
panic(err)
} else {
fmt.Println("添加成功!!!")
}
}
func queryByUserCode(userCode string) chatUser {
result := chatUser{}
if userCode == "" {
return result
}
db, err := sql.Open("godror", `user="chat" password="chat" connectString="127.0.0.1:1521/orcl"`)
if err != nil {
panic(err)
}
err = db.Ping()
if err != nil {
panic(err)
}
sqlStatement := "select cu.user_code,cu.user_name,cu.user_status from chat_user cu where cu.user_code = :1"
stmt, err := db.Prepare(sqlStatement)
if err != nil {
panic(err)
}
defer stmt.Close()
rows, err := stmt.Query(userCode) //输入sql中对应参数的值
//defer rows.Close()
if err != nil {
panic(err)
}
defer rows.Close()
if rows.Next() {
fmt.Println("....")
rows.Scan(&result.UserCode, &result.UserName, &result.UserStatus)
fmt.Printf("%s-%s-%s\n", result.UserCode, result.UserName, result.UserStatus)
return result
}
return result
}
const (
host = "127.0.0.1"
port = 1521
user = "chat"
sqlpassword = "chat"
dbname = "orcl"
)
var db *sql.DB
func initsql() {
osqlInfo := fmt.Sprintf("%s/%s@%s:%d/%s", user, sqlpassword, host, port, dbname)
DB, err := sql.Open("godror", osqlInfo)
if err != nil {
panic(err)
}
err = DB.Ping()
if err != nil {
panic(err)
}
db = DB
fmt.Println("链接成功")
}
func (addUser *chatUser) updateUser() {
if addUser == nil {
fmt.Println("用户信息为空")
return
}
if addUser.UserName == "" {
fmt.Println("用户名称为空")
return
}
if addUser.UserCode == "" {
fmt.Println("用户编码空")
return
}
initsql()
defer db.Close()
tx, err := db.Begin()
if err != nil {
panic(err)
}
stmt, err := tx.Prepare("update chat_user cu set cu.user_code=:1,cu.user_name=:2,cu.user_status=:3 where cu.user_code=:4")
if err != nil {
panic(err)
}
defer stmt.Close()
_, err = stmt.Exec(addUser.UserCode, addUser.UserName, addUser.UserStatus, addUser.UserCode)
if err != nil {
fmt.Println("回滚...")
tx.Rollback()
panic(err)
} else {
fmt.Println("修改成功!!!")
}
tx.Commit()
}