go练习demo数据库操作

80 阅读2分钟

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("添加成功!!!")
	}

}

// 通过userCode查询
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() //defer关闭查询连接

	//遍历查询结果
	if rows.Next() {
		fmt.Println("....")
		//result := new(chatUser)
		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()
}