blob: 5c73309c52bf082559af2b2489f0b4168042422d [file] [log] [blame]
<!DOCTYPE html>
<html lang="en" data-content_root="" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Arrow JDBC Adapter &#8212; Apache Arrow v17.0.0.dev52</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../_static/theme_overrides.css" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/clipboard.min.js"></script>
<script src="../_static/copybutton.js"></script>
<script src="../_static/design-tabs.js"></script>
<script>DOCUMENTATION_OPTIONS.pagename = 'java/jdbc';</script>
<script>
DOCUMENTATION_OPTIONS.theme_version = '0.15.2';
DOCUMENTATION_OPTIONS.theme_switcher_json_url = '/docs/_static/versions.json';
DOCUMENTATION_OPTIONS.theme_switcher_version_match = 'dev/';
DOCUMENTATION_OPTIONS.show_version_warning_banner = true;
</script>
<link rel="canonical" href="https://arrow.apache.org/docs/java/jdbc.html" />
<link rel="icon" href="../_static/favicon.ico"/>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Java Reference (javadoc)" href="reference/index.html" />
<link rel="prev" title="C Data Interface" href="cdata.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '20']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../index.html">
<img src="../_static/arrow.png" class="logo__image only-light" alt="Apache Arrow v17.0.0.dev52 - Home"/>
<script>document.write(`<img src="../_static/arrow-dark.png" class="logo__image only-dark" alt="Apache Arrow v17.0.0.dev52 - Home"/>`);</script>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../format/index.html">
Specifications
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../developers/index.html">
Development
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
Implementations
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../c_glib/index.html">
C/GLib
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../cpp/index.html">
C++
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/csharp/README.md">
C#
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://pkg.go.dev/github.com/apache/arrow/go/v17">
Go
</a>
</li>
<li class="nav-item current active">
<a class="nav-link dropdown-item nav-internal" href="index.html">
Java
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../js/index.html">
JavaScript
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/julia/">
Julia
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/matlab/README.md">
MATLAB
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/nanoarrow/">
nanoarrow
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../python/index.html">
Python
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../r/index.html">
R
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/ruby/README.md">
Ruby
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://docs.rs/crate/arrow/">
Rust
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../status.html">
Implementation Status
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/cpp/">
C++ cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/java/">
Java cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/py/">
Python cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/r/">
R cookbook
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<div class="version-switcher__container dropdown">
<button id="pst-version-switcher-button-2"
type="button"
class="version-switcher__button btn btn-sm navbar-btn dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-2"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-2"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-2">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div>
`);
</script></div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
<div class="navbar-item"><ul class="navbar-icon-links navbar-nav"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://github.com/apache/arrow" title="GitHub" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">GitHub</span></a>
</li>
<li class="nav-item">
<a href="https://twitter.com/ApacheArrow" title="X" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-x-twitter fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">X</span></a>
</li>
</ul></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<label class="sidebar-toggle secondary-toggle" for="__secondary" tabindex="0">
<span class="fa-solid fa-outdent"></span>
</label>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../format/index.html">
Specifications
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../developers/index.html">
Development
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
Implementations
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../c_glib/index.html">
C/GLib
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../cpp/index.html">
C++
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/csharp/README.md">
C#
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://pkg.go.dev/github.com/apache/arrow/go/v17">
Go
</a>
</li>
<li class="nav-item current active">
<a class="nav-link dropdown-item nav-internal" href="index.html">
Java
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../js/index.html">
JavaScript
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/julia/">
Julia
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/matlab/README.md">
MATLAB
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/nanoarrow/">
nanoarrow
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../python/index.html">
Python
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../r/index.html">
R
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/ruby/README.md">
Ruby
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://docs.rs/crate/arrow/">
Rust
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../status.html">
Implementation Status
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/cpp/">
C++ cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/java/">
Java cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/py/">
Python cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/r/">
R cookbook
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<div class="version-switcher__container dropdown">
<button id="pst-version-switcher-button-3"
type="button"
class="version-switcher__button btn btn-sm navbar-btn dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-3"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-3"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-3">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div>
`);
</script></div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
<div class="navbar-item"><ul class="navbar-icon-links navbar-nav"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://github.com/apache/arrow" title="GitHub" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">GitHub</span></a>
</li>
<li class="nav-item">
<a href="https://twitter.com/ApacheArrow" title="X" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-x-twitter fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">X</span></a>
</li>
</ul></div>
</div>
</div>
<div class="sidebar-primary-items__start sidebar-primary__section">
<div class="sidebar-primary-item">
<nav class="bd-docs-nav bd-links"
aria-label="Section Navigation">
<p class="bd-links__title" role="heading" aria-level="1">Section Navigation</p>
<div class="bd-toc-item navbar-nav"><ul class="current nav bd-sidenav">
<li class="toctree-l1"><a class="reference internal" href="quickstartguide.html">Quick Start Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="overview.html">High-Level Overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="install.html">Installing Java Modules</a></li>
<li class="toctree-l1"><a class="reference internal" href="memory.html">Memory Management</a></li>
<li class="toctree-l1"><a class="reference internal" href="vector.html">ValueVector</a></li>
<li class="toctree-l1"><a class="reference internal" href="vector_schema_root.html">Tabular Data</a></li>
<li class="toctree-l1"><a class="reference internal" href="table.html">Table</a></li>
<li class="toctree-l1"><a class="reference internal" href="ipc.html">Reading/Writing IPC formats</a></li>
<li class="toctree-l1"><a class="reference internal" href="algorithm.html">Java Algorithms</a></li>
<li class="toctree-l1"><a class="reference internal" href="flight.html">Arrow Flight RPC</a></li>
<li class="toctree-l1"><a class="reference internal" href="flight_sql.html">Arrow Flight SQL</a></li>
<li class="toctree-l1"><a class="reference internal" href="flight_sql_jdbc_driver.html">Arrow Flight SQL JDBC Driver</a></li>
<li class="toctree-l1"><a class="reference internal" href="dataset.html">Dataset</a></li>
<li class="toctree-l1"><a class="reference internal" href="substrait.html">Substrait</a></li>
<li class="toctree-l1"><a class="reference internal" href="cdata.html">C Data Interface</a></li>
<li class="toctree-l1 current active"><a class="current reference internal" href="#">Arrow JDBC Adapter</a></li>
<li class="toctree-l1"><a class="reference internal" href="reference/index.html">Reference (javadoc)</a></li>
<li class="toctree-l1"><a class="reference external" href="https://arrow.apache.org/cookbook/java/">Java cookbook</a></li>
</ul>
</div>
</nav></div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="index.html" class="nav-link">Java Implementation</a></li>
<li class="breadcrumb-item active" aria-current="page">Arrow JDBC Adapter</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section id="arrow-jdbc-adapter">
<h1>Arrow JDBC Adapter<a class="headerlink" href="#arrow-jdbc-adapter" title="Permalink to this heading">#</a></h1>
<p>The Arrow JDBC Adapter assists with working with JDBC and Arrow
data. Currently, it supports reading JDBC ResultSets into Arrow
VectorSchemaRoots.</p>
<section id="resultset-to-vectorschemaroot-conversion">
<h2>ResultSet to VectorSchemaRoot Conversion<a class="headerlink" href="#resultset-to-vectorschemaroot-conversion" title="Permalink to this heading">#</a></h2>
<p>This can be accessed via the JdbcToArrow class. The resulting
ArrowVectorIterator will convert a ResultSet to Arrow data in batches
of rows.</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="w"> </span><span class="p">(</span><span class="n">ArrowVectorIterator</span><span class="w"> </span><span class="n">it</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JdbcToArrow</span><span class="p">.</span><span class="na">sqlToArrowVectorIterator</span><span class="p">(</span><span class="n">resultSet</span><span class="p">,</span><span class="w"> </span><span class="n">allocator</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">it</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">VectorSchemaRoot</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">it</span><span class="p">.</span><span class="na">next</span><span class="p">();</span>
<span class="w"> </span><span class="c1">// Consume the root…</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The batch size and type mapping can both be customized:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="n">JdbcToArrowConfig</span><span class="w"> </span><span class="n">config</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">JdbcToArrowConfigBuilder</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="cm">/*calendar=*/</span><span class="kc">null</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setReuseVectorSchemaRoot</span><span class="p">(</span><span class="n">reuseVectorSchemaRoot</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setJdbcToArrowTypeConverter</span><span class="p">((</span><span class="n">jdbcFieldInfo</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">switch</span><span class="w"> </span><span class="p">(</span><span class="n">jdbcFieldInfo</span><span class="p">.</span><span class="na">getJdbcType</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">Types</span><span class="p">.</span><span class="na">BIGINT</span><span class="p">:</span>
<span class="w"> </span><span class="c1">// Assume actual value range is SMALLINT</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ArrowType</span><span class="p">.</span><span class="na">Int</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">);</span>
<span class="w"> </span><span class="k">default</span><span class="p">:</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}))</span>
<span class="w"> </span><span class="p">.</span><span class="na">build</span><span class="p">();</span>
<span class="k">try</span><span class="w"> </span><span class="p">(</span><span class="n">ArrowVectorIterator</span><span class="w"> </span><span class="n">iter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JdbcToArrow</span><span class="p">.</span><span class="na">sqlToArrowVectorIterator</span><span class="p">(</span><span class="n">rs</span><span class="p">,</span><span class="w"> </span><span class="n">config</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">iter</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">VectorSchemaRoot</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">iter</span><span class="p">.</span><span class="na">next</span><span class="p">();</span>
<span class="w"> </span><span class="c1">// Consume the root…</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The JDBC type can be explicitly specified, which is useful since JDBC
drivers can give spurious type information. For example, the Postgres
driver has been observed to use Decimal types with scale and precision
0; these cases can be handled by specifying the type explicitly before
reading. Also, some JDBC drivers may return BigDecimal values with
inconsistent scale. A RoundingMode can be set to handle these cases:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="n">Map</span><span class="o">&lt;</span><span class="n">Integer</span><span class="p">,</span><span class="w"> </span><span class="n">JdbcFieldInfo</span><span class="o">&gt;</span><span class="w"> </span><span class="n">mapping</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">HashMap</span><span class="o">&lt;&gt;</span><span class="p">();</span>
<span class="n">mapping</span><span class="p">.</span><span class="na">put</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">JdbcFieldInfo</span><span class="p">(</span><span class="n">Types</span><span class="p">.</span><span class="na">DECIMAL</span><span class="p">,</span><span class="w"> </span><span class="mi">20</span><span class="p">,</span><span class="w"> </span><span class="mi">7</span><span class="p">));</span>
<span class="n">JdbcToArrowConfig</span><span class="w"> </span><span class="n">config</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">JdbcToArrowConfigBuilder</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="cm">/*calendar=*/</span><span class="kc">null</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setBigDecimalRoundingMode</span><span class="p">(</span><span class="n">RoundingMode</span><span class="p">.</span><span class="na">UNNECESSARY</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setExplicitTypesByColumnIndex</span><span class="p">(</span><span class="n">mapping</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">build</span><span class="p">();</span>
<span class="k">try</span><span class="w"> </span><span class="p">(</span><span class="n">ArrowVectorIterator</span><span class="w"> </span><span class="n">iter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JdbcToArrow</span><span class="p">.</span><span class="na">sqlToArrowVectorIterator</span><span class="p">(</span><span class="n">rs</span><span class="p">,</span><span class="w"> </span><span class="n">config</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">iter</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">VectorSchemaRoot</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">iter</span><span class="p">.</span><span class="na">next</span><span class="p">();</span>
<span class="w"> </span><span class="c1">// Consume the root…</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The mapping from JDBC type to Arrow type can be overridden via the
<code class="docutils literal notranslate"><span class="pre">JdbcToArrowConfig</span></code>, but it is not possible to customize the
conversion from JDBC value to Arrow value itself, nor is it possible
to define a conversion for an unsupported type.</p>
<section id="type-mapping">
<h3>Type Mapping<a class="headerlink" href="#type-mapping" title="Permalink to this heading">#</a></h3>
<p>The JDBC to Arrow type mapping can be obtained at runtime from
<a class="reference external" href="https://arrow.apache.org/docs/java/reference/org/apache/arrow/adapter/jdbc/JdbcToArrowUtils.html#getArrowTypeFromJdbcType-org.apache.arrow.adapter.jdbc.JdbcFieldInfo-java.util.Calendar-">JdbcToArrowUtils.getArrowTypeFromJdbcType</a>.</p>
<table class="table">
<thead>
<tr class="row-odd"><th class="head"><p>JDBC Type</p></th>
<th class="head"><p>Arrow Type</p></th>
<th class="head"><p>Notes</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>ARRAY</p></td>
<td><p>List</p></td>
<td><p>(1)</p></td>
</tr>
<tr class="row-odd"><td><p>BIGINT</p></td>
<td><p>Int64</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>BINARY</p></td>
<td><p>Binary</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>BIT</p></td>
<td><p>Bool</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>BLOB</p></td>
<td><p>Binary</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>BOOLEAN</p></td>
<td><p>Bool</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>CHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>CLOB</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>DATE</p></td>
<td><p>Date32</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>DECIMAL</p></td>
<td><p>Decimal128</p></td>
<td><p>(2)</p></td>
</tr>
<tr class="row-even"><td><p>DOUBLE</p></td>
<td><p>Double</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>FLOAT</p></td>
<td><p>Float32</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>INTEGER</p></td>
<td><p>Int32</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>LONGVARBINARY</p></td>
<td><p>Binary</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>LONGNVARCHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>LONGVARCHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>NCHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>NULL</p></td>
<td><p>Null</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>NUMERIC</p></td>
<td><p>Decimal128</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>NVARCHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>REAL</p></td>
<td><p>Float32</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>SMALLINT</p></td>
<td><p>Int16</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>STRUCT</p></td>
<td><p>Struct</p></td>
<td><p>(3)</p></td>
</tr>
<tr class="row-odd"><td><p>TIME</p></td>
<td><p>Time32[ms]</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>TIMESTAMP</p></td>
<td><p>Timestamp[ms]</p></td>
<td><p>(4)</p></td>
</tr>
<tr class="row-odd"><td><p>TINYINT</p></td>
<td><p>Int8</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>VARBINARY</p></td>
<td><p>Binary</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>VARCHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
</tbody>
</table>
<ul class="simple">
<li><p>(1) The list value type must be explicitly configured and cannot be
inferred. Use <a class="reference external" href="https://arrow.apache.org/docs/java/reference/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigBuilder.html#setArraySubTypeByColumnIndexMap-java.util.Map-">setArraySubTypeByColumnIndexMap</a> or
<a class="reference external" href="https://arrow.apache.org/docs/java/reference/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigBuilder.html#setArraySubTypeByColumnNameMap-java.util.Map-">setArraySubTypeByColumnNameMap</a>.</p></li>
<li><p>(2) By default, the scale of decimal values must match the scale in
the type exactly; precision is allowed to be any value greater or
equal to the type precision. If there is a mismatch, by default, an
exception will be thrown. This can be configured by setting a
different RoundingMode with setBigDecimalRoundingMode.</p></li>
<li><p>(3) Not fully supported: while the type conversion is defined, the
value conversion is not. See <a class="reference external" href="https://issues.apache.org/jira/browse/ARROW-17006">ARROW-17006</a>.</p></li>
<li><p>(4) If a Calendar is provided, then the timestamp will have the
timezone of the calendar, else it will be a timestamp without
timezone.</p></li>
</ul>
</section>
</section>
<section id="vectorschemaroot-to-preparedstatement-parameter-conversion">
<h2>VectorSchemaRoot to PreparedStatement Parameter Conversion<a class="headerlink" href="#vectorschemaroot-to-preparedstatement-parameter-conversion" title="Permalink to this heading">#</a></h2>
<p>The adapter can bind rows of Arrow data from a VectorSchemaRoot to
parameters of a JDBC PreparedStatement. This can be accessed via the
JdbcParameterBinder class. Each call to next() will bind parameters
from the next row of data, and then the application can execute the
statement, call addBatch(), etc. as desired. Null values will lead to
a setNull call with an appropriate JDBC type code (listed below).</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="kd">final</span><span class="w"> </span><span class="n">JdbcParameterBinder</span><span class="w"> </span><span class="n">binder</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="n">JdbcParameterBinder</span><span class="p">.</span><span class="na">builder</span><span class="p">(</span><span class="n">statement</span><span class="p">,</span><span class="w"> </span><span class="n">root</span><span class="p">).</span><span class="na">bindAll</span><span class="p">().</span><span class="na">build</span><span class="p">();</span>
<span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">binder</span><span class="p">.</span><span class="na">next</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">statement</span><span class="p">.</span><span class="na">executeUpdate</span><span class="p">();</span>
<span class="p">}</span>
<span class="c1">// Use a VectorLoader to update the root</span>
<span class="n">binder</span><span class="p">.</span><span class="na">reset</span><span class="p">();</span>
<span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">binder</span><span class="p">.</span><span class="na">next</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">statement</span><span class="p">.</span><span class="na">executeUpdate</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The mapping of vectors to parameters, the JDBC type code used by the
converters, and the type conversions themselves can all be customized:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="kd">final</span><span class="w"> </span><span class="n">JdbcParameterBinder</span><span class="w"> </span><span class="n">binder</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="n">JdbcParameterBinder</span><span class="p">.</span><span class="na">builder</span><span class="p">(</span><span class="n">statement</span><span class="p">,</span><span class="w"> </span><span class="n">root</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">bind</span><span class="p">(</span><span class="cm">/*parameterIndex*/</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="cm">/*columnIndex*/</span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">bind</span><span class="p">(</span><span class="cm">/*parameterIndex*/</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">customColumnBinderInstance</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">build</span><span class="p">();</span>
</pre></div>
</div>
<section id="id1">
<h3>Type Mapping<a class="headerlink" href="#id1" title="Permalink to this heading">#</a></h3>
<p>The Arrow to JDBC type mapping can be obtained at runtime via
a method on ColumnBinder.</p>
<table class="table">
<thead>
<tr class="row-odd"><th class="head"><p>Arrow Type</p></th>
<th class="head"><p>JDBC Type</p></th>
<th class="head"><p>Notes</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>Binary</p></td>
<td><p>VARBINARY (setBytes)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Bool</p></td>
<td><p>BOOLEAN (setBoolean)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Date32</p></td>
<td><p>DATE (setDate)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Date64</p></td>
<td><p>DATE (setDate)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Decimal128</p></td>
<td><p>DECIMAL (setBigDecimal)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Decimal256</p></td>
<td><p>DECIMAL (setBigDecimal)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>FixedSizeBinary</p></td>
<td><p>BINARY (setBytes)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Float32</p></td>
<td><p>REAL (setFloat)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Int8</p></td>
<td><p>TINYINT (setByte)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Int16</p></td>
<td><p>SMALLINT (setShort)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Int32</p></td>
<td><p>INTEGER (setInt)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Int64</p></td>
<td><p>BIGINT (setLong)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>LargeBinary</p></td>
<td><p>LONGVARBINARY (setBytes)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>LargeUtf8</p></td>
<td><p>LONGVARCHAR (setString)</p></td>
<td><p>(1)</p></td>
</tr>
<tr class="row-even"><td><p>Time[s]</p></td>
<td><p>TIME (setTime)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Time[ms]</p></td>
<td><p>TIME (setTime)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Time[us]</p></td>
<td><p>TIME (setTime)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Time[ns]</p></td>
<td><p>TIME (setTime)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Timestamp[s]</p></td>
<td><p>TIMESTAMP (setTimestamp)</p></td>
<td><p>(2)</p></td>
</tr>
<tr class="row-odd"><td><p>Timestamp[ms]</p></td>
<td><p>TIMESTAMP (setTimestamp)</p></td>
<td><p>(2)</p></td>
</tr>
<tr class="row-even"><td><p>Timestamp[us]</p></td>
<td><p>TIMESTAMP (setTimestamp)</p></td>
<td><p>(2)</p></td>
</tr>
<tr class="row-odd"><td><p>Timestamp[ns]</p></td>
<td><p>TIMESTAMP (setTimestamp)</p></td>
<td><p>(2)</p></td>
</tr>
<tr class="row-even"><td><p>Utf8</p></td>
<td><p>VARCHAR (setString)</p></td>
<td></td>
</tr>
</tbody>
</table>
<ul class="simple">
<li><p>(1) Strings longer than Integer.MAX_VALUE bytes (the maximum length
of a Java <code class="docutils literal notranslate"><span class="pre">byte[]</span></code>) will cause a runtime exception.</p></li>
<li><p>(2) If the timestamp has a timezone, the JDBC type defaults to
TIMESTAMP_WITH_TIMEZONE. If the timestamp has no timezone,
technically there is not a correct conversion from Arrow value to
JDBC value, because a JDBC Timestamp is in UTC, and we have no
timezone information. In this case, the default binder will call
<a class="reference external" href="https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/PreparedStatement.html#setTimestamp(int,java.sql.Timestamp)">setTimestamp(int, Timestamp)</a>,
which will lead to the driver using the “default timezone” (that of
the Java VM).</p></li>
</ul>
</section>
</section>
</section>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
<a class="left-prev"
href="cdata.html"
title="previous page">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">previous</p>
<p class="prev-next-title">C Data Interface</p>
</div>
</a>
<a class="right-next"
href="reference/index.html"
title="next page">
<div class="prev-next-info">
<p class="prev-next-subtitle">next</p>
<p class="prev-next-title">Java Reference (javadoc)</p>
</div>
<i class="fa-solid fa-angle-right"></i>
</a>
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
<div class="sidebar-secondary-item">
<div
id="pst-page-navigation-heading-2"
class="page-toc tocsection onthispage">
<i class="fa-solid fa-list"></i> On this page
</div>
<nav class="bd-toc-nav page-toc" aria-labelledby="pst-page-navigation-heading-2">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#resultset-to-vectorschemaroot-conversion">ResultSet to VectorSchemaRoot Conversion</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#type-mapping">Type Mapping</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#vectorschemaroot-to-preparedstatement-parameter-conversion">VectorSchemaRoot to PreparedStatement Parameter Conversion</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#id1">Type Mapping</a></li>
</ul>
</li>
</ul>
</nav></div>
<div class="sidebar-secondary-item">
<div class="tocsection editthispage">
<a href="https://github.com/apache/arrow/edit/main/docs/source/java/jdbc.rst">
<i class="fa-solid fa-pencil"></i>
Edit on GitHub
</a>
</div>
</div>
</div></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2016-2024 Apache Software Foundation.
Apache Arrow, Arrow, Apache, the Apache feather logo, and the Apache Arrow project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 6.2.0.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>