PreparedStatement接口是Statement的子接口,属于预处理操作,与直接使用Statement不同的是,PreparedStatement在操作时,是先在数据表中准备好了一条SQL语句,但是此SQL语句的具体内容暂时不设置,而是之后再进行设置。
PreparedStatement接口是Statement的子接口,属于预处理操作,与直接使用Statement不同的是,PreparedStatement在操作时,是先在数据表中准备好了一条SQL语句,但是此SQL语句的具体内容暂时不设置,而是之后再进行设置。
使用SQL中的SELECT语句可以查询出数据库的全部结果,在JDBC的操作中数据库的所有查询记录将使用ResultSet进行接收,并使用ResultSet显示内容。
1 | https://archive.apache.org/dist/avro/avro-1.10.1/java/ |
avro-tools.jar常用命令:Working with Apache Avro files in Amazon S3
也可以查看help
1 | java -jar ./avro-tools-1.10.1.jar help |
1 | java -jar ./avro-tools-1.10.1.jar getschema ./xxxx.avro |
1 | java -jar ./avro-tools-1.10.1.jar tojson ./nova_ads_access_log-0-0008589084.avro | less |
编译avro IDL文件,参考
1 | https://avro.apache.org/docs/current/gettingstartedjava.html |
定义schema文件kst.avsc
1 | { |
编译avro IDL文件
1 | java -jar ./src/main/resources/avro-tools-1.10.1.jar compile schema ./src/main/avro/kst.avsc ./src/main/java |
进入impala shell,port为Impala Daemon Beeswax 端口
1 | impala-shell -i ip:port -k |
使用impala shell直接运行SQL
1 | impala-shell -i ip:port -k --quiet -B -d default -q "select count(*) from table1 where ds='2021-01-20'" |
退出
1 | exit; |
1 | sudo apt-get update |
1 | sudo service mysql restart |
1 | sudo apt-get install libapache2-mod-auth-mysql |
16.04使用下面命令
1 | sudo apt-get install libmysqlclient-dev |
1 | mysql -u root -p |
如果修改了配置文件my.cnf配置文件,需要重启数据库(修改方法在下面),重启数据库之前需要先重新载入apparmor配置文件,使用下面命令重新载入:
1 | sudo /etc/init.d/apparmor restart |
重新启动数据库
1 | sudo /etc/init.d/mysql start |
1.查看MySQL数据库服务器和数据库MySQL字符集。
1 | SHOW VARIABLES LIKE 'character_set_%'; |
J2SE 5.0提供了很多新的特征。其中一个很重要的特征就是对元数据(Metadata)的支持。在J2SE 5.0中,这种元数据称为注解(Annotation)。
通过使用注解,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充的信息。
& 是取地址符号 , 即取得某个变量的地址 , 如 &a
参考:Go中*和&区别
println打印对象只能打印出其指针,需要使用fmt.Printf,如下
1 | fmt.Printf("%+v\n", user) |
defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行。
defer语句通常用于一些成对操作的场景:打开连接/关闭连接;加锁/释放锁;打开文件/关闭文件等。
defer在一些需要回收资源的场景非常有用,可以很方便地在函数结束前做一些清理操作。在打开资源语句的下一行,直接一句defer就可以在函数返回前关闭资源,可谓相当优雅。
1 | f, _ := os.Open("defer.txt") |
1 | go get -u github.com/sirupsen/logrus |
文档
1 | https://pkg.go.dev/github.com/sirupsen/logrus#section-readme |
使用
1 | package main |
1 | go get -u github.com/rs/zerolog/log |
使用
1 | log.Logger = log.With().Caller().Logger() |
1 | go get -u go.uber.org/zap |
文档
1 | https://pkg.go.dev/go.uber.org/zap |
zap提供了2种logger,分别是Logger和SugaredLogger
在性能要求高但是不是很重要的场景下,适合使用SugaredLogger
1 | logger, _ := zap.NewProduction() |
输出
1 | {"level":"info","ts":1703922949.209576,"caller":"server/main.go:109","msg":"failed to fetch URL","url":"http://example.com","attempt":3,"backoff":1} |
在性能要求高且需要类型安全的场景下,适合使用Logger
1 | logger, _ := zap.NewProduction() |
输出
1 | {"level":"info","ts":1703923022.603034,"caller":"server/main.go:108","msg":"failed to fetch URL","url":"http://example.com","attempt":3,"backoff":1} |
NewExample/NewDevelopment/NewProduction区别
NewExample适用于测试代码,它将DebugLevel及以上级别的日志以JSON格式标准输出,但省略了时间戳和调用函数,以保持示例输出简短和确定。
NewDevelopment适用于开发环境,它以人类友好的格式将DebugLevel及以上级别的日志写入标准错误。
NewProduction适用于生产环境,它将info level及以上级别的日志以JSON格式写入标准错误。
其他参考文档:Go 每日一库之 zap
golang常用库包:log日志记录-uber的Go日志库zap使用详解
参考:go各框架的log日志
日志文件按时间回滚:natefinch/lumberjack
1 | go get gopkg.in/natefinch/lumberjack.v2 |
int转string
1 | s := strconv.Itoa(i) |
int64转string
1 | s := strconv.FormatInt(i, 10) |
string转int
1 | i, err := strconv.Atoi(s) |
string转int64
1 | i, err := strconv.ParseInt(s, 10, 64) |
float转string
1 | v := 3.1415926535 |
string转float
1 | s := "3.1415926535" |
参考:Go语言从入门到精通 - 【精华篇】strconv包详解
可以使用 jinzhu/copier
使用jinzhu/copier
1 | go get github.com/jinzhu/copier |
copy
1 | copier.Copy(&employee, &user) |
deepcopy,区别是deepcopy的时候,对dst的属性进行修改,是肯定不会影响src的
1 | var dst User |
如果想在复制的时候,对属性进行修改,可以使用方法赋值,注意需要使用copier.Copy,如下
1 | type User struct { |
其他类似的库还有ulule/deepcoper,参考:golang struct拷贝工具(类似于java中 BeanUtils.copyProperties())
以及
1 | https://github.com/jinzhu/copier |
golang没有set,priorityqueue这些数据结构,可以使用emirpasic/gods
参考:https://github.com/emirpasic/gods
可以使用samber/lo来对切片、数组或集合进行处理
1 | go get github.com/samber/lo@v1 |
比如filter操作
1 | even := lo.Filter([]int{1, 2, 3, 4}, func(x int, index int) bool { |
map操作
1 | import "github.com/samber/lo" |
去重操作
1 | uniqValues := lo.Uniq([]int{1, 2, 2, 1}) |
获得map的key,并转换成数组
不使用lo
1 | m := map[string]int{ |
使用lo
1 | m := map[string]int{ |
range操作
1 | result := lo.Range(4) |
可以使用time或者carbon
字符串转time.Time
1 | import ( |
time.Time转字符串
1 | import ( |
1 | go get -u github.com/golang-module/carbon/v2 |
文档
1 | https://pkg.go.dev/github.com/golang-module/carbon/v2 |
可以使用stretchr/testify
1 | go get -u github.com/stretchr/testify |
使用assert
1 | import ( |
在go中请求接口可以使用go-resty/resty框架
1 | go get github.com/go-resty/resty/v2 |
get请求
1 | // Create a Resty Client |
post请求
1 | // Create a Resty Client |
使用testing框架进行单元测试
1 | package dao |
如果遇到go testing flag provided but not defined: -test.v的报错,解决方法是添加一个init.go文件
1 | package test |
然后在使用了flag的地方添加的import中
1 | _ "gin-template/internal/test" |
参考:问题记录:flag provided but not defined: -test.v 异常处理过程
go monkey可以用于在单元测试中进行打桩(指补齐未实现的代码)
如果要通过一个对象找到一个类的名称,此时就需要用到反射机制(反射技术是用来做框架的,一般情况下Java私有对象不能被访问,但是暴力反射可以访问私有对象)。
任何一个类如果没有明确地声明继承自哪个父类的时候,则默认继承Object类,所以getClass()方法是Object类中的。
文件在包java_reflect目录下