练习 : 自定义sink mysql hbase
mysql
1 package sink; 2 3 //import com.util.Propss; 4 //import com.bean.Sku; 5 import org.apache.flink.configuration.Configuration; 6 import org.apache.flink.streaming.api.functions.sink.RichSinkFunction; 7 import org.apache.kafka.clients.producer.KafkaProducer; 8 import org.apache.kafka.clients.producer.ProducerRecord; 9 10 import java.lang.reflect.Field; 11 import java.sql.*; 12 13 /** 14 * @Description: 15 * @Author: liuyuan 16 * @Times : 2021/9/24 20:09 17 */ 18 19 //自定义SINK RichSinkFuncation 20 public class MySQLSink extends RichSinkFunction<String> { 21 private static Connection conn; 22 private static PreparedStatement pre; 23 24 private static String database; 25 private static String sql; 26 private static Class T; 27 28 public MySQLSink(String database,String sql,Class T){ 29 this.database=database; 30 this.sql=sql; 31 this.T=T; 32 } 33 34 @Override 35 public void open(Configuration parameters) throws Exception { 36 Class.forName("com.mysql.jdbc.Driver"); 37 conn = DriverManager.getConnection("jdbc:mysql://hadoop106:3306/"+database, "root", "root"); 38 conn.setAutoCommit(true); 39 } 40 41 @Override 42 public void invoke(String value, Context context) throws Exception { 43 String[] split = value.split(","); 44 Field[] declaredFields = T.getDeclaredFields(); 45 pre = conn.prepareStatement(sql); 46 for (int i = 0; i < declaredFields.length; i++) { 47 if(declaredFields[i].getType().toString().equals("class java.lang.String")){ 48 pre.setString((i+1),split[i]); 49 } 50 if(declaredFields[i].getType().toString().equals("class java.lang.Integer")){ 51 pre.setInt((i+1),Integer.valueOf(split[i])); 52 } 53 if(declaredFields[i].getType().toString().equals("class java.lang.Double")){ 54 pre.setDouble((i+1),Double.valueOf(split[i])); 55 } 56 if(declaredFields[i].getType().toString().equals("class java.lang.Long")){ 57 pre.setLong((i+1),Long.valueOf(split[i])); 58 } 59 } 60 pre.execute(); 61 } 62 63 @Override 64 public void close() throws Exception { 65 pre.close(); 66 conn.close(); 67 68 } 69 }
方法二
stream. addsink (dbcSink.sink( "INSERT INTO clicks (user, ur1)VALUES (? , ?)",
((statement,event) ->{ statement.setString( parameterlndex: 1,event.user);
statement.setstring( parameterlndex: 2,event.ur1);
}), new JdbcConnectionoptions.JdbcConnectionoptionsBuilder()
.withUrl( "jdbc :mysql://localhost: 3306/test") .withDriverName( "com.mysq1.jdbc.Driver")
.withUsername("root") .withPassword( "root")
.build() ));
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-jdbc_${scala.binary.version}</artifactId> <version>${flink.version)</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId><version>5.1.47</version> </dependency>