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屏幕的图片捕获到图像文件中,并保存到照片库中。以下是操作方法。 什么是屏幕截图 屏幕截图是指通常包含你在设备屏幕上看到的内容的精确副本的图像。在设备内拍摄的数字屏幕截图通常使用相机拍摄物理屏幕的照…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...