tonglin0325的个人主页

SpringBoot学习笔记——swagger-ui

swagger-ui用于给API添加文档,还支持API的请求调用,可以降低前后端联调的沟通成本

1.依赖

1
2
3
4
5
6
7
8
9
10
11
12
<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>

2.配置swagger,注意修改basePackage成实际的包名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.async.DeferredResult;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.genericModelSubstitutes(DeferredResult.class)
.useDefaultResponseMessages(false)
.forCodeGeneration(true)
.apiInfo(apiInfo())
.pathMapping("/") // base,最终调用接口后会和paths拼接在一起
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo")) // 过滤的接口
.paths(PathSelectors.any())
.build();
}

private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("api文档") // 标题
.description("xxxx") // 描述
.termsOfServiceUrl("https://xxx.xxx.xxx")
.version("1.0")
.build();
}

}

3.给controller添加 ApiOperation 注解

1
2
3
4
5
6
@ApiOperation(value = "hello接口", notes = "取得id,打印hello")
@RequestMapping(path = "/hello/{id}", method = RequestMethod.GET)
public ControllerResponseT hello(@ApiParam(name = "id", value = "id", required = true) @PathVariable("id") Integer id) {
return ControllerResponseT.ofSuccess("hello: " + id);
}

4.测试

全文 >>

Java——组件:标签组件,文本组件,菜单组件,表格组件,按钮组件

 

 

使用一个标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class JFrame_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根

JFrame f = new JFrame("Swing窗口"); //实例化窗体对象
JLabel lab = new JLabel("Label",JLabel.CENTER); //实例化对象,使用剧中对齐
f.add(lab); //向容器中加入组建
Dimension dim = new Dimension(); //实例化Dimension对象

dim.setSize(230,80); //设置大小
f.setSize(dim); //设置组件大小
f.setBackground(Color.WHITE);
Point point = new Point(300,200); //设置现实的坐标点
f.setLocation(point);
f.setVisible(true);
}

}

 

 

更改JLabel的文本样式

 

设置标签的显示字体、大小、背景颜色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class JFrame_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根

JFrame f = new JFrame("Swing窗口"); //实例化窗体对象
JLabel lab = new JLabel("Label",JLabel.CENTER); //实例化对象,使用剧中对齐
Font fnt = new Font("Serief",Font.ITALIC+Font.BOLD,28);
lab.setFont(fnt); //设置标签的显示字体
lab.setForeground(Color.RED); //设置标签的文字颜色
f.add(lab); //向容器中加入组建
Dimension dim = new Dimension(); //实例化Dimension对象

dim.setSize(230,80); //设置大小
f.setSize(dim); //设置组件大小
f.setBackground(Color.WHITE);
Point point = new Point(300,200); //设置现实的坐标点
f.setLocation(point);
f.setVisible(true);
}

}

 

 

全文 >>

Java数据库——PreparedStatement接口

PreparedStatement接口是Statement的子接口,属于预处理操作,与直接使用Statement不同的是,PreparedStatement在操作时,是先在数据表中准备好了一条SQL语句,但是此SQL语句的具体内容暂时不设置,而是之后再进行设置。

 

使用PreparedStatement完成数据的增加和查询操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.sql.*;
import java.text.SimpleDateFormat;

public class PreparedStatement_demo {

//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根
Connection conn = null; //数据库连接
PreparedStatement pstmt = null; //数据库操作

String name = "王五";
String password = "pwd2";
int age = 25;
String sex = "女";
String birthday = "2002-11-21";
java.util.Date temp = null; //声明一个Date对象
//通过SimpleDateFormat类将一个字符串变成java.util.Date类型
temp = new SimpleDateFormat("yyyy-MM-dd").parse(birthday);
//通过java.util.Date取出具体的日期数,并将其变成java.sql.Date类型
java.sql.Date bir = new java.sql.Date(temp.getTime());
String sql = "INSERT INTO user(name,password,age,sex,birthday)"+"VALUES(?,?,?,?,?)";//编写预处理SQL
Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
pstmt = conn.prepareStatement(sql); //实例化PreparedStatement
pstmt.setString(1, name); //设置第一个&ldquo;?&rdquo;的内容
pstmt.setString(2, password); //设置第二个&ldquo;?&rdquo;的内容
pstmt.setInt(3, age); //设置第三个&ldquo;?&rdquo;的内容
pstmt.setString(4, sex); //设置第四个&ldquo;?&rdquo;的内容
pstmt.setDate(5, bir); //设置第五个&ldquo;?&rdquo;的内容
pstmt.executeUpdate(); //执行数据库更新操作,不需要SQL

pstmt.close(); //操作关闭
conn.close(); //数据库关闭

}

}

 

模糊查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.sql.*;
import java.text.SimpleDateFormat;

public class PreparedStatement_demo {

//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根

Connection conn = null; //数据库连接
PreparedStatement pstmt = null; //数据库操作
String keyWord = "王"; //设置查询关键字
String keyWord1 = "男"; //设置查询关键字
ResultSet rs = null; //保存查询结果
String sql = "SELECT id,name,password,age,sex,birthday"+
" FROM user WHERE name LIKE ? OR password LIKE ? OR sex LIKE ?";
Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
pstmt = conn.prepareStatement(sql); //实例化PreparedStatement
pstmt.setString(1, "%"+keyWord+"%"); //设置第一个&ldquo;?&rdquo;的内容
pstmt.setString(2, "%"+keyWord+"%"); //设置第一个&ldquo;?&rdquo;的内容
pstmt.setString(3, "%"+keyWord1+"%"); //设置第一个&ldquo;?&rdquo;的内容
rs = pstmt.executeQuery(); //实例化ResultSet对象
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String pass = rs.getString(3);
int age = rs.getInt(4);
String sex = rs.getString(5);
java.util.Date d = rs.getDate(6);
System.out.println("编号:"+id);
System.out.println("名字:"+name);
System.out.println("密码:"+pass);
System.out.println("年龄:"+age);
System.out.println("性别:"+sex);
System.out.println("生日:"+d);
}
rs.close(); //关闭结果集
pstmt.close(); //操作关闭
conn.close(); //数据库关闭

}

}

 

 

Java数据库——ResultSet接口

使用SQL中的SELECT语句可以查询出数据库的全部结果,在JDBC的操作中数据库的所有查询记录将使用ResultSet进行接收,并使用ResultSet显示内容。

 

从user表中查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.sql.*;

public class MySQL_demo {
//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根

Connection conn = null; //数据库连接
Statement stmt = null; //数据库操作

ResultSet rs = null; //保存查询结果
String sql = "SELECT id,name,password,age,sex,birthday FROM user";
Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
stmt = conn.createStatement(); //实例化Statement对象
rs = stmt.executeQuery(sql); //实例化ResultSet对象
while(rs.next()){
// int id = rs.getInt("id");
// String name = rs.getString("name");
// String pass = rs.getString("password");
// int age = rs.getInt("age");
// String sex = rs.getString("sex");
// Date d = rs.getDate("birthday");
int id = rs.getInt(1);
String name = rs.getString(2);
String pass = rs.getString(3);
int age = rs.getInt(4);
String sex = rs.getString(5);
Date d = rs.getDate(6);
System.out.println("编号:"+id);
System.out.println("名字:"+name);
System.out.println("密码:"+pass);
System.out.println("年龄:"+age);
System.out.println("性别:"+sex);
System.out.println("生日:"+d);
}

rs.close(); //关闭结果集
stmt.close(); //操作关闭
conn.close(); //数据库关闭
}
}

 

Java数据库——连接关闭、增删改查

连接数据库

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.sql.*;

public class MySQL_demo {
//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) {
// TODO 自动生成的方法存根
Connection conn = null; //数据库连接
try{
Class.forName(DBDRIVER); //加载MYSQL JDBC驱动程序
}catch(ClassNotFoundException e){
e.printStackTrace();
}
try{
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
}catch(SQLException e){
e.printStackTrace();
}
System.out.println(conn);
try{
conn.close(); //数据库关闭
}catch(SQLException e){
e.printStackTrace();
}
}
}

 

建立一个user表

1
2
CREATE TABLE user(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(30) NOT NULL,password VARCHAR(32) NOT NULL,age INT NOT NULL,sex VARCHAR(2),birthday DATE);

 

<1>数据库的更新操作

 

执行数据库插入操作,执行一次插入一条

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.sql.*;

public class MySQL_demo {
//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根

Connection conn = null; //数据库连接
Statement stmt = null; //数据库操作
String sql = "INSERT INTO user(name,password,age,sex,birthday)"
+"VALUES('张三','mima',30,'男','2014-01-11')";
Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
stmt = conn.createStatement(); //实例化Statement对象
stmt.executeUpdate(sql); //执行数据库更新操作
stmt.close(); //操作关闭
conn.close(); //数据库关闭
}
}

全文 >>

Avro学习笔记——avro-tools工具

1.下载avro-tools.jar

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
java -jar ./avro-tools-1.10.1.jar help
Version 1.10.1 of Apache Avro
Copyright 2010-2015 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (https://www.apache.org/).
----------------
Available tools:
canonical Converts an Avro Schema to its canonical form
cat Extracts samples from files
compile Generates Java code for the given schema.
concat Concatenates avro files without re-compressing.
count Counts the records in avro files or folders
fingerprint Returns the fingerprint for the schemas.
fragtojson Renders a binary-encoded Avro datum as JSON.
fromjson Reads JSON records and writes an Avro data file.
fromtext Imports a text file into an avro data file.
getmeta Prints out the metadata of an Avro data file.
getschema Prints out schema of an Avro data file.
idl Generates a JSON schema from an Avro IDL file
idl2schemata Extract JSON schemata of the types from an Avro IDL file
induce Induce schema/protocol from Java class/interface via reflection.
jsontofrag Renders a JSON-encoded Avro datum as binary.
random Creates a file with randomly generated instances of a schema.
recodec Alters the codec of a data file.
repair Recovers data from a corrupt Avro Data file
rpcprotocol Output the protocol of a RPC service
rpcreceive Opens an RPC Server and listens for one message.
rpcsend Sends a single RPC message.
tether Run a tethered mapreduce job.
tojson Dumps an Avro data file as JSON, record per line or pretty.
totext Converts an Avro data file to a text file.
totrevni Converts an Avro data file to a Trevni file.
trevni_meta Dumps a Trevni file's metadata as JSON.
trevni_random Create a Trevni file filled with random instances of a schema.
trevni_tojson Dumps a Trevni file as JSON.

2.查看avro文件的schema

1
2
java -jar ./avro-tools-1.10.1.jar getschema ./xxxx.avro

3.查看avro文件内容的json格式

1
2
java -jar ./avro-tools-1.10.1.jar tojson ./nova_ads_access_log-0-0008589084.avro | less

4.使用avro-tools编译java代码

编译avro IDL文件,参考

1
2
https://avro.apache.org/docs/current/gettingstartedjava.html
https://yanbin.blog/convert-apache-avro-to-parquet-format-in-java/

定义schema文件kst.avsc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"namespace": "com.linkedin.haivvreo",
"name": "test_serializer",
"type": "record",
"fields": [
{ "name":"string1", "type":"string" },
{ "name":"int1", "type":"int" },
{ "name":"tinyint1", "type":"int" },
{ "name":"smallint1", "type":"int" },
{ "name":"bigint1", "type":"long" },
{ "name":"boolean1", "type":"boolean" },
{ "name":"float1", "type":"float" },
{ "name":"double1", "type":"double" },
{ "name":"list1", "type":{"type":"array", "items":"string"} },
{ "name":"map1", "type":{"type":"map", "values":"int"} },
{ "name":"struct1", "type":{"type":"record", "name":"struct1_name", "fields": [
{ "name":"sInt", "type":"int" }, { "name":"sBoolean", "type":"boolean" }, { "name":"sString", "type":"string" } ] } },
{ "name":"union1", "type":["float", "boolean", "string"] },
{ "name":"enum1", "type":{"type":"enum", "name":"enum1_values", "symbols":["BLUE","RED", "GREEN"]} },
{ "name":"nullableint", "type":["int", "null"] },
{ "name":"bytes1", "type":"bytes" },
{ "name":"fixed1", "type":{"type":"fixed", "name":"threebytes", "size":3} }
] }

全文 >>

Impala学习笔记——impala shell

进入impala shell,port为Impala Daemon Beeswax 端口

1
2
impala-shell -i ip:port -k

使用impala shell直接运行SQL

1
2
impala-shell -i ip:port -k --quiet -B -d default -q "select count(*) from table1 where ds='2021-01-20'"

退出

1
2
exit;

 

Ubuntu下的MySQL安装

1.安装mysql-server

1
2
3
sudo apt-get update
sudo apt-get install mysql-server mysql-client

2.重新启动mysql服务

1
2
sudo service mysql restart

3.让apache支持mysql

1
2
sudo apt-get install libapache2-mod-auth-mysql

16.04使用下面命令

1
2
sudo apt-get install libmysqlclient-dev

4.登录mysql

1
2
mysql -u root -p

如果修改了配置文件my.cnf配置文件,需要重启数据库(修改方法在下面),重启数据库之前需要先重新载入apparmor配置文件,使用下面命令重新载入:

1
2
sudo /etc/init.d/apparmor restart

重新启动数据库

1
2
sudo /etc/init.d/mysql start

5.查看数据库的编码

1.查看MySQL数据库服务器和数据库MySQL字符集。

1
2
SHOW VARIABLES LIKE 'character_set_%';

 

全文 >>

元注解(Annotation)

J2SE 5.0提供了很多新的特征。其中一个很重要的特征就是对元数据(Metadata)的支持。在J2SE 5.0中,这种元数据称为注解(Annotation)。

通过使用注解,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充的信息。

 

系统内建的Annotation

在JDK1.5之后,系统已经建立了如下3个内建的Annotation类型,用户直接使用即可。

 

@Override

 

 

全文 >>