Sink到mysql

 依赖

        <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.39</version>
        </dependency>

示例

public class SinkMysql {

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStreamSource<ProductInfo> streamSource = env.fromElements(new ProductInfo("水果", 4),
                new ProductInfo("文具", 5),
                new ProductInfo("书籍", 6));

        String sql = "insert into product_category(category_name,category_type) values(?,?)";
        JdbcConnectionOptions jdbcBuild = new JdbcConnectionOptions.JdbcConnectionOptionsBuilder()
                .withDriverName("com.mysql.jdbc.Driver")
                .withUrl("jdbc:mysql://localhost:3306/wechat_order?useUnicode=true&characterEncoding=utf-8&useSSL=false")
                .withUsername("admin").withPassword("admin").build();

        streamSource.addSink(JdbcSink.sink(sql, (ps, productInfo) -> {
            ps.setString(1, productInfo.getCategoryName());
            ps.setInt(2, productInfo.getCategoryType());
        }, jdbcBuild));

        env.execute("jdbc-connector");
    }
}

 读取MySQL数据源

SourceFunction 定义两个接口方法:

  1、run : 启动一个 source,即对接一个外部数据源然后 emit 元素形成 stream。
  2、cancel : 取消一个 source,即将 run 中的循环 emit 元素的行为终止。

public class SourceFromMysql extends RichSourceFunction<ProductInfo> {

    private PreparedStatement ps;
    private Connection connection;

    @Override
    public void open(Configuration parameters) throws Exception {
        super.open(parameters);
        connection = getConnection();
        String sql = "select * from product_category";
        ps = connection.prepareStatement(sql);
    }

    @Override
    public void run(SourceContext<ProductInfo> ctx) throws Exception {
        ResultSet resultSet = ps.executeQuery();
        while (resultSet.next()) {
            ProductInfo productInfo = new ProductInfo(resultSet.getString("category_name"),
                    resultSet.getInt("category_type"));
            ctx.collect(productInfo);
        }
    }

    @Override
    public void cancel() {

    }

    @Override
    public void close() throws Exception {
        super.close();
        if (connection != null) {
            connection.close();
        }
        if (ps != null) {
            ps.close();
        }
    }

    private static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/wechat_order?useUnicode=true&characterEncoding=utf-8&useSSL=false", "admin", "admin");

        } catch (Exception e) {
            //异常
        }
        return conn;
    }

}

 

posted on 2022-05-25 10:34  溪水静幽  阅读(111)  评论(0)    收藏  举报