Hibernate框架--学习笔记(上):hibernate项目的搭建和常用接口方法、对象的使用
一、什么是Hibernate框架:
1.Hibernate是一個操作數(shù)據(jù)庫的框架,實(shí)現(xiàn)了對JDBC的封裝;
2.Hibernate是一個ORM(對象關(guān)系映射)框架,我們在寫程序時 ,用的是面向?qū)ο蟮姆椒?#xff0c;但是在關(guān)系型數(shù)據(jù)庫里,存的是一條條的數(shù)據(jù),為了用純面向?qū)ο蟮乃枷虢鉀Q問題,所有需要將程序中的對象和數(shù)據(jù)庫的記錄建立起映射關(guān)系,ORM就是這樣的技術(shù),而Hibernate就是這樣一個框架,以操作對象的方式操作數(shù)據(jù)庫。
3.Hibernate簡化了代碼的編寫,原生態(tài)的JDBC需要很多代碼來實(shí)現(xiàn)操作數(shù)據(jù)庫,在這里用Hibernate只需要很少的代碼就可以實(shí)現(xiàn)。
4.使用Hibernate的基本流程是:配置實(shí)現(xiàn)類與數(shù)據(jù)庫表的映射關(guān)系,產(chǎn)生sessionFactory,打開session通道拿到session對象,開啟事務(wù),完成操作,關(guān)閉session。
5.Hibernate屏蔽了數(shù)據(jù)庫的差異,增強(qiáng)了對數(shù)據(jù)庫的可移植性。
6.使用Hibernate時,先要配置hibernate.cfg.xml文件,其中配置數(shù)據(jù)庫連接信息和方言等,還要為每個實(shí)體配置相應(yīng)的hbm.xml文件(Hibernate的映射文件),當(dāng)然,也可以采用注解編程實(shí)現(xiàn)映射關(guān)系,hibernate.cfg.xml文件中需要登記每個hbm.xml文件。
?
二、Hibernate項(xiàng)目的基本搭建:
步驟:
--創(chuàng)建工程,導(dǎo)入依賴;
--創(chuàng)建Hibernate核心配置文件;
--創(chuàng)建持久化類;
--創(chuàng)建對象-關(guān)系映射文件;
--通過Hibernate API編寫訪問數(shù)據(jù)庫的代碼。
?
具體實(shí)現(xiàn):
1、創(chuàng)建一個maven項(xiàng)目,在pom.xml文件中導(dǎo)入hibernate所有相關(guān)的jar包依賴:
為了方便,在這里我直接導(dǎo)入ssh整合項(xiàng)目常用的依賴。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zwp</groupId><artifactId>ssh-test</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><!-- 屬性 --><properties><spring.version>4.2.4.RELEASE</spring.version><hibernate.version>5.0.7.Final</hibernate.version><struts.version>2.3.24</struts.version></properties><!-- 鎖定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 --><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>${struts.version}</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId><version>${struts.version}</version></dependency></dependencies></dependencyManagement><!-- 依賴管理 --><dependencies><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><!-- 導(dǎo)入 struts2 --><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId></dependency><!-- hibernate --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId></dependency><!-- 數(shù)據(jù)庫驅(qū)動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version><scope>runtime</scope></dependency><!-- c3p0 --><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><!-- servlet jsp --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><!-- 日志 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.2</version></dependency><!-- junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency><!-- jstl --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies><build><plugins><!-- 設(shè)置編譯版本為1.8 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!-- 默認(rèn)的tomcat6不支持jdk1.8,訪問頁面時報錯:頁面編譯成.class失敗解決:配置tomcat7插件:mvn命令改為:tomcat7:run --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><url>http://127.0.0.1:8080/manager/text</url><server>tomcat8</server><path>/</path></configuration></plugin></plugins></build> </project>2、創(chuàng)建Hibernate的主配置文件,命名:hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 連接數(shù)據(jù)庫 --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql:///ssh-test</property><property name="connection.username">root</property><property name="connection.password">admin</property><!-- 設(shè)置數(shù)據(jù)庫方言 --><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!-- 輸出底層sql語句 --><property name="hibernate.show_sql">true</property><!-- format輸出的底層sql語句格式 --><property name="hibernate.format_sql">true</property><!-- 自動創(chuàng)建表;update:如果已經(jīng)有表,更新,如果沒有,創(chuàng)建 --><property name="hibernate.hbm2ddl.auto">update</property><!-- 把映射文件放到核心配置文件中 --><mapping resource="com/zwp/domain/User.hbm.xml" /></session-factory> </hibernate-configuration>3、創(chuàng)建持久化類:
//持久化對象: public class User {private int uid;private String username;private String password;private String address;public int getUid() {return uid;}public void setUid(int uid) {this.uid = uid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;} }4、創(chuàng)建對象-關(guān)系映射文件:命名:類名.hbm.xml
并把映射文件放到核心配置文件hibernate.cfg.xml中,在第二步中已經(jīng)寫出來了。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- 創(chuàng)建映射配置文件 --> <hibernate-mapping><!-- 1.配置類和對應(yīng)表 class標(biāo)簽:name屬性:實(shí)體類全路徑;table屬性:數(shù)據(jù)庫表名稱,數(shù)據(jù)庫需要自己建立,如果不建立,會報異常 --><class name="com.zwp.domain.User" table="t_user"><!-- 2.配置實(shí)體類id和表id對應(yīng),hibernate要求實(shí)體類有一個屬性唯一致,hibernate要求表有字段作為唯一值 --><!-- id標(biāo)簽:name屬性:實(shí)體類里面id屬性名稱;column屬性:生成的表字段名稱 --><id name="uid" column="uid"><!-- 設(shè)置uid的增長策略;native:就是生成表id主鍵自動增長,實(shí)體類的主鍵類型是int類型--><generator class="native"></generator> <!-- 設(shè)置uid的增長策略;uuid:就是生成表id隨機(jī)uuid,實(shí)體類的主鍵類型是String類型--><!-- <generator class="uuid"></generator> --></id><!-- 3.配置其他屬性和表字段對應(yīng);name屬性:實(shí)體類屬性名稱;column屬性:生成表字段名稱 --><property name="username" column="username"></property><property name="password" column="password"></property><property name="address" column="address"></property></class> </hibernate-mapping>5、測試:
//Hibernate的測試類 public class HibernateTest {//添加一條數(shù)據(jù)的測試@Testpublic void testAdd(){//第一步:加載hibernate核心配置文件Configuration cfg=new Configuration();cfg.configure();//第二步:建立sessionFactory//讀取hibernate核心配置文件的內(nèi)容,創(chuàng)建sessionFactory//在這個過程中,會根據(jù)映射關(guān)系,在配置數(shù)據(jù)里面把表創(chuàng)建SessionFactory sessionFactory = cfg.buildSessionFactory();//第三步:使用SessionFactory常見session對象Session session = sessionFactory.openSession();//第四步:開啟事務(wù):Transaction tx = session.beginTransaction();//第五步:寫具體的邏輯crud操作://添加功能:User user = new User();user.setUsername("zhangweipeng");user.setPassword("123456");user.setAddress("中國");session.save(user);//第六步:提交事務(wù)tx.commit();//第七步:關(guān)閉資源session.close();sessionFactory.close();} }至此,如果測試成功的話,那么一個簡單的hibernate的項(xiàng)目已經(jīng)搭建完成。
附:項(xiàng)目結(jié)構(gòu):
?
三、常用Hibernate方法的使用:
1、hibernate常用方法:
//Hibernate的測試類 public class HibernateTest {@Testpublic void testAdd(){//第一步:加載hibernate核心配置文件Configuration cfg=new Configuration();cfg.configure();//第二步:建立sessionFactory//讀取hibernate核心配置文件的內(nèi)容,創(chuàng)建sessionFactory//在這個過程中,會根據(jù)映射關(guān)系,在配置數(shù)據(jù)里面把表創(chuàng)建SessionFactory sessionFactory = cfg.buildSessionFactory();//第三步:使用SessionFactory常見session對象Session session = sessionFactory.openSession();//第四步:開啟事務(wù):Transaction tx = session.beginTransaction();//第五步:寫具體的邏輯crud操作之添加功能:User user = new User();user.setUsername("zhangweipeng");user.setPassword("123456");user.setAddress("中國");session.save(user);//第六步:提交事務(wù)tx.commit();//第七步:關(guān)閉資源session.close();sessionFactory.close();}@Testpublic void testSel(){Configuration cfg=new Configuration();cfg.configure();SessionFactory sessionfactory=cfg.buildSessionFactory();Session session=sessionfactory.openSession();Transaction tx=session.beginTransaction();//第五步:寫具體邏輯crud操作之查詢功能://調(diào)用session的get方法,第一個參數(shù):實(shí)體類class;第二個參數(shù):id值User user=session.get(User.class, 1);System.out.println(user.toString());tx.commit();session.close();sessionfactory.close(); }@Testpublic void testUpadte(){Configuration cfg=new Configuration();cfg.configure();SessionFactory sessionfactory=cfg.buildSessionFactory();Session session=sessionfactory.openSession();Transaction tx=session.beginTransaction();//第五步:寫具體邏輯crud操作之修改功能://5.1根據(jù)id進(jìn)行查詢User user=session.get(User.class, 1);//5.2設(shè)置修改值user.setUsername("updateUsername");//調(diào)用session的update修改;持久態(tài)會自動更新數(shù)據(jù)庫,可以不調(diào)用update //session.update(user);tx.commit();session.close();sessionfactory.close(); }@Testpublic void testDel(){Configuration cfg=new Configuration();cfg.configure();SessionFactory sessionfactory=cfg.buildSessionFactory();Session session=sessionfactory.openSession();Transaction tx=session.beginTransaction();//第五步:寫具體邏輯crud操作之刪除功能://常用:1:根據(jù)id刪除User user=session.get(User.class, 2);session.delete(user);//不常用://User user=new User();//user.setUid(4);//session.delete(user);tx.commit();session.close();sessionfactory.close();}//saveOrUpdate()方法的使用@Testpublic void testsavaOrUpdate(){Configuration cfg=new Configuration();cfg.configure();SessionFactory sessionfactory=cfg.buildSessionFactory();Session session=sessionfactory.openSession();Transaction tx=session.beginTransaction();// 瞬時態(tài)的情況: // User user =new User(); // user.setUsername("張三"); // user.setPassword("5646548"); // user.setAddress("中國"); // //實(shí)體類對象的狀態(tài)是瞬時態(tài),則執(zhí)行添加操作 // session.saveOrUpdate(user);// 持久態(tài)的情況: // User user=session.get(User.class, 1); // user.setUsername("李四"); // //實(shí)體類對象的狀態(tài)是持久態(tài),則執(zhí)行修改操作 // session.saveOrUpdate(user);//托管態(tài)的情況:User user=new User();user.setUid(6);user.setUsername("王五");user.setPassword("132156");user.setAddress("印度");//實(shí)體類對象的狀態(tài)是托管態(tài),則執(zhí)行修改操作session.saveOrUpdate(user);tx.commit();session.close();sessionfactory.close();} }hibernate中實(shí)體類對象有三種狀態(tài):
(1)瞬時態(tài):實(shí)體類對象沒有id值,與session也沒有關(guān)聯(lián)
(2)持久態(tài):實(shí)體類對象有id值,與session有關(guān)聯(lián)
(3)托管態(tài):實(shí)體類對象有id值,與session沒有關(guān)聯(lián)
2、封裝工具類:
從上面的幾個測試方法可以看出,我們一直在重復(fù)使用同一段代碼去創(chuàng)建并獲取session,開啟事務(wù),為了提高代碼的利用率,我們將重復(fù)使用的代碼抽取出來,封裝成一個工具類。
//Hibernate的util工具類: public class HibernateUtil {static Configuration cfg=null;static SessionFactory sessionfactory=null;//靜態(tài)代碼塊實(shí)現(xiàn)static{//加載核心配置文件cfg=new Configuration();cfg.configure();sessionfactory=cfg.buildSessionFactory();}//提供返回與本地線程的session方法//需要在hibernate.cfg.xml中加入下面配置//<property name="hibernate.current_session_context_class">thread</property>public static Session getSeesionObject(){return sessionfactory.getCurrentSession();}//提供方法返回sessionFactorypublic static SessionFactory getSessionFactory(){return sessionfactory;} }3、hibernate的規(guī)范寫法:
//hibernate規(guī)范寫法:@Testpublic void test(){//得到與本地連接的sessionSession session = null;Transaction tx=null;try{//與本地線程綁定的sessionsession=HibernateUtil.getSeesionObject();tx=session.beginTransaction();User user=new User();user.setUsername("張維鵬");user.setPassword("123");user.setAddress("中國");session.save(user);tx.commit(); }catch(Exception e){e.printStackTrace();tx.rollback();}finally{//session.close();//與本地線程綁定的session,不需要手動關(guān)閉//sessionfactory.close();} }?
四、hibernate常用對象api的使用:
1、Query對象:
①使用query對象,不需要寫sql語句,但是要寫hql語句。
Hql:hibernate query language,hibernate提供查詢語句,與sql相似。
②hql和sql語句區(qū)別:
Sql語句操作表和表字段;hql語句操作實(shí)體類和屬性。
③查詢所有hql語句:from 實(shí)體類名稱
④Query對象使用
--創(chuàng)建Query對象;
--調(diào)用query對象里面的方法得到結(jié)果。
2.Criteria對象:
①使用這個對象查詢操作,不需要寫語句,直接調(diào)用方法實(shí)現(xiàn)
②實(shí)現(xiàn)過程:
--創(chuàng)建criteria對象;
--調(diào)用對象里面的方法得到結(jié)果。
3、SQLQuery對象:
①使用hibernate時候,調(diào)用底層sql實(shí)現(xiàn);
②實(shí)現(xiàn)過程:
--創(chuàng)建SQLQuery對象;
--調(diào)用對象的方法。
?
4、代碼實(shí)現(xiàn):
//使用Query對象@Testpublic void testQuery(){SessionFactory sessionfactory = null;Session session = null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//1.創(chuàng)建Query對象,方法里面寫hql語句Query query=session.createQuery("from User");//2.調(diào)用query對象的方法List<User> list=query.list();for(User user:list){System.out.println(user.toString());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();} }//使用Criteria對象@Testpublic void testCriteria(){SessionFactory sessionfactory = null;Session session = null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//1.創(chuàng)建Criteria對象,參數(shù)寫類名Criteria criteria=session.createCriteria(User.class);//2.調(diào)用criteria對象的方法List<User> list=criteria.list();for(User user:list){System.out.println(user.toString());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();} }//使用SQLQuery對象@Testpublic void testSQLQuery(){SessionFactory sessionfactory = null;Session session = null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//1.創(chuàng)建SQLQuery對象,參數(shù)寫底層sql語句SQLQuery sqlquery=session.createSQLQuery("select * from t_user");//調(diào)用SQLQuery對象的方法//2.1 list默認(rèn)返回的是數(shù)組的形式 /* List<Object[]> list=sqlquery.list();for(Object[] objects:list){//System.out.println(objects);System.out.println(Arrays.toString(objects));}*///2.2設(shè)置返回的是對象的形式:sqlquery.addEntity(User.class);//調(diào)用SQLQuery對象的方法List<User> list =sqlquery.list();for(User user:list){System.out.println(user.toString());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();} }?
五、hibernate緩存:
一級緩存:
(1)一級緩存是默認(rèn)打開的;
(2)一級緩存作用范圍,是從session創(chuàng)建到session關(guān)閉;
(3)一級緩存存儲的數(shù)據(jù),必須是持久態(tài)數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的Hibernate框架--学习笔记(上):hibernate项目的搭建和常用接口方法、对象的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springmvc整合swagger 与
- 下一篇: Hibernate框架--学习笔记(中)