Hibernate_day01
生活随笔
收集整理的這篇文章主要介紹了
Hibernate_day01
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天任務
1. 使用Hibernate框架完成對客戶的增刪改查的操作教學導航
1. 能夠說出Hibernate的執行流程 2. 能夠獨立使用Hibernate框架完成增刪改查的操作框架和CRM項目的整體介紹
1. 什么是CRM* CRM(Customer Relationship Management)客戶關系管理,是利用相應的信息技術以及互聯網技術來協調企業與顧客間在銷售、營銷和服務上的交互,向客戶提供創新式的個性化的客戶交互和服務的過程* 其最終目標是將面向客戶的各項信息和活動集成起來,組建一個以客戶為中心的企業,實現對面向客戶的活動的全面管理2. CRM的模塊* CRM系統實現了對企業銷售、營銷、服務等各階段的客戶信息、客戶活動進行統一管理。* CRM系統功能涵蓋企業銷售、營銷、用戶服務等各各業務流程,業務流程中與客戶相關活動都會在CRM系統統一管理。* 下邊列出一些基本的功能模塊,包括:* 客戶信息管理* 聯系人管理* 商機管理* 統計分析等 3. 模塊的具體功能* 客戶信息管理* 對客戶信息統一維護,客戶是指存量客戶或擬營銷的客戶,通過員工錄入形成公司的“客戶庫”是公司最重要的數據資源。* 聯系人管理* 對客戶的聯系人信息統一管理,聯系人是指客戶企業的聯系人,即企業的業務人員和客戶的哪些人在打交道。* 客戶拜訪管理* 業務員要開發客戶需要去拜訪客戶,客戶拜訪信息記錄了業務員與客戶溝通交流方面的不足、采取的策略不當、有待改進的地方或值得分享的溝通技巧等方面的信息。* 綜合查詢* 客戶相關信息查詢,包括:客戶信息查詢、聯系人信息查詢、商機信息查詢等* 統計分析* 按分類統計客戶信息,包括:客戶信息來源統計、按行業統計客戶、客戶發展數量統計等* 系統管理系統管理屬于crm系統基礎功能模塊,包括:數據字典、賬戶管理、角色管理、權限管理、操作日志管理等Hibernate框架的學習路線
1. 注意:Hibernate框架知識點非常多,比較雜亂,大家要做好筆記記錄的工作 2. 學習的路線* 第一天:主要是學習框架的入門,自己搭建框架,完成增刪改查的操作* 第二天:主要學習一級緩存、事務管理和基本的查詢* 第三天:主要學習一對多和多對多的操作等* 第四天:基本查詢和查詢的優化*( redis替代Hibernate二級緩存,所以現在不學二級緩存了,緩存技術都被redis替代了)案例一:完成客戶的CRUD的操作
需求分析
1. CRM系統中客戶信息管理模塊功能包括* 新增客戶信息* 客戶信息查詢* 修改客戶信息* 刪除客戶信息2. 要實現客戶的新增功能技術分析之Hibernate框架的概述
Hibernate框架的概述
1. Hibernate框架的概述* Hibernate稱為* Hibernate是一個開放源代碼的對象關系映射(ORM)框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 * Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用。* Hibernate是輕量級JavaEE應用的持久層解決方案,是一個關系數據庫ORM框架2. 記住:Hibernate是一個持久層的ORM框架!!!什么是ORM(對象關系映射)
1. ORM映射:Object Relational Mapping* O:面向對象領域的Object(JavaBean對象)* R:關系數據庫領域的Relational(表的結構)* M:映射Mapping(XML的配置文件)2. 簡單一句話:Hibernate使程序員通過操作對象的方式來操作數據庫表記錄Hibernate優點
1. 優點* Hibernate對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼* Hibernate是一個基于jdbc的主流持久化框架,是一個優秀的orm實現,它很大程度的簡化了dao層編碼工作* Hibernate的性能非常好,因為它是一個輕量級框架。映射的靈活性很出色。它支持很多關系型數據庫,從一對一到多對多的各種復雜關系技術分析之Hibernate框架的快速入門
第一步:下載Hibernate5的運行環境
1. 下載相應的jar包等* http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download 2. 解壓后對目錄結構有一定的了解目錄結構
第二步:創建表結構
1. 建表語句如下Create database hibernate_day01;Use hibernate_day01;CREATE TABLE `cst_customer` (`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',`cust_name` varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',`cust_user_id` bigint(32) DEFAULT NULL COMMENT '負責人id',`cust_create_id` bigint(32) DEFAULT NULL COMMENT '創建人id',`cust_source` varchar(32) DEFAULT NULL COMMENT '客戶信息來源',`cust_industry` varchar(32) DEFAULT NULL COMMENT '客戶所屬行業',`cust_level` varchar(32) DEFAULT NULL COMMENT '客戶級別',`cust_linkman` varchar(64) DEFAULT NULL COMMENT '聯系人',`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定電話',`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移動電話',PRIMARY KEY (`cust_id`)) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;操作步驟
mysql -uroot -p1111 show databases; drop database hibernate_day01;-- 如果已經有了就刪除 復制上面代碼 已經切換數據庫了 show tables;desc cst_customer;命令行下可能中文亂碼解決方式1:每次登陸都執行一次:set character_set_client=gb2312; set character_set_connection=gb2312; set character_set_results=gb2312; 解決方式2: 直接修改配置文件,永久生效:default-character-set=gbk (utf-8改為gbk)第三步:搭建Hibernate的開發環境
1. 創建WEB工程,引入Hibernate開發所需要的jar包* MySQL的驅動jar包 * Hibernate開發需要的jar包(/hibernate...Final/lib/required/所有jar包.其中dom4j.jar 解析xml文檔) ) * 日志jar包(資料/jar包/log4j/所有jar包) (任何框架都有日志)導完后所有jar包
第四步:編寫JavaBean實體類
1. Customer類的代碼如下:public class Customer {private Long cust_id;private String cust_name;private Long cust_user_id;private Long cust_create_id;private String cust_source;private String cust_industry;private String cust_level;private String cust_linkman;private String cust_phone;private String cust_mobile;// 省略get和set方法}第五步:創建類與表結構的映射
1. 在JavaBean所在的包下創建映射的配置文件* 默認的命名規則為:實體類名.hbm.xml* 在xml配置文件中引入約束(引入的是hibernate3.0的dtd約束,不要引入4的約束)* (約束的好處,限制你只能寫約束規定的那些標簽,其他的不能寫,且有代碼提示了 以后就復制粘貼下面這個了 )<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">2. 如果不能上網,編寫配置文件是沒有提示的,需要自己來配置 (資料dtd文件夾下的文件作用)* 先復制http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd --> window --> preferences -->* 搜索xml --> 選擇xml catalog --> 選中User Specified Entries-->點擊add --> Key Type選URI --> * 粘貼復制的地址(上面的地址,即:http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd) -->* 選擇location,選擇本地的DTD的路徑3. 編寫映射的配置文件<?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.itheima.domain.Customer" table="cst_customer"><id name="cust_id" column="cust_id"><generator class="native"/></id><property name="cust_name" column="cust_name"/><property name="cust_user_id" column="cust_user_id"/><property name="cust_create_id" column="cust_create_id"/><property name="cust_source" column="cust_source"/><property name="cust_industry" column="cust_industry"/><property name="cust_level" column="cust_level"/><property name="cust_linkman" column="cust_linkman"/><property name="cust_phone" column="cust_phone"/><property name="cust_mobile" column="cust_mobile"/></class></hibernate-mapping>自己寫的注釋版本
<?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><!-- 配置類和表結構的映射 --><!-- name:類的全限定名 table:數據庫中定義的表名 --><class name="com.itheima.domain.Customer" table="cst_customer"><!-- 配置id見到name屬性,JavaBean屬性見到column屬性,是表的結構字段--><!-- 下面一行便將Customer類的cust_id屬性和表cst_customer的字段建立關聯了,于是對框架來說,類屬性名和表字段名不必完全一樣,這里配置對應了就行了 但基礎部分的DButils就失效了--><id name="cust_id" column="cust_id"><!-- 主鍵生成策略 native表示自動遞增 --><generator class="native"/></id><!-- 上面配置的是主鍵 主鍵很重要 單獨配置 其他屬性也要一個個單獨配置 以后有表結構就能自動生成配置文件,不用這么麻煩了 (以后甚至增刪改查代碼都能自動生成了) --><!-- 配置其他屬性 --><property name="cust_name" column="cust_name"/><property name="cust_user_id" column="cust_user_id"/><property name="cust_create_id" column="cust_create_id"/><property name="cust_source" column="cust_source"/><property name="cust_industry" column="cust_industry"/><property name="cust_level" column="cust_level"/><property name="cust_linkman" column="cust_linkman"/><property name="cust_phone" column="cust_phone"/><property name="cust_mobile" column="cust_mobile"/></class></hibernate-mapping>第六步:編寫Hibernate核心的配置文件
1. 在src目錄下,創建名稱為hibernate.cfg.xml的配置文件(寫一個就行了,且名稱路徑都定死了) 2. 在XML中引入DTD約束<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">3. 打開:資料/hibernate-release-5.0.7.Final/project/etc/hibernate.properties,可以查看具體的配置信息 * 必須配置的4大參數 #hibernate.connection.driver_class com.mysql.jdbc.Driver#hibernate.connection.url jdbc:mysql:///test#hibernate.connection.username gavin#hibernate.connection.password* 數據庫的方言(必須配置的)#hibernate.dialect org.hibernate.dialect.MySQLDialect* 可選的配置#hibernate.show_sql true#hibernate.format_sql true#hibernate.hbm2ddl.auto update* 引入映射配置文件(一定要注意,要引入自己寫的映射文件,框架需要加載映射文件)* <mapping resource="com/itheima/domain/Customer.hbm.xml"/> 4. 具體的配置如下<?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_day01</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">root</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><mapping resource="com/itheima/domain/Customer.hbm.xml"/></session-factory></hibernate-configuration>自己寫的注釋版本
<?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><!-- 記住:先配置SessionFactory標簽,一個數據庫對應一個SessionFactory標簽 --><session-factory><!-- 必須配置的參數有5個:4大參數(驅動,數據庫,用戶名,密碼)+數據庫的方言 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">1111</property><!-- 數據庫的方言 mysql獨有的語法 告訴hibernate 它會幫你實現底層代碼--><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 可選配置 --><!-- 暫時不寫 --><!-- 映射配置文件,需要引入映射的配置文件 --><!-- 注意1:中間是/不是. 2.復制全限定名后要刪去前面的,從包名com開始 --><mapping resource="com/itheima/domain/Customer.hbm.xml"/></session-factory> </hibernate-configuration>第七步:編寫Hibernate入門代碼
1. 具體的代碼如下/*** 測試保存客戶*/@Testpublic void testSave(){// 先加載配置文件Configuration config = new Configuration();// 默認加載src目錄下的配置文件config.configure();// 創建SessionFactory對象SessionFactory factory = config.buildSessionFactory();// 創建session對象Session session = factory.openSession();// 開啟事務Transaction tr = session.beginTransaction();// 編寫保存代碼Customer c = new Customer();// c.setCust_id(cust_id); 已經自動遞增c.setCust_name("測試名稱");c.setCust_mobile("110");// 保存客戶session.save(c);// 提交事務tr.commit();// 釋放資源session.close();factory.close();}自己寫的注釋版本:
package com.itheima.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; import com.itheima.domain.Customer;/*** 測試hibernate框架* @author Administrator**/ public class Demo1 {/*** 測試保存客戶*/@Testpublic void testSave(){/*** 1.先加載配置文件* 2.創建SessionFactory對象(工廠就是來生成對象的),生成Session對象 (不是HttpServlet 是Hibernate的會話機制)* 3.創建Session對象* 4.開啟事務* 5.編寫保存的代碼* 6.提交事務* 7.釋放資源*///1.先加載配置文件Configuration config=new Configuration();//下面configure方法默認加載 src目錄下的hibernate.cfg.xml配置文件config.configure();//屬性配置文件不需要本行 可惜屬性配置文件不能引入自己寫的那個映射 //2.創建SessionFactory對象SessionFactory factory = config.buildSessionFactory();//3.創建session 現在可以用強大的session來處理數據庫了 session對象又稱持久化對象Session session = factory.openSession();//4.開啟事務Transaction tr = session.beginTransaction();//5.編寫保存的代碼Customer c = new Customer();//c.setCust_id(cust_id);//不要設置,主鍵自動遞增c.setCust_name("測試");c.setCust_level("2");c.setCust_phone("110");//保存數據 Hibernate核心說。。操作對象就是操作數據庫 映射寫好配置好了后,就直接操作對象就行了session.save(c);//一行代碼搞定保存 。。。可怕!!太強了!!!!//6.提交事務tr.commit();//7.釋放資源 以后就不釋放了session.close();factory.close(); } }一運行竟然成功:
回憶:快速入門
1. 下載Hibernate框架的開發包 2. 編寫數據庫和表結構 3. 創建WEB的項目,導入了開發的jar包* MySQL驅動包、Hibernate開發的必須要有的jar包、日志的jar包 4. 編寫JavaBean,以后不使用基本數據類型,使用包裝類 5. 編寫映射的配置文件(核心),先導入開發的約束,里面正常配置標簽 6. 編寫hibernate的核心的配置文件,里面的內容是固定的 7. 編寫代碼,使用的類和方法技術分析之:Hibernate常用的配置文件
Hibernate配置文件之映射配置文件
1. 映射文件,即Stu.hbm.xml的配置文件* <class>標簽 -- 用來將類與數據庫表建立映射關系* name -- 類的全路徑* table -- 表名.(類名與表名一致,那么table屬性也可以省略)* catalog -- 數據庫的名稱,基本上都會省略不寫* <id>標簽 -- 用來將類中的屬性與表中的主鍵建立映射,id標簽就是用來配置主鍵的。* name -- 類中屬性名* column -- 表中的字段名.(如果類中的屬性名與表中的字段名一致,那么column可以省略.)* length -- 字段的程度,如果數據庫已經創建好了,那么length可以不寫。如果沒有創建好,生成表結構時,length最好指定(指定了,強大的hibernate會幫你生成表結構)。* <property> -- 用來將類中的普通屬性與表中的字段建立映射.* name -- 類中屬性名* column -- 表中的字段名.(如果類中的屬性名與表中的字段名一致,那么column可以省略.)* length -- 數據長度* type -- 數據類型(一般都不需要編寫,如果寫需要按著規則來編寫)* Hibernate的數據類型 type="string"* Java的數據類型 type="java.lang.String"* 數據庫字段的數據類型 <column name="name" sql-type="varchar"/>Hibernate配置文件之核心配置文件
1. 核心配置文件的兩種方式* 第一種方式是屬性文件的形式,即properties的配置文件* hibernate.properties* hibernate.connection.driver_class=com.mysql.jdbc.Driver* 缺點* 不能加載映射的配置文件,需要手動編寫代碼去加載* 第二種方式是XML文件的形式,開發基本都會選擇這種方式* hibernate.cfg.xml* <property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>* 優點* 格式比較清晰* 編寫有提示* 可以在該配置文件中加載映射的配置文件(最主要的)2. 關于hibernate.cfg.xml的配置文件方式* 必須有的配置* 數據庫連接信息:hibernate.connection.driver_class -- 連接數據庫驅動程序hibernate.connection.url -- 連接數據庫URLhibernate.connection.username -- 數據庫用戶名hibernate.connection.password -- 數據庫密碼* 方言:hibernate.dialect -- 操作數據庫方言* 可選的配置* hibernate.show_sql -- 運行時在控制臺打印SQL語句* hibernate.format_sql -- 格式化sql語句 控制臺打印時好看一點* hibernate.hbm2ddl.auto -- 通過映射轉成DDL(數據定義語言)語句 (數據庫中提前沒有表,通過生成create語句自動為你創建表)* create -- 每次都會創建一個新的表.---測試的時候用 實際開發不可能用 每次都清空啊* create-drop -- 每次都會創建一個新的表,當執行結束之后,將創建的這個表刪除.---測試的時候* update -- 如果有表,使用原來的表.沒有表,創建一個新的表.同時更新表結構(eg:javaBean中臨時加一個屬性,(配置文件也多一條映射)表中也多一個字段,原來的數據不會丟失 然而刪掉屬性不會幫你刪數據庫的字段).* validate -- 如果有表,使用原來的表.同時校驗**映射文件與表中字段**是否一致如果不一致就會報錯. 項目上線時可以改成validate* 加載映射* 如果XML方式:<mapping resource="cn/itcast/hibernate/domain/User.hbm.xml" />新增代碼:
<!-- 可選配置 --><!-- 在控制臺打印sql語句 --><property name="hibernate.show_sql">true</property><!-- 格式化sql語句 控制臺打印時好看一點 --><property name="hibernate.format_sql">true</property><!-- 生成數據庫的表結構 之前數據庫沒有建表 幫你自動生成 (把表刪了再測試,確實有create語句打印在控制臺)--><!-- update最好 有添加,沒有創建 --><property name="hibernate.hbm2ddl.auto">update</property><!-- 自動生成得sql語句(先把數據庫中的表刪了)Hibernate: drop table if exists cst_customerHibernate: create table cst_customer (cust_id bigint not null auto_increment,cust_name varchar(255),cust_user_id bigint,cust_create_id bigint,cust_source varchar(255),cust_industry varchar(255),cust_level varchar(255),cust_linkman varchar(255),cust_phone varchar(255),cust_mobile varchar(255),primary key (cust_id))Hibernate: insert intocst_customer(cust_name, cust_user_id, cust_create_id, cust_source, cust_industry, cust_level, cust_linkman, cust_phone, cust_mobile) values(?, ?, ?, ?, ?, ?, ?, ?, ?)-->技術分析之Hibernate常用的接口和類
Configuration類和作用
1. Configuration類* Configuration對象用于配置并且啟動Hibernate。* Hibernate應用通過該對象來獲得對象-關系映射文件中的元數據,以及動態配置Hibernate的屬性,然后創建SessionFactory對象。* 簡單一句話:加載Hibernate的配置文件,可以獲取SessionFactory對象。2. Configuration類的其他應用(了解)* 加載配置文件的種類,Hibernate支持xml和properties類型的配置文件,在開發中基本都使用XML配置文件的方式。* 如果采用的是properties的配置文件,那么通過Configuration configuration = new Configuration();就可以假裝配置文件* 但是需要自己手動加載映射文件* 例如:config.addResource("cn/itcast/domain/Student.hbm.xml");* 如果采用的XML的配置文件,通過Configuration configuration = new Configuration().configure();加載配置文件代碼修改過程
//1.先加載配置文件/*Configuration config=new Configuration();//下面configure方法默認加載 src目錄下的hibernate.cfg.xml配置文件config.configure();//屬性配置文件不需要本行//了解,手動加載映射文件 xml里不再引入<mapping resource="com/itheima/domain/Customer.hbm.xml"/> 那么需要在下面加一行引入代碼//config.addResource("com/itheima/domain/Customer.hbm.xml");*/ //簡寫方式 方法鏈編程Configuration config = new Configuration().configure();SessionFactory:重要
1. 是工廠類,是生成Session對象的工廠類 2. SessionFactory類的特點* 由Configuration通過加載配置文件創建該對象。* SessionFactory對象中保存了當前的數據庫配置信息和所有映射關系以及預定義的SQL語句。同時,SessionFactory還負責維護Hibernate的二級緩存。* 預定義SQL語句* 使用Configuration類創建了SessionFactory對象時,已經在SessionFacotry對象中緩存了一些SQL語句* 常見的SQL語句是增刪改查(通過主鍵來查詢)* 這樣做的目的是效率更高* 一個SessionFactory實例對應一個數據庫,應用從該對象中獲得Session實例。* SessionFactory是線程安全的,意味著它的一個實例可以被應用的多個線程共享。* SessionFactory是重量級的,意味著不能隨意創建或銷毀它的實例。如果只訪問一個數據庫,只需要創建一個SessionFactory實例,且在應用初始化的時候完成。* SessionFactory需要一個較大的緩存,用來存放預定義的SQL語句及實體的映射信息。另外可以配置一個緩存插件,這個插件被稱之為Hibernate的二級緩存,被多線程所共享3. 總結* 一般應用使用一個SessionFactory,最好是應用啟動時就完成初始化。編寫HibernateUtil的工具類
由上面的分析可知:SessionFactory是重量級的,意味著不能隨意創建或銷毀它的實例
因此有必要封裝工具類
編寫完之后,訪問數據庫又簡單了不少
/*** 測試工具類*/@Testpublic void testSave2(){//原來:加載配置文件,獲取Factory對象,獲取session//現在直接用工具類獲取就行了Session session = HibernateUtils.getSession();Transaction tr = session.beginTransaction();Customer c=new Customer();c.setCust_name("崔浩");session.save(c);//提交事務tr.commit();//釋放資源 session肯定要釋放 但是factory就不能釋放了 重量級session.close(); }Session接口
1. 概述* Session是在Hibernate中使用最頻繁的接口。也被稱之為持久化管理器。它提供了和持久化有關的操作,比如添加、修改、刪除、加載和查詢實體對象* Session 是應用程序與數據庫之間交互操作的一個單線程對象,是 Hibernate 運作的中心* Session是線程不安全的(也就是不能寫成成員變量讓好幾個操作共用一個session,這是不行的,極其不安全,每次數據庫請求操作都要創建一個新的session,用完即銷毀)* 所有持久化對象必須在 session 的管理下才可以進行持久化操作* Session 對象有一個一級緩存,顯式執行 flush 之前,所有的持久化操作的數據都緩存在 session 對象處* 持久化類與 Session 關聯起來后就具有了持久化的能力2. 特點* 不是線程安全的。應避免多個線程使用同一個Session實例* Session是輕量級的,它的創建和銷毀不會消耗太多的資源。應為每次客戶請求分配獨立的Session實例* Session有一個緩存,被稱之為Hibernate的一級緩存。每個Session實例都有自己的緩存3. 常用的方法* save(obj)* delete(obj) * get(Class,id) --javabean快速生成toString()重寫方法輸出字段信息,alt+s->s(tostring那個)* update(obj)* saveOrUpdate(obj) -- 保存或者修改(如果沒有數據,保存數據。如果有,修改數據)* createQuery() -- HQL語句的查詢的方式測試代碼:
/*** 測試get()方法* 以后通過主鍵來查就用get方法就ok了* 查詢事務可加可不加*/@Testpublic void testGet(){//原來:加載配置文件,獲取Factory對象,獲取session//現在直接用工具類獲取就行了Session session = HibernateUtils.getSession();Transaction tr = session.beginTransaction();//測試查詢方法 arg0:查詢的javaBean的class對象(底層就可通過反射完全操作本對象了 如:返回數據封存成對象) arg1:主鍵的值(根據主鍵查詢表記錄)Customer c= session.get(Customer.class, 7L);//查詢cust_id為7的成員記錄 寫好后鼠標提示 返回當然是arg0的對象了System.out.println("查詢到的客戶:"+c);//提交事務tr.commit();//釋放資源 session肯定要釋放 但是factory就不能釋放了 重量級session.close(); }/*** 測試delete()方法* 注意:從現在開始,所有的刪除或者修改都要先查詢 再刪改 (我想hibernate框架 輕量級 基本的sql語句早就在緩存中了,查詢肯定超快,不用擔心效率)* 刪改必須加事務(只有查詢可不加)*/@Testpublic void testDel(){//原來:加載配置文件,獲取Factory對象,獲取session//現在直接用工具類獲取就行了Session session = HibernateUtils.getSession();Transaction tr = session.beginTransaction();//測試查詢方法 arg0:查詢的javaBean的class對象(底層就可通過反射完全操作本對象了 如:返回數據封存成對象) arg1:主鍵的值(根據主鍵查詢表記錄)Customer c= session.get(Customer.class, 7L);//查詢cust_id為7的成員記錄 寫好后鼠標提示 返回當然是arg0的對象了System.out.println("查詢到的客戶:"+c);//加這一行刪除就行了(查詢基礎上 一定先查在刪 這是標準做法)session.delete(c);//提交事務tr.commit();//釋放資源 session肯定要釋放 但是factory就不能釋放了 重量級session.close(); }/*** 測試update()方法* 注意:同上 修改要先查詢了 (我想hibernate框架 輕量級 基本的sql語句早就在緩存中了,查詢肯定超快,不用擔心效率)* 刪改必須加事務(只有查詢可不加)*/@Testpublic void testUpdate(){//獲取sessionSession session = HibernateUtils.getSession();//打開事務Transaction tr = session.beginTransaction();Customer c= session.get(Customer.class, 6L);//查詢cust_id為7的成員記錄 寫好后鼠標提示 返回當然是arg0的對象了System.out.println("查詢到的客戶:"+c);//查到后直接設置c的信息c.setCust_name("紫英");c.setCust_level("3");//設置好后直接傳入update即可session.update(c);//提交事務tr.commit();//釋放資源 session.close(); }/*** 添加或修改* 沒有添加 有則修改*/@Testpublic void testSaveOrUpdate(){//獲取sessionSession session = HibernateUtils.getSession();//打開事務Transaction tr = session.beginTransaction();/*Customer c=new Customer();//c.setCust_id(10L); // error 千萬不要自己手動設置id值,id值都由hibernate框架來維護的 (如配置文件中的native遞增 或者隨機字符串)c.setCust_name("hello");//保存或修改session.saveOrUpdate(c);*///實在想修改指定id的用戶數據 先查再改Customer c=session.get(Customer.class, 6L);c.setCust_name("玄霄");session.saveOrUpdate(c);//提交事務tr.commit();//釋放資源 session.close(); }/*** 測試查詢方法* createQuery() -- HQL語句的查詢的方式*/@Testpublic void testSel(){//獲取sessionSession session = HibernateUtils.getSession();//打開事務Transaction tr = session.beginTransaction();//創建查詢接口 (有很多種查詢接口 下面是最簡單一種) Query query=session.createQuery("from Customer");//"from 類名" 就是查詢對應的表 //查詢所有的數據 即:select * from 表名 對應的封裝方法為listList<Customer> list = query.list();//所有記錄當然返回list了//增強for循環輸出整張表所有記錄for (Customer customer : list) {System.out.println(customer);}//提交事務tr.commit();//釋放資源 session.close(); }/*** 測試保存 簡單演示事務*/@Testpublic void testSave3(){Session session=null;Transaction tr= null;try {//獲取sessionsession=HibernateUtils.getSession();tr= session.beginTransaction();//已經打開事務 邊創建,邊打開//執行代碼Customer c=new Customer();c.setCust_name("bob");//保存session.save(c);//提交事務tr.commit(); } catch (Exception e) {//回滾事務tr.rollback();e.printStackTrace();}finally{//釋放資源session.close();}}Transaction接口
1. Transaction是事務的接口 2. 常用的方法* commit() -- 提交事務* rollback() -- 回滾事務3. 特點* Hibernate框架默認情況下事務不自動提交.需要手動提交事務* 如果沒有開啟事務,那么每個Session的操作,都相當于一個獨立的事務開發步驟
1. 準備環境* 在資料/crm/ui/WebRoot下所有的文件,拷貝到工程中* 引入JSTL的標簽庫,JSP頁面會報錯 (Myeclipse內置了jstl 不需要導包了)編寫代碼
客戶列表部分要自己實現別忘了生疏了的代碼:
-
Map<String, String[]> map = request.getParameterMap();
-
BeanUtils.populate(c, map);
復習總結:
總結
以上是生活随笔為你收集整理的Hibernate_day01的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【实验四 循环结构】7-4 sdut-C
- 下一篇: 市场营销学4——市场调研与预测