HQL語句混雜在代碼之間將破壞代碼的可讀性
Hibernate允許在映射配置文件中定義字符串形式的查詢語句,這種查詢方式稱為命名查詢
二、建立數(shù)據(jù)表和持久化類建立數(shù)據(jù)表

create table login( username varchar2(32) PRimary key, passWord varchar2(32) not null , age number(3));insert into loginselect '張三','123456',21 from dual unionselect 'Tom','123123',34 from dual unionselect 'Jack','12345678',34 from dual unionselect '李四','qwerty',23 from dual; commit;

建立持久化類和配置文件
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> <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <property name="connection.url"> jdbc:oracle:thin:@localhost:1521:orcl </property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="connection.driver_class"> oracle.jdbc.OracleDriver </property> <property name="show_sql">true</property> <property name="format_sql">true</property> <mapping resource="entity/Login.hbm.xml" /> </session-factory></hibernate-configuration>

持久化類和配置文件

package entity;public class Login implements java.io.Serializable { // Fields /** * */ private static final long serialVersionUID = 1L; private String username; private String password; private int age; // Constructors /** default constructor */ public Login() { } /** minimal constructor */ public Login(String username, String password) { this.username = username; this.password = password; } /** full constructor */ public Login(String username, String password, int age) { this.username = username; this.password = password; this.age = age; } // Property accessors public String getUsername() { return this.username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; }}

配置文件Login.hbm.xml
<?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"><hibernate-mapping> <class name="entity.Login" table="LOGIN" schema="ROOT"> <id name="username" type="java.lang.String"> <column name="USERNAME" length="32" /> <generator class="assigned" /> </id> <property name="password" type="java.lang.String"> <column name="PASSWORD" length="32" not-null="true" /> </property> <property name="age" type="java.lang.Integer"> <column name="AGE" precision="3" scale="0" /> </property> </class> <query name="loginUser"> <!--HQL查詢語句 --> <![CDATA[ from Login login where login.username=:username and login.password=:password ]]> </query></hibernate-mapping>
測試類:
package demo;import java.util.Iterator;import java.util.List;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import entity.Login;public class Demo5 { /** * Criteria無查詢條件查詢所有 */ public static void main(String[] args) { //聲明一個(gè)集合用來接收結(jié)果 List<Login> result=null; //聲明SessionFactory SessionFactory factory=null; //聲明Session Session session=null; // //初始化以上對(duì)象 //創(chuàng)建一個(gè)用戶對(duì)象 Login lo=new Login(); lo.setUsername("Tom"); lo.setPassword("123123"); try{ factory=new Configuration().configure().buildSessionFactory(); session=factory.openSession(); //創(chuàng)建Query 參數(shù)為配置文件中的name Query query=session.getNamedQuery("loginUser"); //將對(duì)象作為參數(shù)傳為 query.setProperties(lo); //查詢使用list方法 result=query.list(); }catch(HibernateException e){ e.printStackTrace(); }finally{ session.close(); factory.close(); } //判斷結(jié)果是否為空 Iterator<Login> iterator=result.iterator(); //如果有內(nèi)容,--不為空 if(iterator.hasNext()){ //輸出結(jié)果 Login login=iterator.next(); System.out.println("用戶名:"+login.getUsername()+" 密碼:"+login.getPassword()+" 年齡:"+login.getAge()); }else{ System.out.println("沒有這個(gè)用戶"); } } }二、NativeSQL本地化SQL2.1、執(zhí)行本地SQLpackage demo;import java.util.Iterator;import java.util.List;import org.hibernate.HibernateException;import org.hibernate.SQLQuery;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import entity.Login;public class Demo6 { /** * Criteria無查詢條件查詢所有 */ public static void main(String[] args) { //聲明一個(gè)集合用來接收結(jié)果 List<Login> result=null; //聲明SessionFactory SessionFactory factory=null; //聲明Session Session session=null; String uname="Tom"; //初始化以上對(duì)象 try{ factory=new Configuration().configure().buildSessionFactory(); session=factory.openSession(); //聲明Criteria對(duì)象傳入一個(gè)持久化類對(duì)象類型 String sql="select {l.*} from login l where l.username=? "; //創(chuàng)建SQLQuery對(duì)象,傳入2個(gè)參數(shù),第一個(gè)參數(shù)為數(shù)據(jù)庫表的別名,第二個(gè)為實(shí)體類的類 SQLQuery sqlQuery=session.createSQLQuery(sql).addEntity("l", Login.class); sqlQuery.setParameter(0, uname); //查詢使用list方法 result=sqlQuery.list(); }catch(HibernateException e){ e.printStackTrace(); }finally{ session.close(); factory.close(); } System.out.println("=========="); Iterator<Login> iterator=result.iterator(); //輸出結(jié)果 while(iterator.hasNext()){ Login login=iterator.next(); System.out.println("用戶名:"+login.getUsername()+" 密碼:"+login.getPassword()+" 年齡:"+login.getAge()); } } }2.2、執(zhí)行本地SQL命名查詢首先配置類的配置文件
<?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"><hibernate-mapping> <class name="entity.Login" table="LOGIN" schema="ROOT"> <id name="username" type="java.lang.String"> <column name="USERNAME" length="32" /> <generator class="assigned" /> </id> <property name="password" type="java.lang.String"> <column name="PASSWORD" length="32" not-null="true" /> </property> <property name="age" type="java.lang.Integer"> <column name="AGE" precision="3" scale="0" /> </property> </class> <query name="loginUser"> <!--HQL查詢語句 --> <![CDATA[ from Login login where login.username=:username and login.password=:password ]]> </query> <!-- 本地SQL命名查詢--> <sql-query name="findUser"> <![CDATA[ select {l.*} from login l where l.username=? ]]> <!--指定與實(shí)體類的關(guān)聯(lián) --> <return alias="l" class="entity.Login" /> </sql-query></hibernate-mapping>測試類
package demo;import java.util.Iterator;import java.util.List;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.SQLQuery;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import entity.Login;public class Demo7 { /** * Criteria無查詢條件查詢所有 */ public static void main(String[] args) { //聲明一個(gè)集合用來接收結(jié)果 List<Login> result=null; //聲明SessionFactory SessionFactory factory=null; //聲明Session Session session=null; String uname="Tom"; //初始化以上對(duì)象 try{ factory=new Configuration().configure().buildSessionFactory(); session=factory.openSession(); Query query=session.getNamedQuery("findUser"); query.setParameter(0, uname); //查詢使用list方法 result=query.list(); }catch(HibernateException e){ e.printStackTrace(); }finally{ session.close(); factory.close(); } System.out.println("=========="); Iterator<Login> iterator=result.iterator(); //輸出結(jié)果 while(iterator.hasNext()){ Login login=iterator.next(); System.out.println("用戶名:"+login.getUsername()+" 密碼:"+login.getPassword()+" 年齡:"+login.getAge()); } } }三、定制SQL可以執(zhí)行自己寫的SQL語句來替代Hibernate的SQL,主要有3個(gè)保存,插入,刪除,時(shí)就會(huì)執(zhí)行我們自己寫的SQL


如果插入或者是更新時(shí),不想插入或者更新一些字段只需要在映射文件中相應(yīng)的字段后面加下insert="false",update="false";



配置:
<?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> <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <property name="connection.url"> jdbc:oracle:thin:@localhost:1521:orcl </property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="connection.driver_class"> oracle.jdbc.OracleDriver </property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="myecl測試類
package demo;import java.util.List;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import entity.Login;public class Demo8 { /** * 批量插入數(shù)據(jù) */ public static void main(String[] args) { //聲明一個(gè)集合用來接收結(jié)果 List<Login> result=null; //聲明SessionFactory SessionFactory factory=null; //聲明Session Session session=null; //聲明事務(wù) Transaction tran=null; //初始化以上對(duì)象 try{ factory=new Configuration().configure().buildSessionFactory(); session=factory.openSession(); tran=session.beginTransaction(); for(int i=0;i<100;i++){ Login login=new Login(); login.setUsername(Integer.toString(i+100000)); login.setPassword(Integer.toString(i+100000)); login.setAge(i); session.save(login); //保存 if(i%20==0){ //單次處理的數(shù)據(jù)為20,與配置文件中設(shè)置的JDBC數(shù)量一樣 session.flush(); //清理緩存 session.clear(); //清空緩存中的Login對(duì)象 } } tran.commit(); }catch(HibernateException e){ e.printStackTrace(); }finally{ session.close(); factory.close(); } } }五、調(diào)用存儲(chǔ)過程
調(diào)用插入
更新
刪除
建立帶輸出參數(shù)的存儲(chǔ)過程
命名SQL調(diào)用
配置文件中添加配置
調(diào)用
調(diào)用帶輸出結(jié)果集的存儲(chǔ)過程
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注