JDBCを使用してTiDBに接続する
TiDBはMySQL互換データベースであり、JDBC(Java Database Connectivity)はJavaのデータアクセスAPIです。MySQL MySQL Connector/Jは、MySQLにおけるJDBCの実装です。
このチュートリアルでは、TiDBとJDBCを使用して以下のタスクを実行する方法を学ぶことができます。
- 環境をセットアップしてください。
- JDBCを使用してTiDBに接続します。
- アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作用のサンプルコードスニペットを見つけることができます。
注記:
- このチュートリアルは、 TiDB Cloud Starter、 TiDB Cloud Essential、 TiDB Cloud Dedicated、およびTiDB Self-Managedに対応しています。
- TiDB v7.4 以降、
connectionCollationが構成されておらず、JDBC URL でcharacterEncodingが構成されていないか、またはUTF-8に設定されている場合、JDBC 接続で使用される照合順序は JDBC ドライバーのバージョンによって異なります。詳細については、 JDBC接続で使用される照合順序を参照してください。
前提条件
このチュートリアルを完了するには、以下が必要です。
- Java Development Kit (JDK) 17以降が必要です。業務要件や個人のニーズに応じて、 OpenJDKまたはOracle JDKを選択できます。
- メイブン3.8以上。
- Git 。
- TiDBクラスタ。
TiDBクラスタをお持ちでない場合は、以下の手順で作成できます。
TiDBに接続するには、サンプルアプリを実行してください。
このセクションでは、サンプルアプリケーションコードを実行してTiDBに接続する方法を説明します。
ステップ1:サンプルアプリのリポジトリをクローンする
サンプルコードリポジトリをクローンするには、ターミナルウィンドウで以下のコマンドを実行してください。
git clone https://github.com/tidb-samples/tidb-java-jdbc-quickstart.git
cd tidb-java-jdbc-quickstart
ステップ2:接続情報を設定する
選択したTiDBのデプロイオプションに応じて、TiDBに接続してください。
私のTiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログの設定がご使用のオペレーティング環境と一致していることを確認してください。
接続タイプは
Publicに設定されています。ブランチは
mainに設定されています。Connect With は
Generalに設定されています。お使いの環境に合ったオペレーティングシステムを選択してください。
ヒント:
プログラムがWindows Subsystem for Linux(WSL)上で実行されている場合は、対応するLinuxディストリビューションに切り替えてください。
「パスワード生成」をクリックすると、ランダムなパスワードが生成されます。
ヒント:
以前にパスワードを作成したことがある場合は、元のパスワードを使用するか、 「パスワードをリセット」をクリックして新しいパスワードを生成できます。
env.sh.exampleをコピーしてenv.shに名前を変更するには、次のコマンドを実行します。cp env.sh.example env.sh対応する接続文字列
env.shファイルにコピー&ペーストしてください。例は以下のとおりです。export TIDB_HOST='{host}' # e.g. gateway01.ap-northeast-1.prod.aws.tidbcloud.com export TIDB_PORT='4000' export TIDB_USER='{user}' # e.g. xxxxxx.root export TIDB_PASSWORD='{password}' export TIDB_DB_NAME='test' export USE_SSL='true'必ずプレースホルダー
{}を、接続ダイアログから取得した接続パラメータに置き換えてください。TiDB Cloud Starter は安全な接続を必要とします。そのため、
USE_SSLの値をtrueに設定する必要があります。env.shファイルを保存します。
私のTiDBページに移動し、対象のTiDB Cloud Dedicatedクラスタの名前をクリックして概要ページに移動します。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログで、「接続タイプ」ドロップダウンリストから「パブリック」を選択し、 「CA証明書」をクリックしてCA証明書をダウンロードします。
IP アクセス リストを設定していない場合は、最初の接続の前に、 [IP アクセス リストの設定] をクリックするか、「IP アクセス リストを設定する」の手順に従ってIPアクセスリストを設定する。
TiDB Cloud Dedicated は、パブリック接続タイプに加えて、プライベート エンドポイントおよびVPC ピアリング接続タイプもサポートしています。詳細については、 TiDB Cloud Dedicatedクラスタに接続します参照してください。
env.sh.exampleをコピーしてenv.shに名前を変更するには、次のコマンドを実行します。cp env.sh.example env.sh対応する接続文字列
env.shファイルにコピー&ペーストしてください。例は以下のとおりです。export TIDB_HOST='{host}' # e.g. tidb.xxxx.clusters.tidb-cloud.com export TIDB_PORT='4000' export TIDB_USER='{user}' # e.g. root export TIDB_PASSWORD='{password}' export TIDB_DB_NAME='test' export USE_SSL='false'必ずプレースホルダー
{}を、接続ダイアログから取得した接続パラメータに置き換えてください。env.shファイルを保存します。
env.sh.exampleをコピーしてenv.shに名前を変更するには、次のコマンドを実行します。cp env.sh.example env.sh対応する接続文字列
env.shファイルにコピー&ペーストしてください。例は以下のとおりです。export TIDB_HOST='{host}' export TIDB_PORT='4000' export TIDB_USER='root' export TIDB_PASSWORD='{password}' export TIDB_DB_NAME='test' export USE_SSL='false'プレースホルダー
{}を接続パラメータに置き換え、USE_SSLfalseに設定してください。TiDB をローカルで実行している場合、デフォルトのホスト アドレスは127.0.0.1で、パスワードは空です。env.shファイルを保存します。
ステップ3:コードを実行して結果を確認する
サンプルコードを実行するには、以下のコマンドを実行してください。
make期待される出力.txtをチェックして、出力が一致するかどうかを確認してください。
サンプルコードスニペット
以下のサンプルコードスニペットを参考に、独自のアプリケーション開発を完成させてください。
完全なサンプルコードと実行方法については、 tidb-samples/tidb-java-jdbc-quickstartリポジトリを参照してください。
TiDBに接続する
public MysqlDataSource getMysqlDataSource() throws SQLException {
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setServerName(${tidb_host});
mysqlDataSource.setPortNumber(${tidb_port});
mysqlDataSource.setUser(${tidb_user});
mysqlDataSource.setPassword(${tidb_password});
mysqlDataSource.setDatabaseName(${tidb_db_name});
if (${tidb_use_ssl}) {
mysqlDataSource.setSslMode(PropertyDefinitions.SslMode.VERIFY_IDENTITY.name());
mysqlDataSource.setEnabledTLSProtocols("TLSv1.2,TLSv1.3");
}
return mysqlDataSource;
}
この機能を使用する場合は、 ${tidb_host} 、 ${tidb_port} 、 ${tidb_user} 、 ${tidb_password} 、および${tidb_db_name} TiDBの実際の値に置き換える必要があります。
データを挿入する
public void createPlayer(PlayerBean player) throws SQLException {
MysqlDataSource mysqlDataSource = getMysqlDataSource();
try (Connection connection = mysqlDataSource.getConnection()) {
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO player (id, coins, goods) VALUES (?, ?, ?)");
preparedStatement.setString(1, player.getId());
preparedStatement.setInt(2, player.getCoins());
preparedStatement.setInt(3, player.getGoods());
preparedStatement.execute();
}
}
詳細については、データを挿入するを参照してください。
クエリデータ
public void getPlayer(String id) throws SQLException {
MysqlDataSource mysqlDataSource = getMysqlDataSourceByEnv();
try (Connection connection = mysqlDataSource.getConnection()) {
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM player WHERE id = ?");
preparedStatement.setString(1, id);
preparedStatement.execute();
ResultSet res = preparedStatement.executeQuery();
if(res.next()) {
PlayerBean player = new PlayerBean(res.getString("id"), res.getInt("coins"), res.getInt("goods"));
System.out.println(player);
}
}
}
詳細については、 クエリデータを参照してください。
データの更新
public void updatePlayer(String id, int amount, int price) throws SQLException {
MysqlDataSource mysqlDataSource = getMysqlDataSourceByEnv();
try (Connection connection = mysqlDataSource.getConnection()) {
PreparedStatement transfer = connection.prepareStatement("UPDATE player SET goods = goods + ?, coins = coins + ? WHERE id=?");
transfer.setInt(1, -amount);
transfer.setInt(2, price);
transfer.setString(3, id);
transfer.execute();
}
}
詳細については、データの更新を参照してください。
データを削除する
public void deletePlayer(String id) throws SQLException {
MysqlDataSource mysqlDataSource = getMysqlDataSourceByEnv();
try (Connection connection = mysqlDataSource.getConnection()) {
PreparedStatement deleteStatement = connection.prepareStatement("DELETE FROM player WHERE id=?");
deleteStatement.setString(1, id);
deleteStatement.execute();
}
}
詳細については、データを削除するを参照してください。
役立つメモ
ドライバーまたはORMフレームワークを使用していますか?
Javaドライバはデータベースへの低レベルアクセスを提供するが、開発者には以下のことが必要となる。
- データベース接続を手動で確立および解放します。
- データベースのトランザクションを手動で管理する。
- データ行をデータオブジェクトに手動でマッピングします。
複雑なSQL文を書く必要がない限り、 ハイバネイト、 MyBatis 、 Spring Data JPAなどのORMフレームワークを開発に利用することをお勧めします。これにより、以下のようなメリットが得られます。
- 接続とトランザクションを管理するための定型コードを削減します。
- 多数のSQL文の代わりに、データオブジェクトを使用してデータを操作します。
MySQLとの互換性
MySQL では、 DECIMAL列にデータを挿入する際に、小数点以下の桁数が列で定義されているスケールを超えた場合、MySQL は余分な桁を自動的に切り捨て、切り捨てられたデータを正常に挿入します。余分な小数点以下の桁数に関係なく、この処理が行われます。
TiDB v8.5.3以前のバージョンでは:
- 小数点以下の桁数が定義されたスケールを超えているが72を超えていない場合、TiDBは余分な桁を自動的に切り捨て、切り捨てられたデータを正常に挿入します。
- ただし、小数点以下の桁数が72を超えると、挿入は失敗し、エラーが返されます。
TiDB v8.5.4以降、TiDBはMySQLの動作に準拠するようになりました。つまり、小数点以下の桁数がいくつ多くても、余分な桁を自動的に切り捨て、切り捨てられたデータを正常に挿入します。
次のステップ
- MySQL Connector/J の使用法の詳細についてはMySQL Connector/J のドキュメント参照してください。
- 開発者ガイドデータを挿入するデータの更新、データを削除する、「SQL パフォーマンス最適化」などの章単一表の読み取り読んで、TiDB アプリケーション 取引SQLパフォーマンス最適化。
- プロフェッショナルなTiDB開発者向けコースコースを通じて学習し、試験に合格するとTiDB認定資格を取得します。
- Java開発者向けのコース「 JavaからTiDBを操作するを通じて学習します。
お困りですか?
- 不和or スラックコミュニティに質問してください。
- TiDB Cloudのサポートチケットを送信してください
- TiDB Self-Managedのサポートチケットを送信してください