IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> sqlx简单应用 -> 正文阅读

[Java知识库]sqlx简单应用

package dbclient

import (
	"database/sql/driver"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
	"reflect"
)

var db *sqlx.DB

func InitDB() (err error) {
	dsn := "root:123456@tcp(127.0.0.1:3306)/nacos?charset=utf8mb4&parseTime=True"
	db, err = sqlx.Connect("mysql", dsn)
	if err != nil {
		fmt.Println("dsn 格式有误")
		return err
	}
	//设置最大连接数
	db.SetMaxOpenConns(10)
	//设置最大空闲链接数
	db.SetMaxIdleConns(5)
	fmt.Println("db connect success")
	return
}

//db.Get获取单条记录
func SelectOne() {
	sqlStr := "select username,role from roles where username = ?"
	var r role
	err := db.Get(&r, sqlStr, "nacos")
	if err != nil {
		fmt.Println("db get failed,", err)
		return
	}
	fmt.Printf("%v\n", r)
}

//db.Select 获取多条记录
func SelectMore() {
	sqlStr := "select username,role from roles"
	var rs []role
	err := db.Select(&rs, sqlStr)
	if err != nil {
		fmt.Println("db get failed,", err)
		return
	}
	fmt.Printf("%v\n", rs)
}

func Update() {
	sqlStr := "update roles set role = ? where username =?"
	exec, err := db.Exec(sqlStr, "wwwww", "heheheh")
	if err != nil {
		fmt.Printf("update is failed,err:%v\n", err)
		return
	}
	fmt.Println(exec.RowsAffected())
}

func Insert() {
	sqlStr := "insert into roles values(?,?)"
	exec, err := db.Exec(sqlStr, "wwwww", "heheheh")
	if err != nil {
		fmt.Printf("update is failed,err:%v\n", err)
		return
	}
	fmt.Println(exec.RowsAffected())
}

//使用NamedExec
//用来绑定struct中同名的字段
func NamedExec() {
	sqlStr := "insert into roles values(:username,:role)"
	r := role{
		"zhangsan",
		"admin",
	}
	exec, err := db.NamedExec(sqlStr, r)
	if err != nil {
		fmt.Printf("update is failed,err:%v\n", err)
		return
	}
	fmt.Println(exec.RowsAffected())
}

func NamedQuery() {
	sqlStr := "select * from roles"
	rows, err := db.NamedQuery(sqlStr, role{})
	if err != nil {
		fmt.Println("NamedQuery filed,err:", err)
		return
	}
	for rows.Next() {
		var r role
		rows.StructScan(&r)
		fmt.Println(r)
	}
}

func TxExec() {
	tx, err := db.Begin()
	if err != nil {
		fmt.Println("tx begin failed,err:", err)
		return
	}
	sqlStr := "update roles set role = ? where username =?"
	_, err = tx.Exec(sqlStr, "wwww11w", "heheheh")
	//err = errors.New("ss")
	if err != nil {
		fmt.Printf("update is failed,err:%v\n", err)
		return
		tx.Rollback()
	}
	tx.Commit()
}

//sqlx.in使用

type role struct {
	Username string `db:"username"`
	Role     string `db:"role"`
}

//要使用sqlx.in进行数据插入 需要结构体实现driver.Valuer接口
func (r *role) Value() (driver.Value, error) {
	return []interface{}{r.Username, r.Role}, nil
}

//使用sqlx.in进行插入
func BatchInsert(rs []interface{}) error {
	//这里不太方便需要手写固定个数的(?)
	query, args, err := sqlx.In("insert into roles values(?),(?)", rs...)
	if err != nil {
		fmt.Println("sqlx.in failed", err)
		return err
	}
	fmt.Println(query) //生成的sql语句
	fmt.Println(args)  //生成的参数
	db.Exec(query, args)
	return err
}

// todo 这个方法还是要再看一下
func NamedExecInsert() error {
	var rs = make([]*role, 2)
	rs = append(rs, &role{
		"lisi",
		"admin",
	}, &role{
		"lisi1",
		"admin1",
	})
	exec, err := db.NamedExec("insert into roles values (:username,:role)", rs)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(exec.RowsAffected())
	return err
}

func QueryIn(usernames []string) (rs []role, err error) {
	query, args, err := sqlx.In("select * from roles where username in (?)", usernames)
	if err != nil {
		fmt.Println("sqlx.in failed,err", err)
		return nil, err
	}
	fmt.Println("query:", query)
	// sqlx.In 返回带 `?` bindvar的查询语句, 我们使用Rebind()重新绑定它
	query = db.Rebind(query)
	fmt.Println(reflect.TypeOf(args))
	// todo 对切片...生成的啥 对数组...生成的切片
	err = db.Select(&rs, query, args...)
	if err != nil {
		fmt.Println("select failed", err)
		return rs, err
	}
	fmt.Println(rs)
	return rs, err
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:51:23  更:2022-01-11 23:53:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:30:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码