国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

在Java的Hibernate框架中使用SQL語句的簡單介紹

2019-11-26 14:42:13
字體:
供稿:網(wǎng)友

Hibernate中有HQL查詢語法。但我們用得比較熟的還是數(shù)SQL語句,那么應(yīng)該怎么來讓Hibernate支持SQL呢?這個不用我們?nèi)タ紤]了,Hibernate團(tuán)隊(duì)已經(jīng)早就做好了。
       廢話不說,直接來例子啦。

select * from t_user usr 

 
  上面是一條SQL語句,又是廢話,是個人都知道。我們想讓Hibernate執(zhí)行這條語句,怎么辦呢?看代碼:

Query query = session.createSQLQuery("select * from t_user usr"); 

  就這樣,剩下來的,大家應(yīng)該都知道了,平常的查詢。
        那查詢完之后,返回的是什么東西呢?

while(iter.hasNext()){  Object[] objs = (Object[])iter.next();  for (int i = 0; i < objs.length; i++) {  System.out.print(objs[i]);  }  System.out.println(); } 

  返回的每個結(jié)果都是Object[]數(shù)組,
     
        這時又有人跑出來說面向?qū)ο罄病Γ褪敲嫦驅(qū)ο螅Γ瑳]辦法。
        我們繼續(xù)看:

select {usr.*} from t_user usr 

  看到這里,估計某些童鞋開始雞動啦,那個大括號什么東西啦?
    別急,慢慢來。我們先繼續(xù)看代碼。

復(fù)制代碼 代碼如下:

Query query = session.createSQLQuery("select {usr.*} from t_user usr").addEntity(TUser.class);

  我們看到跟前面不同的是,我們加了一個addEntity,是什么意思呢?
    我們直接API,看到這樣一串解釋:
 addEntitySQLQuery addEntity(String tableAlias,   Class entityType)Declare a "root" entityParameters:tableAlias - The SQL table aliasentityType - The java type of the entity to add as a root

       有跟沒一個樣,杯具。只能自己動手用用。
       第一個參數(shù)是指表的別名,就像上面的語句,我們表的別名是usr,所以第一個參數(shù)為usr,而第二個是指查詢到的結(jié)果需要映射到哪個類,這里由于我們在映射文件中是通過TUser映射到t_user表,所以我們這里當(dāng)然也就是TUser啦。然后一查,有SQL語句出來,而且查到的結(jié)果是TUser類型的。
       我們查到的結(jié)果是:

org.hibernate.tutorial.domain6.TUser@198cb3d 

  當(dāng)然,你們的肯定跟我不一樣的。不要雞動。
 
    也許我們并不需要全部進(jìn)行查出,這時,我們需要的只是設(shè)定別名即可:

select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u 

  我們看到我們用了as指定了字段的別名,程序中還是一樣:

復(fù)制代碼 代碼如下:

Query query = session.createSQLQuery("select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u").addEntity("usr",TUser.class);

  這個簡單,不多說。
 
         以前我們講到,有些團(tuán)隊(duì)會規(guī)定不給在代碼中寫SQL語句,這又需要配置文件出馬啦。
         我們可以在配置文件中添加:
<sql-query name="queryTUser">  <return alias="usr" entity-name="org.hibernate.tutorial.domain6.TUser" />  select {usr.*} from t_user usr where name=:name </sql-query> 

  注意,這里的entity-name需要寫完整的包名,不然會報錯的。這里我們有子標(biāo)簽return,它指定了表的別名和類名,這樣我們在運(yùn)行時就不需要再addEntity了。
    看代碼:

Query query = session.getNamedQuery("queryTUser"); query.setParameter("name","shun"); List list = query.list(); Iterator iter = list.iterator(); 

 
  我們直接這樣就OK了,注意,我們并沒有加addEntity了,主要還是歸功于配置文件中的配置。
    注意,如果在配置文件中配置,一定要有return子標(biāo)簽指定表別名和類名。這個主要是避免了我們讀取語句時的重復(fù)判斷。
  
 
    上面講了這么久,我們一直在講有別名的表,那么如果我們的表沒有別名,但又想返回的結(jié)果封裝在對象內(nèi),我們應(yīng)該怎樣呢?

select * from t_user usr 

  很簡單,只要調(diào)用addEntity的重載方法addEntity(Class clazz)就行了,只需要提供一個類名,而不需要表別名。
 
    當(dāng)然,hibernate也支持存儲過程,只需要在配置文件中把sql-query的callable屬性設(shè)為true即表示當(dāng)前調(diào)用的是存儲過程,由于存儲過程我接觸地不多,以后多研究一下再跟大家一起研究。
  
    我們在調(diào)用session.save等相應(yīng)的對數(shù)據(jù)操作的方法時,它會轉(zhuǎn)換成hibernate內(nèi)置的SQL語句,但如果我們想自己控制SQL語句的格式呢,怎么辦?
    Hibernate實(shí)際上也想到了。
    我們直接在映射文件中加入:

<sql-insert>  INSERT INTO T_USER (NAME,AGE) values (?,?)  </sql-insert>  <sql-update>  UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=? </sql-update> 

  
  注意,這個需要添加在class標(biāo)簽內(nèi),作為子標(biāo)簽。我們這里全部是大寫字母,是為了跟hibernate默認(rèn)的語句分清,沒有其他意思。
    我們先來看一下insert的調(diào)用:

User user = new User(); user.setName("shun123123"); user.setAge(23); 

  當(dāng)我們調(diào)用保存時,hibernate的語句是:
Hibernate: 

INSERT INTO USER(USER_NAME,AGE) values(?,?) 

  它調(diào)用了我們配置的sql-insert標(biāo)簽內(nèi)的語句
我們再來看一下update的調(diào)用:

User user = (User)session.get(User.class,new Long(29)); user.setName("shun123123"); user.setAge(23); session.save(user); 

  我們調(diào)用保存,它會自動調(diào)用更新,此時的語句是:
Hibernate: 

UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=? 
  我們看到輸出的語句是大寫的,也就是調(diào)用了我們配置的語句。
 
    delete語句也是同樣的配置。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 资源县| 霍城县| 化德县| 三门峡市| 舒城县| 葵青区| 阳新县| 长寿区| 通城县| 当阳市| 苏尼特左旗| 库尔勒市| 尼木县| 图片| 崇左市| 富顺县| 佛山市| 石台县| 铁岭市| 北京市| 新郑市| 和田县| 兴宁市| 普兰县| 柘荣县| 镇安县| 甘南县| 沾益县| 南昌市| 根河市| 桓台县| 寿宁县| 宁化县| 大洼县| 南城县| 阜宁县| 芒康县| 巨野县| 六枝特区| 平江县| 星座|