Skip to content
3 changes: 2 additions & 1 deletion docs/en/integrations/language-clients/java/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ import CodeBlock from '@theme/CodeBlock';

- [Client-V2](./client-v2.md)
- [Client-V1 (Old)](./client-v1.md)
- [JDBC Driver](./jdbc-driver.md)
- [JDBC-V2](./jdbc-v2.md)
- [JDBC-V1 (Old)](./jdbc-v1.md)
- [R2DBC Driver](./r2dbc.md)

## ClickHouse Client
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
---
sidebar_label: JDBC Driver
sidebar_position: 4
sidebar_label: JDBC V1 (Old)
sidebar_position: 5
keywords: [clickhouse, java, jdbc, driver, integrate]
description: ClickHouse JDBC driver
slug: /en/integrations/java/jdbc-driver
description: ClickHouse JDBC driver V1 (outdated)
slug: /en/integrations/java/jdbc-v1
---

import Tabs from '@theme/Tabs';
Expand All @@ -16,7 +16,7 @@ import CodeBlock from '@theme/CodeBlock';
`clickhouse-jdbc` implements the standard JDBC interface. Being built on top of [clickhouse-client](/docs/en/integrations/sql-clients/sql-console), it provides additional features like custom type mapping, transaction support, and standard synchronous `UPDATE` and `DELETE` statements, etc., so that it can be easily used with legacy applications and tools.

:::note
Latest JDBC (0.7.2) version uses Client-V1
Latest JDBC (0.7.2) version uses Client-V1
:::

`clickhouse-jdbc` API is synchronous, and generally, it has more overheads(e.g., SQL parsing and type mapping/conversion, etc.). Consider [clickhouse-client](/docs/en/integrations/sql-clients/sql-console) when performance is critical or if you prefer a more direct way to access ClickHouse.
Expand Down Expand Up @@ -121,14 +121,14 @@ Note: please refer to [JDBC specific configuration](https://github.com/ClickHous

## Supported data types

JDBC Driver supports same data formats as client library does.
JDBC Driver supports same data formats as client library does.

:::note
- AggregatedFunction - :warning: does not support `SELECT * FROM table ...`
- Decimal - `SET output_format_decimal_trailing_zeros=1` in 21.9+ for consistency
- Enum - can be treated as both string and integer
- UInt64 - mapped to `long` (in client-v1)
:::
- UInt64 - mapped to `long` (in client-v1)
:::

## Creating Connection

Expand Down Expand Up @@ -160,7 +160,7 @@ try (Connection conn = dataSource.getConnection(...);

:::note
- Use `PreparedStatement` instead of `Statement`
:::
:::

It's easier to use but slower performance compare to input function (see below):

Expand Down Expand Up @@ -194,7 +194,7 @@ try (PreparedStatement ps = conn.prepareStatement(

### Insert with placeholders

This option is recommended only for small inserts because it would require a long SQL expression (that will be parsed on client side and it will consume CPU & Memory):
This option is recommended only for small inserts because it would require a long SQL expression (that will be parsed on client side and it will consume CPU & Memory):

```java showLineNumbers
try (PreparedStatement ps = conn.prepareStatement("insert into mytable values(trim(?),?,?)")) {
Expand Down
168 changes: 168 additions & 0 deletions docs/en/integrations/language-clients/java/jdbc-v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
---
sidebar_label: JDBC V2
sidebar_position: 4
keywords: [clickhouse, java, jdbc, driver, integrate]
description: ClickHouse JDBC driver V2
Copy link
Member

@mshustov mshustov Jan 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But I agree with this sentiment, it also might be worth us exploring at this point how do we do "versioning" of the documentation rather than having "extra pages" - like having a version drop down and corresponding version in the URL.

@laeg What about using the client versioning? There will be 2 pages:

  1. description: ClickHouse JDBC driver > v0.8.x (or ClickHouse JDBC driver latest)
  2. description: ClickHouse JDBC driver v0.7.x

We can manually add more pages if necessary and they always transparently mapped to JDBC release version

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah i would prefer if we aligned it more to release versions rather than internal code versions.

did we look into whether we could do something more elegant for versioning the docs?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

did we look into whether we could do something more elegant for versioning the docs?

I didn't manage to find a solution in 30min.

slug: /en/integrations/java/jdbc-v2
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import CodeBlock from '@theme/CodeBlock';


# JDBC Driver

`clickhouse-jdbc` implements the standard JDBC interface. Being built on top of [clickhouse-client](/docs/en/integrations/sql-clients/sql-console), it provides additional features like custom type mapping, transaction support, and standard synchronous `UPDATE` and `DELETE` statements, etc., so that it can be easily used with legacy applications and tools.

:::note
Latest JDBC (0.8.0) version uses Client-V2 by default.
:::

`clickhouse-jdbc` API is synchronous, and generally, it has more overheads (e.g., SQL parsing and type mapping/conversion, etc.). Consider [client-v2](/docs/en/integrations/language-clients/java/client-v2.md) when performance is critical or if you prefer a more direct way to access ClickHouse.

## Environment requirements

- [OpenJDK](https://openjdk.java.net) version >= 8


### Setup

<Tabs groupId="jdbc-base-dependencies">
<TabItem value="maven" label="Maven" >

```xml
<!-- https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc -->
<dependency>
<groupId>com.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.8.0</version>
<!-- use uber jar with all dependencies included, change classifier to http for smaller jar -->
<classifier>shaded-all</classifier>
</dependency>
```

</TabItem>
<TabItem value="gradle-kt" label="Gradle (Kotlin)">

```kotlin
// https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc
// use uber jar with all dependencies included, change classifier to http for smaller jar
implementation("com.clickhouse:clickhouse-jdbc:0.8.0:shaded-all")
```
</TabItem>
<TabItem value="gradle" label="Gradle">

```groovy
// https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc
// use uber jar with all dependencies included, change classifier to http for smaller jar
implementation 'com.clickhouse:clickhouse-jdbc:0.8.0:shaded-all'
```

</TabItem>
</Tabs>

Since version `0.5.0`, we are using Apache HTTP Client that's packed the Client. Since there is not a shared version of the package, you need to add a logger as a dependency.

<Tabs groupId="jdbc-logging-dependency">
<TabItem value="maven" label="Maven" >

```xml
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.16</version>
</dependency>
```

</TabItem>
<TabItem value="gradle-kt" label="Gradle (Kotlin)">

```kotlin
// https://mvnrepository.com/artifact/org.slf4j/slf4j-api
implementation("org.slf4j:slf4j-api:2.0.16")
```
</TabItem>
<TabItem value="gradle" label="Gradle">

```groovy
// https://mvnrepository.com/artifact/org.slf4j/slf4j-api
implementation 'org.slf4j:slf4j-api:2.0.16'
```

</TabItem>
</Tabs>

## Configuration

**Driver Class**: `com.clickhouse.jdbc.ClickHouseDriver`

**URL Syntax**: `jdbc:(ch|clickhouse)[:<protocol>]://endpoint1[,endpoint2,...][/<database>][?param1=value1&param2=value2][#tag1,tag2,...]`, for example:

- `jdbc:clickhouse:http://localhost:8123`
- `jdbc:clickhouse:https://localhost:8443?ssl=true&sslmode=STRICT`

**Connection Properties**:

Beyond standard JDBC properties, the driver supports the ClickHouse-specific properties offered by the underlying [client](/docs/en/integrations/language-clients/java/client-v2.md).
Where possible methods will return an SQLFeatureNotSupportedException if the feature is not supported. Other custom properties include:

| Property | Default | Description |
|----------------------------------|---------|---------------------------------------------|
| `disable_frameworks_detection` | `true` | Disable frameworks detection for User-Agent |
| `jdbc_ignore_unsupported_values` | `false` | Suppresses SQLFeatureNotSupportedException |
| `clickhouse.jdbc.v1` | `false` | Use JDBC-V1 instead of JDBC-V2 |

## Supported data types

JDBC Driver supports same data formats as the client library does.

:::note
- AggregatedFunction - :warning: does not support `SELECT * FROM table ...`
- Decimal - `SET output_format_decimal_trailing_zeros=1` in 21.9+ for consistency
- Enum - can be treated as both string and integer
- UInt64 - mapped to `long` (in client-v1)
:::

## Creating Connection

```java
String url = "jdbc:ch://my-server:8123/system"; // use http protocol

Properties properties = new Properties();

DataSource dataSource = new DataSource(url, properties);
try (Connection conn = dataSource.getConnection("default", "password");
Statement stmt = conn.createStatement()) {
}
```

## Simple Statement

```java showLineNumbers

try (Connection conn = dataSource.getConnection(...);
Statement stmt = conn.createStatement()) {
ResultSet rs = stmt.executeQuery("select * from numbers(50000)");
while(rs.next()) {
// ...
}
}
```

## Insert

```java showLineNumbers
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO mytable VALUES (?, ?)")) {
ps.setString(1, "test"); // id
ps.setObject(2, LocalDateTime.now()); // timestamp
ps.addBatch();
...
ps.executeBatch(); // stream everything on-hand into ClickHouse
}
```

## More Information
For more information, see our [GitHub repository](https://github.com/ClickHouse/clickhouse-java) and [Client-V2 documentation](/docs/en/integrations/language-clients/java/client-v2.md).
```
3 changes: 2 additions & 1 deletion sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -568,7 +568,8 @@ const sidebars = {
// "en/integrations/language-clients/java/index",
"en/integrations/language-clients/java/client-v2",
"en/integrations/language-clients/java/client-v1",
"en/integrations/language-clients/java/jdbc-driver",
"en/integrations/language-clients/java/jdbc-v2",
"en/integrations/language-clients/java/jdbc-v1",
"en/integrations/language-clients/java/r2dbc"
]
},
Expand Down