記事ディレクトリ
1. データベース
データベースは、データ構造に従ってデータを整理、保存、管理する「倉庫」です。
データベースにはリレーショナルデータベース(sqlデータベース)と非リレーショナルデータベース(no-sqlデータベース)があり、両者の違いは操作方法としてSQL文を使用するかどうかです。一般的なデータベースのほとんどは、MySql データベース、PostgreSql、oracle データベースなどのリレーショナル データベースです。
2. データベースドライバー
データベース ドライバーは、特定の開発言語環境 (Java など) でデータベース呼び出しを可能にするために、さまざまなデータベース開発者 (oracle mysql など) によって開発されたプログラムです。データベース ドライバーの役割は、翻訳者と同等であり、 Java
のデータベース呼び出し言語は、データベース独自のデータベース言語に変換されます。もちろん、この変換 (データベース ドライバー) は、統一インターフェイス用に各開発者によってカスタマイズおよび開発されます。
一般的に使用されるドライバー:
1. MySQL
ドライバーのクラス名: com.mysql.jdbc.Driver
JDBC URL (接続アドレス): jdbc:mysql://dbip:port/databasename
- dbip: はデータベース サーバーの IP アドレスです。ローカルで書き込み可能な場合: localhost または 127.0.0.1。
- port: データベースのリスニング ポートです。インストール時の構成によって異なります。デフォルトは 3306 です。
- データベース名: データベースの名前。
2. SQL Server データベース
ドライバーのクラス名: com.microsoft.jdbc.sqlserver.SQLServerDriver
JDBC URL: jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename
- dbip: はデータベース サーバーの IP アドレスです。ローカルで書き込み可能な場合: localhost または 127.0.0.1。
- port: データベースのリスニング ポートです。インストール時の構成によって異なります。デフォルトは 1433 です。
- データベース名: データベースの名前。
3. Oracle データベース
ドライバーのクラス名: oracle.jdbc.driver.OracleDriver
JDBC URL: jdbc:oracle:thin:@dbip:port:databasename
- dbip: はデータベース サーバーの IP アドレスです。ローカルで書き込み可能な場合: localhost または 127.0.0.1。
- port: データベースのリスニング ポートです。インストール時の構成によって異なります。デフォルトは 1521 です。
- Databasename: はデータベースの SID で、通常はグローバル データベースの名前です。
以下に示すように、JDBC が登場する前は、Java 開発者はさまざまなデータベースを操作するために、さまざまなデータベース用のドライバーを保守する必要がありました。
3、JDBC
JDBC の正式名は Java Database connect で、SQL ステートメントを実行するためのJava APIのセットです。アプリケーションは、この API セットを通じてリレーショナル データベースに接続し、SQL ステートメントを使用してデータベース内のデータのクエリ、更新、削除などの操作を実行できます。簡単に言うと、データベースを接続して操作するコンポーネントです。
public static void main(String[] args) throws Exception {
//1. 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2. 通过驱动管理类获取数据库连接
Connection conn = DriverManager.getConnection(url,username,password);
//3. 通过Connection对象创建Statement对象
Statement stmt = conn.createStatement();
//4. 执行sql语句
ResultSet rs = preparedStatement.executeQuery("SELECT * FROM ...") ;
//5. 遍历结果集
while(rs.next()){
String name = rs.getString("name") ;
}
//6. 关闭数据库连接,回收数据库资源
// 关闭顺序:依次关闭ResultSet、Statement、Connection等资源。
if(rs !=null){
// 关闭记录集
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt !=null){
// 关闭声明
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn !=null){
// 关闭连接对象
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
アプリケーションが JDBC を使用してデータベースにアクセスする方法は、次の図に示されています。 上の図からわかるように
、アプリケーションが JDBC を使用して特定のデータベースにアクセスする場合、別のデータベース ドライバーに接続する必要があります。データベース ベンダーによって提供されるデータベース ドライバーは異なるため、アプリケーションがデータベースとの接続を実際に確立するには、JDBC がデータベースにアクセスするための API を提供し、さまざまなデータベース サーバーとの通信の詳細をカプセル化する必要があります。
4、データソース
データ ソース テクノロジは Java がデータベースを操作するための重要なテクノロジであり、一般的な永続化フレームワークはデータ ソースのアプリケーションと切り離すことができません。
データ ソースは、データベース接続を取得する簡単な方法を提供し、プール メカニズムを通じてデータベース接続を内部で再利用できるため、データベース接続の作成数が大幅に削減され、システム パフォーマンスが向上します。データ ソースが必要な理由: jdbc を使用して接続を確立および破棄するとリソースが無駄になりすぎるため、データベースとの接続を確立するための効率的なコンポーネントのセット (データ ソース) が必要です。データ ソースは接続プールを作成できます。一般的なものには、DBCP、C3P0、druid、hikariCP などが含まれます。
5. データベース接続プール
データベース接続プールは、データベース接続の割り当て、管理、解放を担当し、アプリケーションが新しいデータベース接続を確立する代わりに、既存のデータベース接続を再利用できるようにします。接続プール テクノロジは、できるだけ多くのメモリ リソースを再利用し、メモリを大幅に節約し、サーバーのサービス効率を向上させ、より多くの顧客サービスをサポートできます。接続プールを利用することでプログラムの実行効率が大幅に向上すると同時に、独自の管理機構によりデータベース接続数や使用状況を監視することができます。
MySQL にアクセスする場合を例として、SQL コマンドを実行します。
接続プーリングを使用しない:
データベース接続プーリングを使用しない手順:
TCP建立连接的三次握手
MySQL认证的三次握手
真正的SQL执行
MySQL的关闭
TCP的四次握手关闭
SQL を実行するには、私たちが気にしないネットワーク インタラクションがさらに多く存在することがわかります。
アドバンテージ | 欠点がある |
---|---|
実装が簡単 | ネットワーク IO が多く、データベースの負荷が高くなります。 |
長い応答時間 | 長い応答時間 |
アプリケーションが頻繁に接続を作成したり閉じたりする | |
接続を閉じた後、多数の TIME_WAIT TCP 状態が表示されます |
接続プールを使用するプロセス:
データベース接続プールを使用する手順:
第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。
アドバンテージ:
- ネットワークのオーバーヘッドが少ない
- システムパフォーマンスが大幅に向上します
- 面倒な TIME_WAIT 状態はもう必要ありません
6. 永続層フレームワーク
6.1、ORM
オブジェクト リレーショナル マッピング (略して ORM)、オブジェクト指向開発手法は、今日のエンタープライズ レベルのアプリケーション開発環境における主流の開発手法であり、リレーショナル データベースは、エンタープライズ レベルのアプリケーションにデータを永続的に保存する主流のデータ ストレージ システムです。環境。オブジェクトとリレーショナル データは、ビジネス エンティティの 2 つの表現形式であり、ビジネス エンティティはメモリ内ではオブジェクトとして表され、データベース内ではリレーショナル データとして表されます。メモリ内のオブジェクト間には関連付けや継承関係がありますが、データベースではリレーショナル データは多対多の関連付けや継承関係を直接表現できません。したがって、オブジェクト リレーショナル マッピング (ORM) システムは一般にミドルウェアの形式で存在し、主にプログラム オブジェクトのリレーショナル データベース データへのマッピングを実装します。オブジェクト リレーショナル マッピングの説明: A. シンプル: ORM は、最も基本的な形式でデータをモデル化します。たとえば、ORM は MySQL テーブルを Java クラス (モデル) にマップし、テーブルのフィールドはこのクラスのメンバー変数 B になります。正確: ORM により、統一された標準に従って、すべての mysql データ テーブルを Java クラスに正確にマップできます。システムを正確に保ち、コード レベルで統一するC. 理解しやすい: ORM はデータベース構造を文書化します。たとえば、MySQL データベースは、ORM によって Java プログラマーが理解できる Java クラスに変換されます。Java プログラマーは、得意な Java レベルのみに集中できます (もちろん、MySQL に習熟している方が良いです) D. 使いやすさ: ORM には、永続オブジェクトに対する CRUD 操作 (create()、update()、save()、load()、find()、find_all()、where() など) 用の API が含まれています。つまり、すべての SQL クエリは関数内の関数は、関数の連鎖結合を通じて最終的な SQL ステートメントを生成します。この種のカプセル化により、非標準、冗長、および不均一な SQL ステートメントを回避でき、多くの人為的バグを回避でき、コーディング スタイルの統一とその後のメンテナンスが容易になります。
6.2、Jdbcテンプレート
JDBC には、データベースの追加、削除、変更、クエリを操作するための一連のインターフェイスも用意されていますが、あまりにも煩雑です。
JdbcTemplate は、jdbc にアクセスするために Spring が提供するテンプレートで、Spring による JDBC のカプセル化であり、JDBC を使いやすくすることを目的としています。
JdbcTemplate は、リソースの作成と解放を処理する Spring の一部であり、接続を常に閉じるのを忘れるなどのよくある間違いを回避するのに役立ちます。ステートメントの確立や実行など、コアとなる JDBC ワークフローを実行します。SQL ステートメントを提供して結果を抽出するだけで済み、従来の JDBC 操作よりもはるかに簡単です。
JdbcTemplate の使用法:
JdbcTemplate jdbcTemplate = new JdbcTemplate(DataSourceUtils.getDataSource());
String sql = "INSERT INTO product VALUES (NULL, ?, ?);";
jdbcTemplate.update(sql, "iPhone3GS", 3333);
6.3、マイバティス
Mybatis は、通常の SQL クエリ、ストアド プロシージャ、および高度なマッピングをサポートする優れた永続層(半)ORM
フレームワーク
であり、ほとんどすべての JDBC コードとパラメータの手動設定と結果セットの取得を回避します。
SpringBoot では、MybatisAutoConfiguration クラス。データ ソース DataSource が SqlSessionFactory に挿入され、SqlSessionTemplate が SqlSessionFactory に基づいて作成されていることがわかります。これで自動アセンブリが完了し、@Autowired を直接使用できるようになります。
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
//...
}
@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
ExecutorType executorType = this.properties.getExecutorType();
if (executorType != null) {
return new SqlSessionTemplate(sqlSessionFactory, executorType);
} else {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
Mybatis のコンポーネント:
各コンポーネントの機能の紹介:
- Mybatis 設定ファイル: SqlMapConfig.xml は Mybatis のグローバル設定ファイルで、主にデータ ソース、トランザクション、マッピング ファイルのロードなどを設定します。Mapper.xmlは主にSQL文などのStatement関連の情報を設定します。
- SqlSessionFactoryBuilder: XML 構成または Java 構成に基づいて SqlSessionFactory オブジェクトを生成します。ビルダー モードを使用します (簡単に言えば、レンガを購入し、レンガを敷き、大きな家が大きな対象であり、一連の建設ステップが段階的な建設である建設)。
- SqlSessionFactory: SqlSession の生成に使用されます。SqlSession オブジェクトは、SqlSessionFactory.openSession() メソッドを通じて作成できます。ファクトリ パターンを使用します (簡単に言えば、クラスを通じてオブジェクトを取得します。このクラスは、new を通じて自分でインスタンスを作成するのではなく、必要なインスタンスを作成して返します)。
- SqlSession: JDBC の Connection オブジェクトに相当します。SqlSession インスタンスを使用して、マップされた SQL ステートメントを直接実行したり、対応するマッパーを取得したりできます。
- Executor: MyBatis のすべての Mapper ステートメントは Executor を通じて実行されます。(マッパー:XMLファイルとJavaインターフェースから構成されます。XMLに設定されたマッピング情報に従って、対応するSQL文を実行し、実行結果を返します。)
- マッパー インターフェイス: データ操作インターフェイスは一般に DAO インターフェイスとも呼ばれ、マッパー構成ファイル内のメソッドと 1 対 1 で対応する必要があります。つまり、追加、削除、変更、チェックと一貫性がなければなりません。 Mapper.xml のタグ ID。
- マッパー構成: 特定のクエリ ビジネスを整理し、データベースのフィールド関係をマップするために使用されます。これは、XML 形式 (Mapper.xml) または Java 注釈形式を使用して実装できます。
- MappedStatement: その機能は、SQL ステートメント、入力パラメーター、出力結果などを含むステートメント関連の情報をカプセル化することです。
Mybatisの実行プロセス:
- まず、Mybatis のグローバル構成ファイルがロードされ、次に SQL マッピング ファイルまたはアノテーションの関連 SQL コンテンツがロードされます。
- セッション ファクトリの作成 MyBatis は、設定ファイル内の情報を読み取ってセッション ファクトリ (SqlSessionFactory) を構築します。
- セッションを作成します。セッション ファクトリに従って、MyBatis はそれを通じてセッション オブジェクト (SqlSession) を作成できます。セッション オブジェクトは、データベース操作を追加、削除、変更、およびクエリするためのメソッドを含むインターフェイスです。
- エグゼキュータの作成: セッション オブジェクト自体はデータベースを直接操作できないため、データベース エグゼキュータ (Executor) と呼ばれるインターフェイスを使用して操作の実行を支援します。
- SQL オブジェクトのカプセル化。このステップでは、実行プログラムは、SQL ステートメント、入力パラメーターのマッピング情報 (Java 単純型、HashMap または POJO)、および出力結果のマッピング情報 ( Java 単純型、HashMap または POJO)。
- データベースを操作するには、エグゼキュータとSQL情報カプセル化オブジェクトを取得したら、それらを使ってデータベースにアクセスし、最後に操作結果を返して処理を終了します。
6.4、JPA
JPA の正式名は Java Persistence API で、 SUN によって発表されたORM ベースの仕様
のセットです。JPA 仕様は本質的に ORM 仕様です。JPA は ORM 実装を提供していないため、ORM フレームワークではないことに注意してください。一部の仕様を策定し、一部のプログラミング API インターフェイスを提供するだけですが、具体的な実装はサービス ベンダーによって提供されます。JPA と Hibernate の関係は、JDBC と JDBC ドライバーの関係に似ており、JPA は仕様であり、ORM フレームワークであることに加えて、Hibernate は JPA 実装でもあります。Spring Data JPA は、ORM フレームワークと JPA 仕様に基づいて Spring によってカプセル化された JPA アプリケーション フレームワークのセットです。基盤となる層では、引き続き jpa を実装する Hibernate テクノロジが使用されており、開発者は最小限
のコードでデータベースにアクセスして操作できます。
:
オブジェクト操作のインターフェースを定義し、JpaRepository のコアインターフェースを継承します。
import com.boot.jpa.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User,Integer> {
// 但条件查询
User findByAge(Integer age);
// 多条件查询
User findByNameAndAge(String name, Integer age);
// 自定义查询
@Query("from User u where u.name=:name")
User findSql(@Param("name") String name);
}
7. まとめ
JDBC: 基礎となるコードに近い、データベースに接続して操作するためのネイティブ API。
JDBC とデータ ソース: データ ソースは、データベースに接続するための jdbc の実装です。
データ ソースとデータベース ドライバー: 異なるデータベースに接続するには、異なるドライバーを使用する必要があります。
データ ソースと接続プール: データ ソースは、基礎となる jdbc を使用してアイドル接続を生成し、データベースへのアクセス時に使用するために接続プールにそれらの接続を入れます。
JdbcTemplate、MyBatis、データソースを操作するには、まずデータベースに接続する必要があるため、jdbcTemplate、MyBatis がデータソースの接続プールを使用できるように、jdbcTemplate、MyBatis のデータソースを設定する必要があります。
jpa と Hibernate: Hibernate は jpa 仕様に従って実装されます。最下層でもデータ ソースと JDBC を使用してデータベースにアクセスします。
JDBC と jpa: 本質的に、jdbc と jpa は同じレベルにありません。
JDBC是数据库的统一接口标准。
jpa是ORM框架的统一接口标准。
用法有区别: jdbc更注重数据库,orm则更注重于java代码,
但是实际上jpa实现的框架底层还是用jdbc去和数据库打交道。
参考:
- https://www.cnblogs.com/yanze/p/9714703.html
- https://www.zhihu.com/question/45993333
- https://juejin.cn/post/6844903475239714823
- https://blog.csdn.net/An1090239782/article/details/107159335
- https://www.cnblogs.com/tanghaorong/p/13856465.html#:~:text=MyBatis%20%E6%98%AF%E6%94%AF%E6%8C%81%E5%AE%9A %E5%88%B6%E5%8C%96,%E5%8F%82%E6%95%B0%E4%BB%A5%E5%8F%8A%E8%8E%B7%E5%8F%96% E7%BB%93%E6%9E%9C%E9%9B%86%E3%80%82
- https://blog.csdn.net/u013541707/article/details/113182157
- https://blog.csdn.net/papima/article/details/78219000