標籤:欄位 不一致 rac word doc dtd ges star url
hibernate: 持久層的架構!
是一個開放原始碼的對象關係映射架構(ORM)!之前我們訪問資料庫使用JDBC!
對JDBC進行了輕量級的對象封裝!是一個全自動ORM架構!(底層可以自動產生sql語句)!
使用物件導向的思想來操作資料庫!
建立一個java項目
引入需要的hibernate需要的jar包以及串連資料庫需要的驅動包
把jar包放入項目中並引用
建立對應的學生類
/** * 學生的實體類 */public class Student { private Integer id; private Integer age; private String name;// 和資料庫中不一致 (sname) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student(Integer id, Integer age, String name) { super(); this.id = id; this.age = age; this.name = name; } public Student() { super(); } @Override public String toString() { return "Student [id=" + id + ", age=" + age + ", name=" + name + "]"; }}
建立對應的資料庫中的學生表
找到對應mapping對應檔,放在和實體類相同的包下!並修改其中的內容
修改Student.hbm.xml檔案之後的內容
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- 對應檔 M 目的;實體類和 資料庫中的表 產生關係 package:是說明我們需要映射的實體類的包名class name:對應的是實體類的名稱(如果省略了package屬性,必須書寫全類名)property,id name:對應的是實體類中的屬性名稱,如果和資料庫中的欄位一致,則可以省略column --><hibernate-mapping package="cn.bdqn.bean"> <class name="Student" table="stu"> <id name="id"> <!--主鍵建置原則 assigned:主鍵的產生值完全由使用者決定,與底層資料庫無關。 在調用session.save()之前必須指定主索引值,否則會拋出異常! --> <generator class="assigned"/> </id> <!--配置其他屬性的映射 --> <property name="age"/> <property name="name" column="sname"/> </class></hibernate-mapping>
找到hibernate核心的設定檔並修改內容
修改後的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="connection.url"> jdbc:oracle:thin:@localhost:1521:orcl </property> <property name="connection.username">t10</property> <property name="connection.password">t10</property> <property name="connection.driver_class"> oracle.jdbc.OracleDriver </property> <!--方言 --> <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <!--是否顯示底層產生的sql語句 --> <property name="show_sql">true</property> <!--格式化產生的sql語句 --> <property name="format_sql">true</property> <!--載入我們配置的對應檔 全路徑 --> <mapping resource="cn/bdqn/bean/Student.hbm.xml" /></session-factory></hibernate-configuration>
建立對應的測試類別
package cn.bdqn.test;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Test;import cn.bdqn.bean.Student;/** * * @author 小豆腐 * 以後的你,會感謝現在努力的自己!努力!堅持!不放棄! * * hibernate核心的 * 1個類 * 01. 類 Configuration !對核心設定檔的讀取! * 5個介面 * 01. SessionFactory:負責初始化hibernate需要的參數!在程式中有一個就夠了!之後我們會寫成單例模式! * 02. Session:不是我們的HttpSession(使用者session)! 我們hibernate的session * 是用來操作對象(增刪改查)!建立事務的對象!我們現在使用的session不是安全執行緒的! * 03. Transaction :進行事務的操作! * 04. Query :hibernate中查詢的介面(sql , hql) * 05. Criteria :和Query相似!但是做了一些封裝! */public class StudentTest { // 新增學生資訊 @Test public void addStudent() { /** * 01.讀取核心設定檔 因為我們需要的資訊都在這個核心設定檔中(串連資料庫的四要素,對應檔) * configure()底層預設去src下面查詢了hibernate.cfg.xml檔案 */ Configuration configuration = new Configuration().configure(); // 02.建立sessionFactory SessionFactory sessionFactory = configuration.buildSessionFactory(); // 03.開啟session Session session = sessionFactory.openSession(); // 04.開啟事務 Transaction transaction = session.beginTransaction(); // 05.建立一個Student對象 Student student = new Student(400, 50, "小黃"); // 06.持久化操作 session.save(student); // 07.提交事務 的 會產生sql語句 transaction.commit(); // 08.關閉session session.close(); } // 新增學生資訊 @Test public void addStudent2() { /** * 01.讀取核心設定檔 因為我們需要的資訊都在這個核心設定檔中(串連資料庫的四要素,對應檔) * configure()底層預設去src下面查詢了hibernate.cfg.xml檔案 */ Configuration configuration = new Configuration().configure(); // 02.建立sessionFactory SessionFactory sessionFactory = configuration.buildSessionFactory(); // 03.開啟session Session session = sessionFactory.openSession(); // 04.開啟事務 Transaction transaction = session.beginTransaction(); // 05.建立一個Student對象 Student student1 = new Student(50, 50, "小黃2"); session.save(student1); Student student2 = new Student(60, 50, "小黃2"); session.save(student2); Student student3 = new Student(7, "小黃2"); // 沒有手動的給主鍵賦值,會拋出異常 session.save(student3); /** * 07.提交事務 * student1 和student2 沒有問題 * 但是student3 報錯了 * 那麼事務還會提交嗎? 不會! ACID
一致性: 原子性: 隔離性: 永久性:
* * 如果說 每個save()都會產生sql語句,與資料庫產生互動! 這樣資料庫的壓力大! * 怎麼減輕? * 在commit()的時候,把之前的sql語句一起發送給資料庫執行! */ transaction.commit(); // 08.關閉session session.close(); }}
hbm2ddl:屬性值
<!--是否顯示底層產生的sql語句 --> <property name="show_sql">true</property> <!--格式化產生的sql語句 --> <property name="format_sql">true</property> <!-- hbm2ddl 01.create:每次運行都會刪除上次產生的表! 02.update:沒有表會自動建立,如果有,新增資料! 欄位不一致,會按照hbm.xml檔案中的column屬性值 ,在資料庫中新增一列 03.validate:不會自動建立表,如果表存在,會新增資料! 欄位不一致,會拋出異常,說在資料庫中沒有該欄位 04.create-drop: 每次運行都會刪除上次產生的表!sessionFactory關閉的時候,資料庫中的表也會刪除! --> <property name="hbm2ddl.auto">update</property>
小結
hibernate: 持久層的架構!是一個開放原始碼的對象關係映射架構(OMR)!之前我們訪問資料庫使用JDBC!對JDBC進行了輕量級的對象封裝!是一個全自動ORM架構!(底層可以自動產生sql語句)!使用物件導向的思想來操作資料庫!Student 實體類Student.hbm.xml mapping(對應檔)hibernate.cfg.xml:是整個hibernate架構的核心設定檔!01.管理mapping檔案02.整個hibernate環境的配置03.串連資料庫的四要素sql的四種語言:DDL:資料定義語言 (Data Definition Language)create alter drop truncateDML: 資料操作語言select insert update delete DCL: 資料控制語言grant revokeTCL: 事務控制語言savepoint rollback <!-- hbm2ddl 01.create:每次運行都會刪除上次產生的表! 02.update:沒有表會自動建立,如果有,新增資料! 欄位不一致,會按照hbm.xml檔案中的column屬性值 ,在資料庫中新增一列 03.validate:不會自動建立表,如果表存在,會新增資料! 欄位不一致,會拋出異常,說在資料庫中沒有該欄位 04.create-drop:每次運行都會刪除上次產生的表! 當sessionFactory關閉的時候,資料庫中的表自動刪除 --> <property name="hbm2ddl.auto">update</property>oracle資料庫建立序列create sequence sq_student_idminvalue 1maxvalue 9999999999start with 10incrment by 1cache 20; <id name="id"> <!--主鍵建置原則 01.assigned: 主鍵產生的值由使用者決定,與底層資料庫沒有關係! 在調用session.save()之前,必須給主鍵賦值,否則會拋出異常! 02.sequence: oracle支援的主鍵建置原則!hibernate會從資料庫中取得當前的序列下一個值賦值給主鍵! 不需要我們給主鍵賦值! <generator class="sequence"> <param name="sequence">sq_student_id</param> </generator> 03.identity :針對mysql資料庫的主鍵自增 04.increment:預設會在資料庫中查詢對應表中主鍵的最大值,(select max(id) from stu) 之後把值給主鍵! --> <generator class="increment"/> </id>
hibernate02環境的搭建