示例:
socket发送数据,把String转java对象,然后保存到mysql数据库中
Student.class
public class Student {
private int id;
private String name;
private int age;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
main方法:
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> source = env.socketTextStream("192.168.1.176", 9999);
SingleOutputStreamOperator<Student> studentStream = source.map(new MapFunction<String, Student>() {
public Student map(String value) throws Exception {
String[] splits = value.split(",");
Student stu = new Student();
stu.setId(Integer.parseInt(splits[0]));
stu.setName(splits[1]);
stu.setAge(Integer.parseInt(splits[2]));
return stu;
}
});
studentStream.addSink(new SinkToMySQL());
env.execute("JavaCustomSinkToMySQL");
}
SinkToMysql:
package com.imooc.flink.java.course05;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
/**
* Author: Michael PK
* 自定义MySQL Sink
*/
public class SinkToMySQL extends RichSinkFunction<Student>{
Connection connection;
PreparedStatement pstmt;
private Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
conn = DriverManager.getConnection(url,"root","root");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 在open方法中建立connection
* @param parameters
* @throws Exception
*/
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
connection = getConnection();
String sql = "insert into student(id,name,age) values (?,?,?)";
pstmt = connection.prepareStatement(sql);
System.out.println("open");
}
// 每条记录插入时调用一次
public void invoke(Student value, Context context) throws Exception {
System.out.println("invoke~~~~~~~~~");
// 为前面的占位符赋值
pstmt.setInt(1, value.getId());
pstmt.setString(2, value.getName());
pstmt.setInt(3, value.getAge());
pstmt.executeUpdate();
}
/**
* 在close方法中要释放资源
* @throws Exception
*/
@Override
public void close() throws Exception {
super.close();
if(pstmt != null) {
pstmt.close();
}
if(connection != null) {
connection.close();
}
}
}
小结:
1:RichSinkFunction<T> T就是你想要写入对象的类型
2:重写方法
open/close:生命周期方法
invoke:每条记录执行一次