Hibernate 第一天筆記java
* javaEE企業級開發分層 表現層 業務層 持久層mysql
表現層:struts2spring
業務層:springsql
持久層:hibernate----操做數據庫數據庫
* hibernate框架稱爲ORM(Object Relational Mapping)框架apache
流行的數據庫框架api
JPA Java Persistence API.JPA經過JDK 5.0註解或XML描述對象-關係表的映射關係(只有接口規範)緩存
Hibernate 最流行ORM框架,經過對新-關係映射配置,能夠徹底脫離底層SQL,對JPA的一個具體實現session
MyBatis 本是apache的一個開源項目 iBatis,支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架app
Apache DBUtils 、Spring JDBCTemplate
* 官網:http://sourceforge.net/projects/hibernate/files/hibernate3
* 解壓hibernate壓縮文件
documentation:文檔目錄
lib:jar包目錄(依賴包)
project:源碼包
hibernate3.jar:框架核心jar
* log4j記錄日誌的級別
fatal:致命錯誤> error:普通錯誤 > warn:警告 > info:普通訊息 > debug:調試信息 > trace:堆棧信息
* hibernate 入門案例
1)建立java項目
2)導入jar(11個)
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate3.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
log4j-1.2.16.jar
mysql-connector-java-5.0.8-bin.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.7.2.jar
3)建立一個數據庫和表
create database hibernate_day1 default character set utf8;
create table user(id int primary key auto_increment ,name varchar(32),int age);
4)對應user表建立一個實體類
5)在config下提供一個hibernate 核心配置文件hibernate.cfg.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>
<!-- 配置hibernate框架的會話工廠 -->
<session-factory>
<!-- 數據庫方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 描述jdbc基本鏈接參數 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_day1</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 在控制檯顯式sql -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 註冊hbm映射文件 -->
<mapping resource="cn/itcast/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
6)提供hbm映射文件:User.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>
<!-- 描述User類對應user表 -->
<class name="cn.itcast.domain.User" table="user">
<!-- id屬性對應id字段 -->
<id name="id" column="id">
<!-- 主鍵生成策略 -->
<generator class="native"></generator>
</id>
<property name="name" column="name"/>
<property name="age" column="age"/>
</class>
</hibernate-mapping>
7)將hbm映射文件註冊到核心配置文件中
8)經過hibernate提供的API完成對數據庫操做
//讀取hibernate核心配置文件,獲取配置對象
Configuration conf = new Configuration().configure();
//經過配置對象構建一個會話工廠對象
SessionFactory factory = conf.buildSessionFactory();
//從工廠中獲取一個會話對象
Session session = factory.openSession();
User user = new User();
user.setName("test");
user.setAge(30);
//開啓事務
Transaction tx = session.beginTransaction();
session.save(user);
//提交事務
tx.commit();
session.close();
* Hibernate經常使用操做
1)保存數據save
2)根據主鍵查詢數據
get---當即加載
load---延遲加載
3)根據主鍵修改數據update
session.update(user);//user對象能夠本身構造,也能夠先查詢,再修改
4)根據主鍵刪除數據delete
session.delete(user);//user對象能夠本身構造,也能夠先查詢,再刪除
5)查詢全部
String hql = "from User";
Query query = session.createQuery(hql);
List<User> userList = query.list();
*hibernate屬性
hibernate.dialect 操做數據庫方言
hibernate.connection.driver_class 鏈接數據庫驅動程序
hibernate.connection.url 鏈接數據庫URL
hibernate.connection.username 數據庫用戶名
hibernate.connection.password 數據庫密碼
hibernate.show_sql true 在控制檯上輸出SQL語句
hibernate.format_sql true 格式化控制檯輸出的SQL語句
hibernate.hbm2ddl.auto create/create-drop/update/validate DDL策略
hibernate.connection.autocommit true 事務是否自動提交
* hibernate中的API
1)Configuration
負責管理 Hibernate 的配置信息,包括以下內容:
加載 hibernate.properties 和 hibernate.cfg.xml
持久化類與數據表的映射關係(*.hbm.xml 文件)
2)SessionFactory
Configuration對象根據當前的配置信息生成 SessionFactory對象
3)Session---會話對象
包裝的是數據庫鏈接信息Connection
session與一級緩存相關
4)Transaction
commit():提交相關聯的session實例
rollback():撤銷事務操做
wasCommitted():檢查事務是否提交
5)Query(分頁)
Query query = session.createQuery(hql);
query.setFirstResult(5);//從哪開始查詢
query.setMaxResults(5);//查詢多少數據
6)Criteria---條件查詢對象
Criteria cri = session.createCriteria(User.class);
cri.add(Restrictions.ilike("name", "test"));//添加查詢條件
cri.add(Restrictions.ge("age", 20));//查詢age大於20
cri.addOrder(Order.asc("name"));//添加排序
List<User> userList = cri.list();
* 理解Hibernate中持久化類:POJO + 有一個hbm文件描述這個類和表的對應關係
* 編寫規則
提供一個無參數 public訪問控制符的構造器
提供一個標識屬性,映射數據表主鍵字段
全部屬性提供public訪問控制符的 set get 方法
標識屬性應儘可能使用基本數據類型的包裝類型
不要用final修飾 (將沒法生成代理對象進行優化)
* 區分天然主鍵和代理主鍵
天然主鍵:具備業務含有的主鍵
代理主鍵:不具備業務含有的主鍵(建議使用代理主鍵)
* 主鍵生成策略
1)increment:自增,由hibernate框架發出SQL查詢最大的id(SELECT max(id) FROM Table),有線程問題
2)identity:使用數據庫的自增策略,mysql,DB2可使用,Oracle不能使用
3)sequence:使用數據庫的序列完成自增,DB2,Oracle可使用,mysql不能使用
4)native:本地策略,根據客戶端使用的數據庫,選擇使用identity,sequence(通常使用這個就能夠了)
5)uuid:由hibernate框架負責生成32位字符串(使用uuid作爲主鍵有一個好處就是在數據遷移時不會影響到遷移到的數據庫中的已有數據)
6)assigned:手動委派