Hibernateのフレームワークの概要
1.はじめに
- Hibernateのオブジェクト・リレーショナル・マッピング・フレームワークは、オープンソースであります
- それは非常に軽量なJDBCオブジェクトパッケージを持っていました
- これはPOJOデータベース・テーブルとのマッピング関係は、完全に自動化フレームワークのORMです
- そのJavaプログラマがいることを、自動的にSQL文を自動的に実行することができます生成休止状態のデータベースを操作するためのオブジェクト・プログラミングの考え方を使っ任意でよいです。
- HibernateはJDBC、Javaを使用してあらゆる機会に使用することができ、両方のクライアントプログラムで使用することができますサーブレット/ JSP Webアプリケーションでも使用することができます
- ORM永続層のフレーム
ORM:オブジェクトリレーショナルマッピング(オブジェクト関係マッピング)。
これは、オペレータがデータベース内のテーブル上のオブジェクトを操作できるように、リレーショナル・データベース・テーブル内のJavaオブジェクト間のマッピングの確立を指します。
2.利点
- 軽量パッケージであるためにJDBCデータベースアクセスコード、それがデータアクセス層退屈な反復コード、低減メモリ消費量、作業効率アップ速度を簡素化
- JDBCは、基本的な主流の永続化フレームワークであり、大幅にDAO層簡素化作業をコーディングします
- パフォーマンスは、多くの多くの優れた柔軟性マッピング、複数のリレーショナルデータベースをサポート、一対一の複雑な関係、多くの1つ、非常に良いです
- スケーラビリティ、ソースコードとオープンAPI、関数自体が十分でない場合、自己エンコーディングを拡張することができます
休止状態の基本的な使用
1.インポートジャーパッケージ
私たちは、ディレクトリ構造の休止状態を見て開始する前に、次に瓶をインポート
- ドキュメント Hibernateの開発、ドキュメンテーション
- libに jarファイルのHibernateの開発
- 必要な
Hibernateの依存関係を開発しなければならない
- オプションの
オプションのjarパッケージHibernateの開発を - プロジェクトの
参照は、Hibernateプロジェクトにより提供されます
上記の休止状態のjarパッケージをインポートする必要がありますに加えて、我々はまた、インポート・データベースドライバパッケージ、接続プールのjarパッケージにする必要があります。
2.プロファイル
- 休止状態を使用するには、我々のカーネルのコンフィギュレーションファイルに設定する最初の必要性はhibernate.cfg.xmlを
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 连接数据库的基本参数 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate?useSSL=false&serverTimezone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 配置Hibernate的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
<!-- 打印SQL -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL -->
<property name="hibernate.format_sql">true</property>
<!-- 自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--加载映射文件-->
<mapping resource="com/thinmoon/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
hibernate.hbm2ddl.autoさまざまな操作を解析
プロパティ | 意味 |
---|---|
なし | テーブルを作成、自動的に休止状態で使用しないでください |
作ります | あなたは既にデータベースのテーブルを持っている場合は何もテーブル、新しいテーブルが存在しない場合は、再作成し、元のテーブルを削除します |
作成ドロップを | すでにテーブルを持っている場合は、操作を実行し、元のテーブルを削除し、データベース内のテーブルを削除します。何のテーブルが存在しない場合は、新しいを作成し、テーブルを削除するために走りました。最後に、データベース・テーブルには、テストを行うためではありません。SessionFactoryのも近いオフが有効になりますとき |
更新 | あなたは、データベースのテーブルを持っている場合は、テーブルが存在しない場合は、新しいテーブルを作成し、元のテーブルを使用する 列がときに新しいものを作成していない場合は、テーブル構造を更新します |
検証 | 何のテーブルが存在しない場合、テーブルは作成されません。任意の元のデータベーステーブルのみを使用して チェック地図やテーブル構造一貫性の矛盾がエラーになるかどうか |
我々は、一般的にコンフィギュレーション・ファイル・フォーマットの名前は、設定ファイルとの間のマッピング、私たちはHibernateは我々が操作する権利を休止状態にするためにクラスとテーブルの間のマッピングを確立する必要がありますので、私たちは、データベースを操作するためのオブジェクト指向のアプローチを使用することができます知っている、クラス名前.hbm.xml
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!--建立类与表的映射关系--> <class name="com.thinmoon.domain.Customer" table="customer"> <!--建立主键映射关系--> <id name="cust_id" column="cust_id"> <!--设置主键增长方式--> <generator class="native"/> </id> <!--建立属性之间的映射关系--> <property name="cust_name" column="cust_name" /> <property name="cust_source" column="cust_source"/> <property name="cust_industry" column="cust_industry"/> <property name="cust_level" column="cust_level"/> <property name="cust_phone" column="cust_phone"/> <property name="cust_mobile" column="cust_mobile"/> </class> </hibernate-mapping>
Customerクラス:
@Setter @Getter public class Customer { long cust_id; String cust_name; String cust_source; String cust_industry; String cust_level; String cust_phone; String cust_mobile; }
データベースを操作する3。
のは少しデモを見てみましょう:
public class HibernateTest {
@Test
public void testM(){
//1.加载配置文件 hibernate.cfg.xml
Configuration configure = new Configuration().configure();
//2.创建sessionFactory 相当于jdbc的连接池
SessionFactory sessionFactory = configure.buildSessionFactory();
//3.获取session连接对象 相当于jdbc中的连接对象
Session session = sessionFactory.openSession();
Customer customer = new Customer();
customer.setCust_name("thinmoon");
customer.setCust_level("2");
session.save(customer);
session.close();
sessionFactory.close();
}
}
次に我々は、上記の目的の説明をしていました。
コンフィギュレーション
Hibernateは、オブジェクトのコンフィギュレーションの設定であるアクションはHibernate設定であり、それを開始すること。起動時に休止状態、クラスコンフィギュレーション位置特定マッピング文書の最初のインスタンスは、コンフィギュレーションを読み出し、その後のSessionFactoryを作成します。Hibernateのプロジェクト全体が、Configurationクラスはわずかな役割を果たしているが、それは休止状態を開始するときに遭遇した最初のオブジェクトです。このオブジェクトによって設定、データ内容の内部の内側にそれをロードするか、作業の後ろに取得します。
役割:
コア構成ファイルのXML形式とすることができるコア構成ファイルをロードし、それは、プロパティの形態であり得ます
- コアプロファイルは、プロパティファイル名:hibernate.properties
configuration cfg = new configuration()
- コア・コンフィギュレーション・ファイルがあるのXML名前:hibernate.cfg.xmlを
configuration cfg = new configuration(); cfg.config()
ロードマップファイル
プロパティファイルマッピングをロードする方法はありません、あなたが設定することで、マップファイルを読み込むことができます
configuration.addResource("映射文件的全路径");
XMLは、構成ファイル内に直接設定することができます。
SessionFactoryの
SessionFactoryのインタフェースは、Hibernateを初期化するための責任がある、とSessionオブジェクトを作成するための責任があります。軽量ではないのSessionFactoryは、通常の状況下では、そのせいで注意プロジェクトは通常のみのSessionFactoryが必要で十分です。必要性は、複数のデータベースを操作するときは、それぞれのSessionFactoryは、データベースを指定することができます。SessionFactoryの
内部接続プールHibernateとHibernateのセカンドレベルキャッシュのメンテナンス、ちょうどライン上で作成するプロジェクト、接続プールがあるため、通常は接続プールを作成することができ。
hiberante5.0は内部接続プールが付属した後、我々は、サードパーティの接続プールを使用して、追加の設定を必要とする場合、C3P0以下は構成例(より良いC3P0サポートのため休止すべきである)です。まず、我々はジャーパッケージのjarパッケージは、オプションで休止中のlibディレクトリ内にC3P0を持ってインポートする必要があります。hibernate.cfg.xmlの中の構成が続きます。
<!--配置c3p0-->
<property name="connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,
如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
私たちは、クラスのそれを抽出するための特殊な工具が必要になりますので、我々は限りSessionFactoryのように、一般的に、上記のプロジェクトを言ったので:
public class HibernateUtil {
public static final SessionFactory sessionFactory;
static {
//1.加载配置文件 hibernate.cfg.xml
Configuration configure = new Configuration().configure();
//2.创建sessionFactory 相当于jdbc的连接池
sessionFactory = configure.buildSessionFactory();
}
public static Session openSession(){
//3.获取session连接对象 相当于jdbc中的连接对象
Session session = sessionFactory.openSession();
return session;
}
}
セッション
オブジェクトの代表者は、作業の条件を変更して再検索に追加および削除してデータベースを完了するために介してデータベース・ブリッジと相互作用し、セッションがデータベースに接続され、休止状態
セッションを使用してCRUDは非常に簡単でした。
方法 | コード | 説明 |
---|---|---|
保存方法 | 保存(オブジェクトobj) | |
クエリメソッド | (T.class、ID)を取得 負荷(T.class、ID) |
GET(上記ID上記T.class) 2.クエリが実際のオブジェクト自体を返した後 3.指定されたIDへのクエリが存在しない、ヌル戻り 荷重(T.class、ID) 1つのクエリが後に戻りますプロキシオブジェクト、サードパーティ製のプロキシメカニズムを使用し、javassist.jar 例外レポートへの直接2.クエリなしの結果 |
修正 | 空アップデート(オブジェクトobj) | 他のフィールドを指定しない場合は、直接変更するオブジェクトを作成し、他のフィールドはnullに設定されます。 推奨最初のレコードを変更してから、チェックアウト後のオブジェクトを変更するには |
[削除] | 空の削除(オブジェクトobj) | 直接カスケード削除をサポートしていません、削除されたオブジェクトを作成 、削除サポートカスケードし、次のクエリ候補を削除します |
保存または更新 | 無効するsaveOrUpdate(オブジェクトobj) | IDが設定されていない、操作が保存されている セットidは動作の変形例であるidが設定されていない場合、それはエラーになります |
すべてのお問い合わせ | クエリのクエリ= session.createQuery( "お客様から"); リスト |
使用HQL方法 HQL:オブジェクト指向のHibernateクエリ言語クエリ言語 |
デモ:
public class HibernateTest {
@Test
public void testSave(){
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("thinmoon111");
customer.setCust_level("3");
session.save(customer);
transaction.commit();
session.close();
}
@Test
public void testDelete(){
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = session.get(Customer.class, 1L);
System.out.println(customer);
session.delete(customer);
transaction.commit();
session.close();
}
@Test
public void testUpdate(){
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = session.get(Customer.class, 2L);
System.out.println(customer);
customer.setCust_level("10");
session.update(customer);
transaction.commit();
session.close();
}
@Test
public void testHQL(){
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("from com.thinmoon.domain.Customer");
List<Customer> list = query.list();
for (Customer c: list) {
System.out.println(c);
}
transaction.commit();
session.close();
}
}
誘導
プロフィールhibernate.cfg.xmlの
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 连接数据库的基本参数 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate?useSSL=false&serverTimezone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">15160673718wen</property>
<!-- 配置Hibernate的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
<!-- 打印SQL -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL -->
<property name="hibernate.format_sql">true</property>
<!-- 自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--配置c3p0-->
<property name="connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,
如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
<!--添加映射文件-->
<mapping resource="com/thinmoon/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>