Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理

Go语言入门心法(一): 基础语法
Go语言入门心法(二): 结构体
Go语言入门心法(三): 接口
Go语言入门心法(四): 异常体系
Go语言入门心法(五): 函数
Go语言入门心法(六): HTTP面向客户端|服务端编程
Go语言入门心法(七): 并发与通道
Go语言入门心法(八): mysql驱动安装报错onnection failed
Go语言入门心法(九): 引入三方依赖
Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理
Go语言入门心法(十一): 文件处理
一: go连接mysql数据库
package mainimport ("database/sql""fmt""log"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql"
)/*
go语言连接mysql数据库操作:
*/
func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")if err != nil {fmt.Println("数据库连接异常: ", err)}// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()if err != nil {log.Fatal("数据库连接失败:", err)}log.Println("数据库连接成功: ", db.Stats())
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPMysqlToDatabaseLinkGrammar_go.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabaseLinkGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPMysqlToDatabaseLinkGrammar_go.exe
2023/10/18 18:55:22 数据库连接成功: {0 1 0 1 0 0s 0 0 0}Process finished with the exit code 0
二: go连接mysql创建表
package main/*
创建表:
*/import ("database/sql""fmt"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql""log"
)func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")if err != nil {log.Fatal(err)fmt.Println("数据库连接异常: ", err)}// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()if err != nil {log.Fatal("数据库连接失败:", err)}// 创建一张表createTable :="CREATE TABLE `sys_go_dept` (" +"`deptid` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键'," +"`deptno` bigint(11) NOT NULL COMMENT '编码编号'," +"`dname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '部门名称'," +"`location` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '地点'," +"PRIMARY KEY (`deptid`)" +") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;"println(createTable)_, err = db.Exec(createTable)if err != nil {log.Fatal("创建表失败:", err)}log.Println("数据表创建成功")}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabaseCreateTableGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database.exe
CREATE TABLE `sys_go_dept` (`deptid` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`deptno` bigint(11) NOT NULL COMMENT '编码编号',`dname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '部ocation` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '地点',PRIMARY KEY (`deptid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2023/10/18 18:52:40 数据表创建成功Process finished with the exit code 0
三: go插入数据
package mainimport ("database/sql"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql""log"
)func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")checkErr(err)// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()checkErr(err)log.Println("数据库连接成功! ")insertSql := "insert into `sys_go_dept` (deptno,dname,location)values (?,?,?) "rs, err := db.Exec(insertSql, 100000011, "销售总监", "北京市海淀区马连洼街道200号")checkErr(err)rowCount, err := rs.RowsAffected()checkErr(err)log.Printf("插入 %d 条数据", rowCount)
}func checkErr(err error) {if err != nil {log.Fatal("系统异常: ", err.Error())}
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__1_.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabaseInsertGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__1_.exe
2023/10/18 19:47:03 数据库连接成功!
2023/10/18 19:47:03 插入 1 条数据Process finished with the exit code 0
四: go修改数据
package mainimport ("database/sql"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql""log"
)func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")updateCheckErr(err)// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()updateCheckErr(err)log.Println("数据库连接成功! ")updateSql := "update `sys_go_dept` set dname=? , location=? where deptno =? "rs, err := db.Exec(updateSql, "CFO(首席财务官)", "北京市朝阳区三里屯大街2000号", 100000011)updateCheckErr(err)rowCount, err := rs.RowsAffected()updateCheckErr(err)if rowCount > 0 {log.Println("更新成功")}}func updateCheckErr(err error) {if err != nil {log.Fatal("系统异常: ", err.Error())}
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__2_.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabaseQueryGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__2_.exe
2023/10/18 20:31:26 数据库连接成功!
2023/10/18 20:31:27 更新成功Process finished with the exit code 0
五: go查询数据
package mainimport ("database/sql"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql""log"
)func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")queryCheckErr(err)// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()queryCheckErr(err)log.Println("数据库连接成功! ")querySql := "select * from sys_go_dept where deptno = ?"rows, err := db.Query(querySql, 100000011)// 延迟执行defer rows.Close()for rows.Next() {user := User{}// 顺序需与数据库表的字段对应err := rows.Scan(&user.deptid, &user.deptno, &user.dname, &user.location)queryCheckErr(err)log.Println(user)}}type User struct {deptid int64deptno int64dname stringlocation string
}func queryCheckErr(err error) {if err != nil {log.Fatal("系统异常: ", err.Error())}
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__2_.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabaseQueryGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__2_.exe
2023/10/18 20:54:42 数据库连接成功!
2023/10/18 20:54:42 {1 100000011 CFO(首席财务官) 北京市朝阳区三里屯大街2000号}
2023/10/18 20:54:42 {2 100000011 CFO(首席财务官) 北京市朝阳区三里屯大街2000号}
2023/10/18 20:54:42 {3 100000011 销售 北京市海淀区马连洼街道200号}Process finished with the exit code 0
六: go删除数据
package mainimport ("database/sql"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql""log"
)func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")deleteCheckErr(err)// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()deleteCheckErr(err)log.Println("数据库连接成功! ")deleteSql := "delete from `sys_go_dept` where deptid = ? "rs, err := db.Exec(deleteSql, 3)deleteCheckErr(err)rowCount, err := rs.RowsAffected()deleteCheckErr(err)if rowCount > 0 {log.Println("删除成功")}}func deleteCheckErr(err error) {if err != nil {log.Fatal("系统异常: ", err.Error())}
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__5_.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabaseDeleteGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__5_.exe
2023/10/18 21:02:56 数据库连接成功!
2023/10/18 21:02:56 删除成功Process finished with the exit code 0
七: go批量插入数据
package mainimport ("database/sql""fmt""log"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql"
)func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")batchInsertCheckErr(err)// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()batchInsertCheckErr(err)sqlStr, params := insertDataMap()log.Println("数据库连接成功! ")res, _ := db.Exec(sqlStr, params...) // params...: 解构id, _ := res.LastInsertId()fmt.Printf("lastId: %d insert success!", id)}// 插入多条数据
func insertDataMap() (string, []interface{}) {data := []map[string]string{{"deptno": "100000011", "dname": "CTO首席技术官", "location": "北京市朝阳区三里屯大街20003号"},{"deptno": "100000022", "dname": "CTO首席技术官", "location": "北京市海淀区马连洼30003路"},{"deptno": "100000033", "dname": "CEO总经理", "location": "北京市昌平区龙泽苑街道200000"},}batchInsertSql := "insert into `sys_go_dept` (deptno,dname,location)values "var values []interface{}for index, row := range data {if index == len(data)-1 {batchInsertSql += "(?, ?, ?)"} else {batchInsertSql += "(?, ?, ?), "}values = append(values, row["deptno"], row["dname"], row["location"])}fmt.Println("batchInsertSql:", batchInsertSql)fmt.Println("values: ", values)return batchInsertSql, values
}func batchInsertCheckErr(err error) {if err != nil {log.Fatal("系统异常: ", err.Error())}
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___2go_build_org_jd_data_org_jd_data_database__3_.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabaseBatchInsertGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___2go_build_org_jd_data_org_jd_data_database__3_.exe
batchInsertSql: insert into `sys_go_dept` (deptno,dname,location)values (?, ?, ?), (?, ?, ?), (?, ?, ?)
values: [100000011 CTO首席技术官 北京市朝阳区三里屯大街20003号 100000022 CTO首席技术官 北京市海淀区马连洼30003路 100000033 CEO总经理 北京市昌平区龙泽苑街道200000]
2023/10/18 21:24:20 数据库连接成功!
lastId: 9 insert success!Process finished with the exit code 0
Go操作Mysql驱动实现CRUD完整文档
八: go语言预处理批量插入
预处理认知升维:
(1)sql包还提供了一种预编译的方式在执行SQL语句,通常在处理批量语句时会用到这种方式,这种方式比手动拼接字符串SQL语句高效,而且可以防止SQL注入攻击
(2) 使用Exec函数执行插入语句时,其中"?"表示参数占位符,使用这种方式参数可以有效防止出现SQL注入这类漏洞;
package main/*
(1)sql包还提供了一种预编译的方式在执行SQL语句,通常在处理批量语句时会用到这种方式,这种方式比手动拼接字符串SQL语句高效,而且可以防止SQL注入攻击
(2) 使用Exec函数执行插入语句时,其中"?"表示参数占位符,使用这种方式参数可以有效防止出现SQL注入这类漏洞;
*/
import ("database/sql""fmt""log"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql"
)
func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")batchPrepareInsertCheckErr(err)// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()batchPrepareInsertCheckErr(err)batchInsertSql, params := initParamData()log.Println("数据库连接成功! ")stmt, err := db.Prepare(batchInsertSql) // 预处理SQLdefer stmt.Close()batchPrepareInsertCheckErr(err)res,err := stmt.Exec(params...)batchPrepareInsertCheckErr(err)id, _ := res.LastInsertId()rowCount,err:=res.RowsAffected()batchPrepareInsertCheckErr(err)fmt.Printf("插入了 %d 条数据",rowCount)fmt.Printf("lastId: %d insert success!", id)}// 插入多条数据
func initParamData() (string, []interface{}) {data := []map[string] interface{}{{"deptid":0,"deptno": 100000011, "dname": "CPO首席产品官", "location": "北京市朝阳区三里屯大街20003号"},{"deptid":0,"deptno": 100000044, "dname": "COO首席营销官", "location": "北京市海淀区马连洼30003路"},{"deptid":0,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市昌平区龙泽苑街道200000"},{"deptid":"0","deptno": 100000044, "dname": "CTO首席技术官", "location": "北京市海淀区马连洼30003路"},{"deptid":nil,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市房山区龙泽苑街道200000"},}batchInsertSql := "insert into `sys_go_dept` values "var values []interface{}for index, row := range data {if index == len(data)-1 {batchInsertSql += "(?,?, ?, ?)"} else {batchInsertSql += "(?,?, ?, ?), "}values = append(values,row["deptid"], row["deptno"], row["dname"], row["location"])}fmt.Println("batchInsertSql:", batchInsertSql)fmt.Println("values: ", values)return batchInsertSql, values
}func batchPrepareInsertCheckErr(err error){if err != nil {log.Fatal("系统异常: ", err.Error())}
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__4_.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabasePrepareBatchInsertGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__4_.exe
batchInsertSql: insert into `sys_go_dept` values (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?)
values: [0 100000011 CPO首席产品官 北京市朝阳区三里屯大街20003号 0 100000044 COO首席营销官 北京市海淀区马连洼30003路 0 100000055 CFO首席财务官 北京市昌平区龙泽苑街道200000 0 100000044 CTO首席技术官 北京市海淀区马连洼30003路 <nil> 100000055 CFO首席财务官 北京市房山区龙泽苑街道200000]
2023/10/19 12:24:41 数据库连接成功!插入了 5 条数据lastId: 44 insert success!
Process finished with the exit code 0
说明: batchInsertSql: insert into `sys_go_dept` values (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?)
从拼接的insert into `sys_go_dept`语句可以看得出,不用指定具体的插入字段,主键自增长, 此时,主键赋值o或者时nil,从而可以添加全部数据,而不用特意指定那几列添加数据
九: go语言操作数据看事务处理
package main/*
go语言操作数据库时事务处理(ACID)
*/
import ("database/sql""fmt""log"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql"
)
func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")batchPrepareTxInsertCheckErr(err)// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()batchPrepareTxInsertCheckErr(err)batchInsertSql, params := initParamDataTx()log.Println("数据库连接成功! ")tx,err :=db.Begin()batchPrepareTxInsertCheckErr(err)stmt, err := db.Prepare(batchInsertSql) // 预处理SQLcheckErrWithTx(err,tx) // 执行回滚defer stmt.Close()batchPrepareTxInsertCheckErr(err)res,err := stmt.Exec(params...)checkErrWithTx(err,tx) // 执行回滚tx.Commit() // 提交println("事务处理完毕")id, _ := res.LastInsertId()rowCount,err:=res.RowsAffected()batchPrepareTxInsertCheckErr(err)fmt.Printf("插入了 %d 条数据",rowCount)fmt.Printf("lastId: %d insert success!", id)}// 插入多条数据
func initParamDataTx() (string, []interface{}) {data := []map[string] interface{}{{"deptid":0,"deptno": 100000011, "dname": "CPO首席产品官", "location": "北京市朝阳区三里屯大街20003号"},{"deptid":0,"deptno": 100000044, "dname": "COO首席营销官", "location": "北京市海淀区马连洼30003路"},{"deptid":0,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市昌平区龙泽苑街道200000"},{"deptid":"0","deptno": 100000044, "dname": "CTO首席技术官", "location": "北京市海淀区马连洼30003路"},{"deptid":nil,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市房山区龙泽苑街道200000"},{"deptid":0,"deptno": 100000011, "dname": "CPO首席产品官", "location": "北京市朝阳区三里屯大街20003号"},{"deptid":0,"deptno": 100000044, "dname": "COO首席营销官", "location": "北京市海淀区马连洼30003路"},{"deptid":0,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市昌平区龙泽苑街道200000"},{"deptid":"0","deptno": 100000066, "dname": "CTO首席技术官", "location": "北京市海淀区马连洼30003路"},{"deptid":nil,"deptno": 100000077, "dname": "CFO首席财务官", "location": "北京市房山区龙泽苑街道200000"},{"dname": "CPO首席产品官", "location": "北京市朝阳区三里屯大街20003号"},{"deptid":0,"deptno": 100000088, "dname": "COO首席营销官", "location": "北京市海淀区马连洼30003路"},{"deptid":0,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市昌平区龙泽苑街道200000"},{"deptid":"0","deptno": 100000099, "dname": "CTO首席技术官", "location": "北京市海淀区马连洼30003路"},{"deptid":nil,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市房山区龙泽苑街道200000"},{"deptid":0,"deptno": 100000011, "dname": "CPO首席产品官", "location": "北京市朝阳区三里屯大街20003号"},{"deptid":0,"deptno": 100000044, "dname": "COO首席营销官", "location": "北京市海淀区马连洼30003路"},{"deptid":0,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市昌平区龙泽苑街道200000"},{"deptid":"0","deptno": 100000044, "dname": "CTO首席技术官", "location": "北京市海淀区马连洼30003路"},{"deptid":nil,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市房山区龙泽苑街道200000"},{"deptid":0,"deptno": 100000011, "dname": "CPO首席产品官", "location": "北京市朝阳区三里屯大街20003号"},{"deptid":0,"deptno": 100000044, "dname": "COO首席营销官", "location": "北京市海淀区马连洼30003路"},{"deptid":0,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市昌平区龙泽苑街道200000"},{"deptid":"0","deptno": 100000066, "dname": "CTO首席技术官", "location": "北京市海淀区马连洼30003路"},{"deptid":nil,"deptno": 100000077, "dname": "CFO首席财务官", "location": "北京市房山区龙泽苑街道200000"},{"deptid":0,"deptno": 100000011, "dname": "CPO首席产品官", "location": "北京市朝阳区三里屯大街20003号"},{"deptid":0,"deptno": 100000088, "dname": "COO首席营销官", "location": "北京市海淀区马连洼30003路"},{"deptid":0,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市昌平区龙泽苑街道200000"},{"deptid":"0","deptno": 100000099, "dname": "CTO首席技术官", "location": "北京市海淀区马连洼30003路"},{"deptid":nil,"deptno": 100000055, "dname": "CFO首席财务官", "location": "北京市房山区龙泽苑街道200000"},}batchInsertSql := "insert into `sys_go_dept` values "var values []interface{}for index, row := range data {if index == len(data)-1 {batchInsertSql += "(?,?, ?, ?)"} else {batchInsertSql += "(?,?, ?, ?), "}values = append(values,row["deptid"], row["deptno"], row["dname"], row["location"])}fmt.Println("batchInsertSql:", batchInsertSql)fmt.Println("values: ", values)return batchInsertSql, values
}func batchPrepareTxInsertCheckErr(err error){if err != nil {log.Fatal("系统异常: ", err.Error())}
}// 事务回滚
func checkErrWithTx(err error,tx *sql.Tx) {if err != nil {tx.Rollback()log.Fatal("系统异常,事务将回滚:",err)}
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabaseTxInsertGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database.exe
batchInsertSql: insert into `sys_go_dept` values (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?), (?,?, ?, ?)
values: [0 100000011 CPO首席产品官 北京市朝阳区三里屯大街20003号 0 100000044 COO首席营销官 北京市海淀区马连洼30003路 0 100000055 CFO首席财务官 北京市昌平区龙泽苑街道200000 0 100000044 CTO首席技术官 北京市海淀区马连洼30003路 <北京市朝阳区三里屯大街20003号 0 100000044 COO首席营销官 北京市海淀区马连洼30003路 0 100000055 CFO首席财务官 北京市昌平区龙泽苑街道200000 <nil> <nil> CTO首席技术官 北京市海淀区马连洼30003路 <nil> 100000077 CFO首席财务官 北京市房OO首席营销官 北京市海淀区马连洼30003路 0 100000055 CFO首席财务官 北京市昌平区龙泽苑街道200000 0 100000099 CTO首席技术官 北京市海淀区马连洼30003路 <nil> 100000055 CFO首席财务官 北京市房山区龙泽苑街道200000 0 100000011 CPO首席产品官 北京市朝阳区三里屯大街20003号 0 100000044 COO
首席营销官 北京市海淀区马连洼30003路 0 100000055 CFO首席财务官 北京市昌平区龙泽苑街道200000 0 100000044 CTO首席技术官 北京市海淀区马连洼30003路 <nil> 100000055 CFO首席财务官 北京市房山区龙泽苑街道200000 0 100000011 CPO首席产品55 CFO首席财务官 北京市昌平区龙泽苑街道200000 0 100000066 CTO首席技术官 北京市海淀区马连洼30003路 <nil> 100000077 CFO首席财务官 北京市房山区龙泽苑街道200000 0 100000011 CPO首席产品官 北京市朝阳区三里屯大街20003号 0 100000088 C 100000099 CTO首席技术官 北京市海淀区马连洼30003路 <nil> 100000055 CFO首席财务官 北京市房山区龙泽苑街道200000]
2023/10/20 17:23:45 数据库连接成功!
2023/10/20 17:23:45 系统异常,事务将回滚:Error 1048 (23000): Column 'deptno' cannot be null
十: 异常:converting argument $1 type: unsupported type []interface {}, a slice of interface
log.Println("数据库连接成功! ")
tx,err :=db.Begin()
batchPrepareTxInsertCheckErr(err)
stmt, err := db.Prepare(batchInsertSql) // 预处理SQL
checkErrWithTx(err,tx) // 执行回滚
defer stmt.Close()
batchPrepareTxInsertCheckErr(err)
res,err := stmt.Exec(params)
checkErrWithTx(err,tx) // 执行回滚
tx.Commit() // 提交
println("事务处理完毕")
id, _ := res.LastInsertId()
如上述代码,stmt.Exec(params) 出入参数即报错: sql: converting argument $1 type: unsupported type []interface {}, a slice of interface;
字面意思是sqlx在解析两个占位符并试图填入参数时,第一个参数类型是空指针的切片,而预期是args这个可变参数中的第一个。
因而了解了一下golang中的可变参数,即…运算符
当…Type做为参数时,本质上函数会把参数转化成一个Type类型的切片,因而在上述代码中,Service层调以可变参数形式传入一个参数,在Exec中的args就已经是[]interface{}类型了,若是直接把args做为func (s *Stmt) Exec args …interface{}) (Result, error)的参数,对于Exec来讲,收到的args就只有一个长度为1的切片,其元素类型为[]interface{},因而就有了上述的报错,解决办法很简单,就是在一个slice后加上…,这样就能把它拆包成一个可变参数的形式传入函数。
可以查看下Exce源代码:
/ Exec executes a prepared statement with the given arguments and // returns a Result summarizing the effect of the statement. // // Exec uses context.Background internally; to specify the context, use // ExecContext. func (s *Stmt) Exec(args ...any) (Result, error) {return s.ExecContext(context.Background(), args...) }入参为可变参数: 函数会把参数转化成一个Type类型的切片,正确的调用方式应该是这样:
res,err := stmt.Exec(params...)
十一: go语言queryRow函数查询单条数据
package mainimport ("database/sql""fmt"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql""log"
)func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")queryRowCheckErr(err)// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()queryRowCheckErr(err)log.Println("数据库连接成功! ")queryRowSql := "select * from sys_go_dept where deptno = ?"type user struct {deptid int64deptno int64dname stringlocation string}userData := user{}err = db.QueryRow(queryRowSql, 100000022).Scan(&userData.deptid, &userData.deptno, &userData.dname, &userData.location)queryRowCheckErr(err)println("查询到的单条数据: ")fmt.Println(userData)}func queryRowCheckErr(err error) {if err != nil {if err == sql.ErrNoRows {// 结果没有行,但没有错误log.Fatal("没有找到记录")} else {log.Fatal("系统异常: ", err.Error())}}
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabaseQueryRowGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database.exe
2023/10/21 20:30:33 数据库连接成功!
查询到的单条数据:
{7 100000022 CTO首席技术官 北京市海淀区马连洼30003路}Process finished with the exit code 0
十二: 设置最大连接数|最大闲暇数据
package main/*设置数据库连接的最大连接数|最大闲置连接数
*/
import ("database/sql""time"// 注册驱动器 _下划线表示执行驱动中的init函数,不使用其他函数_ "github.com/go-sql-driver/mysql""log"
)func main() {db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/tope-pay-user")querySetConnNumCheckErr(err)// 最大连接数db.SetMaxOpenConns(100)// 最大闲暇数db.SetMaxIdleConns(20)// 设置闲暇时间db.SetConnMaxIdleTime(time.Second)db.SetConnMaxLifetime(time.Second * 2)// 延迟执行Closer()函数defer db.Close()// 验证连接的可用性err = db.Ping()querySetConnNumCheckErr(err)log.Println("数据库连接成功! ")querySql := "select * from sys_go_dept where deptno = ?"rows, err := db.Query(querySql, 100000055)// 延迟执行defer rows.Close()for rows.Next() {// 顺序需与数据库表的字段对应// 顺序需与数据库表的字段对应err := rows.Scan(&deptid, &deptno, &dname, &location)querySetConnNumCheckErr(err)log.Printf("deptid = %d , deptno = %d ,dname = %s ,location = %s", deptid, deptno, dname, location)}}var (deptid int64deptno int64dname stringlocation string
)func querySetConnNumCheckErr(err error) {if err != nil {log.Fatal("系统异常: ", err.Error())}
}
运行效果:
am_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__2_.exe D:\program_file\go_workspace\org.jd.data\database\OOPMysqlToDatabaseSetConnNumMaxIdleConnsGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_org_jd_data_org_jd_data_database__2_.exe
2023/10/22 13:16:55 deptid = 56 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 58 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 61 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 63 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 66 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 68 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 71 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 73 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 76 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 78 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 81 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 86 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 88 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 91 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 93 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 96 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 101 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 103 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 106 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 108 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 111 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 116 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 118 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 121 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 123 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 126 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 131 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 133 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 136 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 138 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 141 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 146 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 148 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 151 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 153 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 156 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 161 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 163 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 166 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 168 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 171 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 176 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 178 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 181 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 183 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 186 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 191 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 193 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 196 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 198 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 201 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 206 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 208 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 211 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 213 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 216 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 221 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 223 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 226 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 228 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 231 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 236 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 238 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 241 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 243 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 246 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 251 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 253 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 256 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 258 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 261 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 266 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 268 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 271 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 273 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 276 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 281 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 283 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 286 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 288 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 291 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 296 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 298 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 301 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 303 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 306 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 311 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 313 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 316 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 318 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 321 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 326 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 328 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 331 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 333 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 336 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 341 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 343 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 346 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 348 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 351 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 356 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市昌平区龙泽苑街道200000
2023/10/22 13:16:55 deptid = 358 , deptno = 100000055 ,dname = CFO首席财务官 ,location = 北京市房山区龙泽苑街道2000000
Process finished with the exit code 0
相关文章:
Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理
Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…...
【鸿蒙软件开发】进度条Progress
文章目录 前言一、进度条Progress1.1 创建进度条1.2 进度条样式进度条样式ProgressType.Linear(线性样式)ProgressType.Ring(环形无刻度样式)ProgressType.ScaleRing(环形有刻度样式)ProgressType.Eclipse&…...
Java后端开发(九)-- idea(2022版)将commit(未push)的 本地仓库 的 多条commit记录 进行撤销
目录 1.多次 修改Test01类后,提交到本地仓库 。 2.多次重复 1 的步骤,多次commit成功后,在Git =》Log中会显示,commit记录...
【蓝桥每日一题]-动态规划 (保姆级教程 篇10)#方格取数
高能预警:讲了这么久动态规划了,该上点有难度的题吧 目录 题目:方格取数 思路(解法一): 解法二: 题目:方格取数 思路(解法一): 如果只有两个方向…...
Git GUI工具:SourceTree代码管理
Git GUI工具:SourceTree SourceTreeSourceTree的安装SourceTree的使用 总结 SourceTree 当我们对Git的提交、分支已经非常熟悉,可以熟练使用命令操作Git后,再使用GUI工具,就可以更高效。 Git有很多图形界面工具,这里…...
4 OpenCV实现多目三维重建(多张图片增量式生成稀疏点云)【附源码】
本文是基于 OpenCV4.80 进行的,关于环境的配置可能之后会单独说,先提一嘴 vcpkg 真好用 1 大致流程 从多张图片逐步生成稀疏点云,这个过程通常包括以下步骤: 初始重建: 初始两张图片的选择十分重要,这是整…...
【Java基础面试三十九】、 finally是无条件执行的吗?
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官: finally是无条件执行的…...
【讲座笔记】基于 Apache Calcite 的多引擎指标管理最佳实践|CommunityOverCode Asia 2023 | 字节开源
引言 三个问题 (问题解法) 1套SQL 2种语法 统一SQL的实践案例 虚拟列的实践案例 SQL Define Function 指标管理的实现 在这里插入图片描述...
蓝桥杯 (猜生日、棋盘放麦子、MP3储存 C++)
思路: 1、用循环。 2、满足条件,能整除2012、3、12且month等于6、day<30 #include<iostream> using namespace std; int main() {for (int i 19000101; i < 20120312; i){int month i / 100 % 100;int day i % 100;if (i % 2012 0 &…...
求 k 整除最大元素和(dp)
Description 给你一个整数数组,请你在其中选取若干个元素, 使得其和值能被 k 整除,输出和值最大的那个和值。 最后的数字可能很大,所以结果需要对 19260817 取模。 Input 第一行是两个正整数 n,k:表示数…...
代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II
LeetCode T491 递增子序列 题目链接:491. 递增子序列 - 力扣(LeetCode) 题目思路: 首先这里的测试用例很容易误导我们,这道题不能使用上次子集的思路对数组先排序,使用一个used数组来解决问题. 我们用[4,7,6,7]举例这道题的递增序列不存在[4,6,7,7]这个…...
【六:(mock数据)spring boot+mybatis+yml】
目录 1.1、代码编写Demo类User类启动类 APplication 1.2、配置类查询语句的配置 mysql.ymlspringboot的配置 application.yml日志的配置 logback.xml数据库的配置 mybatis-config.xml 1.3、测试:1.3.1、测试获取用户数1.3.2、添加用户1.3.3、数据的更新1.3.4、数据的…...
51单片机KeyWard
eg1: 单片机键盘的分类 键盘分为编码键盘和非编码键盘,键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值得称为编码键盘,如计算机键盘,而靠软件来识别的称为非编码键盘,在单片机组成的各种…...
【简记】getprop, setprop 命令使用
getprop, setprop 命令使用 1、终端设置、读取系统属性 // 例 adb shell setprop "test" "1" adb shell getprop "test"2、安卓读取系统配置 部分属性需要通过反射 android.os.SystemProperties 的方法获取,参见 android 获取手机…...
Ubuntu22.04安装nvidia-docker
安装docker 参考这篇文章:Ubuntu22.04安装docker - 掘金 安装nvidia-docker 参考这篇文章:Ubuntu 22.04 LTS : NVIDIA Container Toolkit : Install : Server World 流程: curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | …...
简单的代码优化(后端)
上一篇谈了谈简单的前端的优化,这次就以下几点谈谈后端的优化。 书写时常见的。 循环里面不要走IO流。 走IO,是要对硬盘进读写操作的。就结论而言,硬盘的读写速度是低于内存的,比如说硬盘上读一次数据,需要1秒&#…...
3.Node-事件循环的用法
题记 node.js事件循环的使用方法 Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都…...
2525.根据规则将箱子分类/并查集/动态规划
2525. 根据规则将箱子分类 - 力扣(LeetCode) 给你四个整数 length ,width ,height 和 mass ,分别表示一个箱子的三个维度和质量,请你返回一个表示箱子 类别 的字符串。 如果满足以下条件,那么…...
2023年10月小程序云开发cms内容管理无法使用,无法同步内容模型到云开发数据库的解决方案
一,问题描述 最近越来越多的同学找石头哥,说cms用不了,其实是小程序官方最近又搞大动作了,偷偷的升级的云开发cms(内容管理)以下都称cms,不升级不要紧,这一升级,就导致我…...
无论有没有按钮,iPhone都可以进行截屏操作!如何在iPhone上截屏
通过简单的按键组合,可以很容易地将iPhone屏幕的图片捕获到图像文件中,并保存到照片库中。以下是操作方法。 什么是屏幕截图 屏幕截图是指通常包含你在设备屏幕上看到的内容的精确副本的图像。在设备内拍摄的数字屏幕截图通常使用相机拍摄物理屏幕的照…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
