Java通过properties文件方法实现JDBC代码案例

Java和大数据系列

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天和大家分享一下Java通过properties文件方法实现JDBC代码案例
#博学谷IT学习技术支持#


前言

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。
JDBC规范(掌握四个核心对象):

  1. DriverManager:用于注册驱动
  2. Connection: 表示与数据库创建的连接
  3. Statement: 操作数据库sql语句的对象
  4. ResultSet: 结果集或一张虚拟表

JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
在这里插入图片描述


一、使用步骤

1.Maven导包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.iteheima</groupId>
    <artifactId>jdbc</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
    </dependencies>

</project>

2.案例实现

这里aaa是数据库名字,employee是表名,大家根据自己的情况修改一下

package pack01;
import java.sql.*;

public class demo02 {
    public static void main(String[] args) throws Exception {
        //注册驱动.这里是mysql 8.0的版本
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获得连接.
        Connection connection =
                DriverManager.getConnection("jdbc:mysql://localhost:3306/aaa", "root", "12345678");

        //获得执行sql语句的对象
        Statement statement = connection.createStatement();

        //执行sql语句,并返回结果
        ResultSet resultSet = statement.executeQuery("select * from employee");

        //处理结果
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();

        while (resultSet.next()){
            for (int i = 1; i <= columnCount; i++) {
                Object object = resultSet.getObject(i);
                System.out.print(object + "\t");
            }
            System.out.println();
        }

        //释放资源
        statement.close();
        connection.close();
    }
}

二、代码优化

上面写的代码案例太过简单,是初级入门水平,下面对代码进行封装优化一下,高内聚,低耦合。

1.定义jdbc.properties文件

把需要传递的参数和sql代码都写在配置文件中,这样后期就不用在代码中进行修改了。

DriverClass=com.mysql.cj.jdbc.Driver
Url=jdbc:mysql://localhost:3306/aaa
Username=root
Password=12345678
Sql=select * from employee

2.定义JDBCUtils类

封装一个JDBCUtils类,把配置文件中的代码通过Properties传参过来,这样代码更整洁了。

package pack02;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils {

    private static Properties map;
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;
    private static String sql;

    private JDBCUtils(){}
    //封装注册驱动.这里是mysql 8.0的版本
    static {
        try {
            InputStream inputStream =
                    JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");

            map = new Properties();
            map.load(inputStream);
            driverClass = map.getProperty("DriverClass");
            url = map.getProperty("Url");
            username = map.getProperty("Username");
            password = map.getProperty("Password");
            sql = map.getProperty("Sql");

            Class.forName(driverClass);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    //封装获得连接
    public static Connection getConnection(){
        try {

            return DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    //封装获得执行sql语句的对象
    public static ResultSet getResult(Statement statement,Connection connection){
        try {
            return statement.executeQuery(sql);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    //封装处理结果
    public static void printResult(ResultSet resultSet){
        try {
            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();

            while (resultSet.next()){
                for (int i = 1; i <= columnCount; i++) {
                    Object object = resultSet.getObject(i);
                    System.out.print(object + "\t");
                }
                System.out.println();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    //封装释放资源
    public static void closeAll(Statement statement,Connection connection){
        try {
            statement.close();
            connection.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

}

3.最后定义测试类

有了封装类之后,直接通过调静态方法的方式使用就可以了

package pack02;
import java.sql.*;

public class demo01 {
    public static void main(String[] args) throws Exception {
        //注册驱动.这里是mysql 8.0的版本
        //获得连接.
        Connection connection = JDBCUtils.getConnection();

        //获得执行sql语句的对象
        Statement statement = connection.createStatement();
        //执行sql语句,并返回结果
        ResultSet resultSet =
                JDBCUtils.getResult(statement,connection);

        //处理结果
        JDBCUtils.printResult(resultSet);

        //释放资源
        JDBCUtils.closeAll(statement,connection);
    }
}

总结

今天通过一个小案例和大家分享了一下JDBC的使用方法,并且通过properties文件方法优化了代码,避免了hard coding问题。实现了高内聚,低耦合。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的Java代码示例,用于将MySQL中的数据同步到Hudi: ```java import org.apache.hudi.DataSourceWriteOptions; import org.apache.hudi.HoodieSparkUtils; import org.apache.hudi.OverwriteWithLatestAvroPayload; import org.apache.hudi.QuickstartUtils; import org.apache.hudi.api.HoodieWriteClient; import org.apache.hudi.common.model.HoodieTableType; import org.apache.hudi.config.HoodieWriteConfig; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; import java.util.Collections; import java.util.Properties; public class MySQLToHudiSync { public static void main(String[] args) { String tableName = "hudi_table"; String basePath = "file:///tmp/hudi_table"; String jdbcUrl = "jdbc:mysql://<mysql_host>:<mysql_port>/<mysql_db>"; String username = "<mysql_username>"; String password = "<mysql_password>"; String partitionKey = "id"; String hudiTableType = HoodieTableType.COPY_ON_WRITE.name(); SparkSession spark = SparkSession.builder().appName("MySQLToHudiSync").config("spark.serializer", "org.apache.spark.serializer.KryoSerializer").getOrCreate(); JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext()); Properties connectionProperties = new Properties(); connectionProperties.put("user", username); connectionProperties.put("password", password); Dataset<Row> jdbcDF = spark.read().jdbc(jdbcUrl, tableName, connectionProperties); JavaRDD<Row> rowsRDD = jdbcDF.javaRDD(); HoodieWriteConfig hoodieWriteConfig = HoodieWriteConfig.newBuilder().withPath(basePath) .withSchema(QuickstartUtils.getSchema()).withParallelism(2, 2) .withBulkInsertParallelism(3).withFinalizeWriteParallelism(2) .withStorageConfig(HoodieSparkUtils.getDefaultHoodieConf(jsc.hadoopConfiguration())) .withAutoCommit(false).withTableType(hudiTableType) .forTable(tableName).withIndexConfig(HoodieIndexConfig.newBuilder().withIndexType(HoodieIndex.IndexType.BLOOM).build()) .withProps(Collections.singletonMap(DataSourceWriteOptions.RECORDKEY_FIELD_OPT_KEY().key(), partitionKey)).build(); HoodieWriteClient hoodieWriteClient = new HoodieWriteClient<>(jsc, hoodieWriteConfig); hoodieWriteClient.upsert(rowsRDD.map(row -> { String key = row.getAs(partitionKey).toString(); return new UpsertPOJO(key, row); }), hoodieWriteConfig.getBasePath(), hoodieWriteConfig.getTableType(), OverwriteWithLatestAvroPayload.class.getName()); hoodieWriteClient.commit(); } public static class UpsertPOJO implements Serializable { private String key; private Row row; public UpsertPOJO(String key, Row row) { this.key = key; this.row = row; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public Row getRow() { return row; } public void setRow(Row row) { this.row = row; } } } ``` 代码中的`tableName`是要同步的MySQL表的名称,`basePath`是Hudi表的根路径。`jdbcUrl`,`username`和`password`是连接MySQL所需的凭据。`partitionKey`是Hudi表中用作分区键的字段名称。`hudiTableType`是Hudi表的类型,可以是`COPY_ON_WRITE`或`MERGE_ON_READ`。 代码中使用`HoodieWriteConfig`对象配置Hudi写入选项,例如`withPath`,`withSchema`,`withParallelism`,`withBulkInsertParallelism`等。`forTable`方法指定Hudi表的名称。`withIndexConfig`方法配置Hudi索引选项,例如索引类型和配置。`withProps`方法设置自定义属性。`withAutoCommit`方法用于控制提交方式,可以是自动提交或手动提交。 最后,使用`HoodieWriteClient`对象将MySQL数据插入Hudi表,使用`upsert`方法进行插入。`UpsertPOJO`类是自定义的POJO类,用于将MySQL中的行转换为要插入到Hudi表中的数据。`commit`方法用于提交更改。 请注意,此代码示例仅用于演示目的,并且可能需要进行修改以适应您的特定需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值