hibernate之資料庫操作
hibernate是一種ORM(物件/關係資料庫對映)框架,即可以直接通過一個實體物件建立與關係資料庫的直接關係,通過這種框架我們在程式設計的時候可以避免對關係資料庫進行直接操作,而是通過物件例項進行操作,間接地對資料庫進行一系列操作。這一次先記錄實體類與資料庫進行對映,並且完成第一次的對資料庫表的插入操作。
大體的思路分為以下幾個步驟:
(1)匯入hibernate必須要用的jar包,將這些jar包新增到應用的類載入路徑中。
(2)建立實體類,這個類的屬性和表中要生成的列的屬性(名稱和屬性)一致。
(3)建立實體類和關係資料庫的對映,而這種對映的配置就需要通過配置檔案來配置,可以通過的的.properties屬性檔案和XML檔案來進行配置,不過通常通過XML檔案類進行配置。
(4)建立一個執行一系列操作的類,包括執行通過配置檔案與資料庫建立聯絡的操作,執行儲存物件的操作等等。
那麼接下來我將介紹兩種類似的但是又是有點區別的方法:
第一種:
(1)匯入hibernate包:首先再使用hibernate框架之前必須在官網上面下載hibernate的壓縮包,地址為www.hibernate.org,在這個網站中下載最新版的hibernate的壓縮包,我下載的是5.3. 6版本的,進行解壓,然後在這個資料夾的LIB路徑下的所需資料夾下的所有jar包匯入專案中,還有的lib \optional\ C3P0資料夾下的三個包匯入專案中,注意還有一個重要的jar子包:MySQL的mysql-connector-java的包,這個包是建立的java的與的的MySQL資料庫聯絡必須的包,因此也要匯入專案中匯入方法:可以在專案中建立一個資料夾,然後將這些jar包複製到這個資料夾中
這些罐子包為如下圖:
(2)建立一個實體類,這個類的屬性是與資料庫建立聯絡的,因此,類的每一個屬性即為想要建立的資料庫的每一個列名,並且資料型別也是要一致的。然後在這個類中這些屬性都是私有型別的,同時也要為這些屬性建立設定和獲取方法的。
示例如下:
package cn.test.entity; public class User { private int id; private String name; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
以上就是建立的實體類。
(3)配置資料庫對映的檔案。在這個步驟兩種方法就有點區別了,一種是直接在配置檔案中進行實體類與資料庫表中建立一一對應的關係。下面直接上程式碼
第一個配置檔案:hibernate.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 新增dtd約束,程式碼如下 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 首先進行資料庫表和實體類的對映,實體類為USer類,資料庫表為test_one -->
<class name="cn.test.entity.User" table="test_one">
<id name="id" column="id">
<!-- 設定資料庫表id增長策略
native:生成表id就是主鍵自動增長
-->
<generator class="native"></generator>
</id>
<!-- 非主屬性就可以直接通過property屬性來建立對映 -->
<property name="name" column="name"></property>
<property name="password" column="password"></property>
</class>
</hibernate-mapping>
上面這個檔案命名方式沒有什麼要求,這個配置檔案中的程式碼顯而易見,僅僅只是建立了實體類與表,每個屬性和表中的每個列名之間一一對應的關係,並沒有與資料庫的地址,資料庫的使用者名稱和密碼等等資訊。雖然我們的Hibernate的框架可以不用直接對資料庫進行操作,但是Java的的對MySQL的的資料庫必須是要通過JDBC來建立連線後才能進行操作,因此在這裡也是少不了JDBC的那些操作的而這個操作是交給另外一個配置檔案來操作的:.hibernate.cfg.xml的這個檔名是預設的,當在操作類中進行操作的時候,呼叫配置物件的配置方法時,hibernate會自動載入該配置檔案,然後建立實體類與資料庫的對映該配置檔案程式碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<!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.jdbc.Driver</property>
<!-- 這裡的///三個斜槓就代表本地的意思,即代表本地的資料庫 -->
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_one</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 第二步,配置hibernate資訊,這是可選的,即指定一些規則,在建立表的時候會用到 -->
<!-- 輸出底層的SQL語句 -->
<property name="hibernate.show_sql">true</property>
<!-- 擁有一定格式的SQL語句 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate在建立表的時候會自動更新表,若沒有表則新建一個表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 配置資料庫的方言,即適合於指定資料庫的資料操作語言,不同的資料庫有些資料語言是不一樣的 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 第三部分,直接載入已經完成實體類和資料庫對映的配置檔案-->
<mapping resource="cn/test/entity/hibernate.hbm.xml"/>
<!-- 首先進行資料庫表和實體類的對映 -->
</session-factory>
</hibernate-configuration>
(4)第四部分就是建立操作類來進行實際的操作,這裡就直接上程式碼,具體的含義程式碼的註釋中也會有。
package cn.test.Demo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.test.entity.User;
public class hibernateDemo {
public static void main(String []args) throws Exception
{
//第一步 先得載入核心配置檔案,利用Configuration物件來封裝
Configuration configuration=new Configuration();
//這一步就是通過Configuration物件的configure方法來載入配置檔案的,當然這個檔案的路徑是在src包下的,
//當這個方法中沒有引數是預設載入hibernate.cfg.xml檔案,當其中有引數時,如引數為"abc",則載入abc.xml檔案
configuration.configure();
//載入完成後就要通過configuration例項建立SessionFactory例項
SessionFactory sessionFactory=configuration.buildSessionFactory();
//建立Session例項
Session session=sessionFactory.openSession();
//開始事務
Transaction transaction= session.beginTransaction();
//建立訊息物件
User user=new User();
user.setId(1);
user.setName("張三");
user.setPassword("1213213");
//儲存訊息
session.save(user);
//提交事務
transaction.commit();
//關閉session
session.close();
sessionFactory.close();
}
}
這樣直接執行這個程式碼,就可以發現在資料庫中新建了一個表,並且插入了一條資料。
第二種方法:
(1)導包,和第一種一樣
(2)建立實體類,這裡會和第一種不一樣,這裡是通過註解來建立聯絡
package org.crazyit.app.domain;
import javax.persistence.*;
//宣告該類是一個Hibernate的持久化類,持久化的概念會在後面講解
@Entity
//指定該類對映到資料庫的表
@Table(name="news_inf")
public class News
{
//id用於指定該類的標識屬性,即可以唯一標識該物件的物件,在表中就相當於主鍵
@Id
//用於指定主鍵生成的策略,其中stategy屬性指定了主鍵生成策略為IDENTITY策略,也就是採用自動增長的策略
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String title;
private String content;
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return this.id;
}
public void setTitle(String title)
{
this.title = title;
}
public String getTitle()
{
return this.title;
}
public void setContent(String content)
{
this.content = content;
}
public String getContent()
{
return this.content;
}
}
這裡通過主鍵就相當於上面的那個hibernate.hbm.xml的功能,直接在裡面進行了基本的設定。
(3)配置XML檔案,每一部分的程式碼功能都有解釋
<?xml version="1.0" encoding="utf-8"?>
<!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="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定連線資料庫的url,其中hibernate是本應用連線的資料庫名 -->
<property name="connection.url">jdbc:mysql://localhost/hibernate_one?userUnicode=true&characterEncoding=utf-8</property>
<!-- 指定連線資料庫的使用者名稱 -->
<property name="connection.username">root</property>
<!-- 指定連線資料庫的密碼 -->
<property name="connection.password">root</property>
<!-- 指定資料庫方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 根據需要自動建立資料表 -->
<property name="hbm2ddl.auto">update</property><!--①-->
<!-- 顯示Hibernate持久化操作所生成的SQL -->
<property name="show_sql">true</property>
<!-- 將SQL指令碼進行格式化後再輸出 -->
<property name="hibernate.format_sql">true</property>
<!-- 羅列所有持久化類的類名,即我們剛才建立的實體類 -->
<mapping class="org.crazyit.app.domain.News"/>
</session-factory>
</hibernate-configuration>
(4)進行實際的操作,這個類和第一種的一樣,這裡就不在闡述。
所以兩種方法主要還是在實體類裡,第一種是通過配置檔案類配置,第二種是直接在實體類通過註解來實現,兩種方法最終的實現都是一樣的。