必須聲明本文章==》http://www.cnblogs.com/zhu520/p/7773133.html
一:在前一個方法(http://www.cnblogs.com/zhu520/p/7774144.html)一對多的查詢中,我使用的是一對多的映射來查詢數據的
如:一種品種類型(TbType)有多種花(TbFlower)
1):Po對象:
要在 1 的那方 包含 多的
TbType.java
private Integer typeId; private String type; private Set<TbFlower> setFlowers=new HashSet<TbFlower>(); public Set<TbFlower> getSetFlowers() { return setFlowers; } public void setSetFlowers(Set<TbFlower> setFlowers) { this.setFlowers = setFlowers; }
2):而在多那方就要:引用一的類
TbFlower.java
private Integer flowerId; private String flower; private Integer typeId; //花的品種 private TbType tbType;
(1) 一般一個實體類對應一個映射文件
3):映射文件
TbFlower.hbm.xml
TbType.hbm.xml
一對多和多對一的映射原理是一樣的,都是在多的一端加入一個外鍵指向一的一端
它們的區別在於維護的關系不同
多對一維護的關系:多指向一的關系,如果維護了多指向一的關系,那么加載多的時候會把一加載上來
一對多維護的關系:一指向多的關系,如果維護了一指向多的關系,那么加載一的時候會把多加載上來
其實這兩者什么鬼關系我也是懵逼的。。半懂又不懂的感覺。
4):然后就可以根據你需要進行你的增刪查改了
二: 現在我不使用上面的映射來進行查詢,我是在已有的 品種(TbType),花(TbFlower) 的基礎上在新建一個po的類,它是把品種(TbType)和花(TbFlower)的變量全部組合其他來(TbFlowerTypeVo.java)
步驟:
1):我的運行環境
我使用myeclipse(你也可以使用eclipse個人喜歡),tomcat7
jar包 放在百度雲,托到文章最后有鏈接下載即可(其實也可以根據我之前http://www.cnblogs.com/zhu520/p/7772823.html 去弄,不需要去網上下載(但是只是對myeclipse而言,eclipse還是要到網上下載的))
1): 先看看package情況先
2):applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd" default-autowire="byName"> <!-- 開啟注解 --> <context:annotation-config /> <!-- spring 掃描路徑,注意當前工程只需要掃描dao和service,srpingmvc或者struts2注解才有變化 --> <context:component-scan base-package="zhu.dao,zhu.service" /> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://127.0.0.1:3306/jdbc01"> </property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql"> true </prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <!-- 第一種方法: <property name="mappingDirectoryLocations"> <list> <value>classpath:zhu/cfg/</value> </list> </property> --> <!--第二種方法: --> <property name="mappingResources"> <list> <value>zhu/cfg/TbFlower.hbm.xml</value> <value>zhu/cfg/TbType.hbm.xml</value> </list> </property> </bean> <!-- 配置聲明式事務管理(采用注解的方式) --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 開啟注解事務 --> <!-- 用注解來實現事務管理 --> <tx:annotation-driven transaction-manager="txManager" /> </beans>
web。xml

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:applicationContext*.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> </web-app>
3):po包的情況
TbFlower.java ==>是沒有 TbType的變量的

package zhu.po; public class TbFlower { private Integer flowerId; private String flower; private Integer typeId; public Integer getFlowerId() { return flowerId; } public void setFlowerId(Integer flowerId) { this.flowerId = flowerId; } public String getFlower() { return flower; } public void setFlower(String flower) { this.flower = flower; } public Integer getTypeId() { return typeId; } public void setTypeId(Integer typeId) { this.typeId = typeId; } }
TbType.java ==》沒有TbFlower

package zhu.po; import java.util.HashSet; import java.util.Set; public class TbType { private Integer typeId; private String type; public Integer getTypeId() { return typeId; } public void setTypeId(Integer typeId) { this.typeId = typeId; } public String getType() { return type; } public void setType(String type) { this.type = type; } }
TbFlowerTypeVo.java==》這個是把上面的兩個類全部變量的組合(2個以上的表也可以這樣做,測試過是行的通的)
package zhu.po; public class TbFlowerTypeVo { private Integer flowerId; private String flower; private Integer typeId; private String type; public TbFlowerTypeVo(){} public TbFlowerTypeVo(int flowerId,String flower,int typeId, String type){ this.flowerId=flowerId; this.flower=flower; this.typeId=typeId; this.type=type; } public Integer getFlowerId() { return flowerId; } public void setFlowerId(Integer flowerId) { this.flowerId = flowerId; } public String getFlower() { return flower; } public void setFlower(String flower) { this.flower = flower; } public Integer getTypeId() { return typeId; } public void setTypeId(Integer typeId) { this.typeId = typeId; } public String getType() { return type; } public void setType(String type) { this.type = type; } }
4):映射文件 只需要映射 TbFlowe和TbType不需要映射TbFlowerTypeVo
TbType.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="zhu.po.TbType" table="tbtype" catalog="jdbc01"> <id name="typeId" type="java.lang.Integer"> <column name="typeId" /> <generator class="identity" /> </id> <property name="type" type="java.lang.String"> <column name="type" length="12" /> </property> </class> </hibernate-mapping>
TbFlower.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="zhu.po.TbFlower" table="tbflower" catalog="jdbc01"> <id name="flowerId" type="java.lang.Integer"> <column name="flowerId" /> <generator class="identity" /> </id> <property name="typeId" type="java.lang.Integer"> <column name="typeId" length="12" /> </property> <property name="flower" type="java.lang.String"> <column name="flower" length="12" /> </property> </class> </hibernate-mapping>
5):dao包
IFlowerDao.java
新增修改刪除和以前的操作是一樣的,,所以下面並沒有修改和刪除的操作
package zhu.dao; import java.util.List; import zhu.po.TbFlower; import zhu.po.TbFlowerTypeVo; public interface IFlowerDao { /** * 方法一 * 查詢所有數據 * 多表查詢 * @return */ public List<TbFlowerTypeVo> findAll1(); /** * 方法2 * 查詢所有數據 * 多表查詢 * @return */ public List<TbFlowerTypeVo> findAll2(); /** * 新增 * @param * @return */ public boolean save(TbFlower t); }
FlowerImpl.java
第一種方法:
在查詢多表的時候,使用TbFlowerTypeVo即可查詢,
使用createQuery()的方法查詢
第二種方法:
使用的是左鏈接( left join)進行的查詢(左鏈接就是以左為主,右邊的記錄可能為空,右鏈接就是以右為主左邊的可能為空) 、
使用createSQLQuery()的方法查詢
注意:createQuery與createSQLQuery兩者的區別是:
creatQuery用hql語句進行查詢,createSQLQuery可以用sql語句查詢
creatQuery用hibernate生成的Bean為對象封裝到list返回
createSQLQuery是以對象數組進行存儲
所以使用createSQLQuery時想以hibernate生成的bean為對象裝入list返回,就筆記麻煩
那么可以使用這樣的一個方法可以直接轉換為對象的
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
XXXXXXX 代表以hibernate生成的Bean的對象,也就是數據表映射出的Bean。
如果想更清楚的鏈接createQuery與createSQLQuery兩者的區別 可以去看看這邊文章 鏈接 ,上面的內容也是在那里學到的
package zhu.dao.impl; import java.util.ArrayList; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import zhu.dao.IFlowerDao; import zhu.po.TbFlower; import zhu.po.TbFlowerTypeVo; @Transactional @Repository(value="flowerDao") public class FlowerImpl implements IFlowerDao{ SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Session getSession(){ return getSessionFactory().openSession(); } /**使用TbFlowerTypeVo即可查詢 * 方法一: */ @SuppressWarnings("unchecked") @Override public List<TbFlowerTypeVo> findAll1() {//from Student s inner join s.classes c String hql="select new zhu.po.TbFlowerTypeVo(u.flowerId,u.flower,p.typeId, p.type) from TbFlower u , TbType p where u.typeId=p.typeId"; List<TbFlowerTypeVo> listManyVos=getSession().createQuery(hql).list(); return listManyVos; } /**左鏈接 * 方法二: */ @SuppressWarnings("unchecked") @Override public List<TbFlowerTypeVo> findAll2() {//from Student s inner join s.classes c String sql="select u.*,p.type from TbFlower u left join TbType p on u.typeId=p.typeId"; List<Object[]> listobje=getSession().createSQLQuery(sql).list(); List<TbFlowerTypeVo> VolistMany=new ArrayList<TbFlowerTypeVo>(); for (int i = 0; i < listobje.size(); i++) { Object[] obj=listobje.get(i); VolistMany.add(new TbFlowerTypeVo((Integer)obj[0],(String)obj[2],(Integer)obj[1],(String)obj[3])); } for (TbFlowerTypeVo userPowerVo : VolistMany) { System.out.println(userPowerVo.getFlower()); } return VolistMany; } @Override public boolean save(TbFlower t) { boolean b=false; try { getSession().save(t); b=true; } catch (Exception e) { } return b; } }
6):service包
IFlowerDaoService.java
package zhu.service; import java.util.List; import zhu.po.TbFlower; import zhu.po.TbFlowerTypeVo; public interface IFlowerDaoService { /**查詢所有數據 * 多表查詢 * @return */ public List<TbFlowerTypeVo> findAll1(); /** * 方法2 * 查詢所有數據 * 多表查詢 * @return */ public List<TbFlowerTypeVo> findAll2(); /** *新增 */ public boolean save(TbFlower t); }
FlowerDaoServiceImpl.java
package zhu.service.impl; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import zhu.dao.IFlowerDao; import zhu.po.TbFlower; import zhu.po.TbFlowerTypeVo; import zhu.service.IFlowerDaoService; @Service public class FlowerDaoServiceImpl implements IFlowerDaoService{ @Resource(name="flowerDao") IFlowerDao flowerDao; @Override public List<TbFlowerTypeVo> findAll1() { // TODO Auto-generated method stub return flowerDao.findAll1(); } @Override public List<TbFlowerTypeVo> findAll2() { // TODO Auto-generated method stub return flowerDao.findAll2(); } @Override public boolean save(TbFlower t) { // TODO Auto-generated method stub return flowerDao.save(t); } }
7:action包(即web包)
MantTableAction.java
注意:
ModelDriven:模型驅動,對所有action的模型對象進行批處理
簡單的數ModelDriven,意思是直接把實體類當成頁面數據的收集為對象
這篇文章寫挺全面的可以去看看 鏈接
package zhu.action; import java.util.List; import org.apache.struts2.ServletActionContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import zhu.po.TbFlower; import zhu.po.TbFlowerTypeVo; import zhu.service.impl.FlowerDaoServiceImpl; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; @Controller public class MantTableAction extends ActionSupport implements ModelDriven<TbFlowerTypeVo> { TbFlowerTypeVo tbFlowerTypeVo1; @Autowired FlowerDaoServiceImpl myfServiceImpl; @Override public TbFlowerTypeVo getModel() { tbFlowerTypeVo1=new TbFlowerTypeVo(); return tbFlowerTypeVo1; } /**方法1 * 多表查詢所有 * @return */ public String findAll1(){ ActionContext actionContext=ServletActionContext.getContext(); List<TbFlowerTypeVo> list=myfServiceImpl.findAll1(); actionContext.put("tb1", list); return "find"; } /**方法2 * 多表查詢所有 * @return */ public String findAll2(){ ActionContext actionContext=ServletActionContext.getContext(); List<TbFlowerTypeVo> list=myfServiceImpl.findAll2(); actionContext.put("tb2", list); return "find"; } /** * 新增 */ public String save(){ System.out.println(tbFlowerTypeVo1.getTypeId()); TbFlower tbFlower=new TbFlower(); tbFlower.setFlower(tbFlowerTypeVo1.getFlower()); tbFlower.setTypeId(tbFlowerTypeVo1.getTypeId()); if (myfServiceImpl.save(tbFlower)) { return "ok"; } return "fail"; } }
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="uu" namespace="/tb" extends="struts-default"> <action name="MantTableAction" class="zhu.action.MantTableAction"> <result name="find">/jsp/findAll.jsp</result> <result name="fail">/jsp/fail.jsp</result> <result name="ok" type="redirectAction"> <param name="actionName">MantTableAction</param> <param name="method">findAll1</param> </result> </action> </package> </struts>
8):jsp
findAll.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>多表查詢</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <div align="center"> <h3>方法1-----</h3> <form action="tb/MantTableAction!findAll1.action" method="post"> <input type="submit" value="多表查詢數據--方法一"/> <table border="1" cellspacing="0"> <thead> <tr> <td>Id</td><td>花的名稱</td><td>花品種</td> </tr> </thead> <tbody> <c:forEach items="${tb1 }" var="tb2"> <tr> <td>${tb2.flowerId} </td> <td>${tb2.flower} </td> <td> ${tb2.type} </td> </tr> </c:forEach> </tbody> </table> </form> </div> <hr/> <div align="center"> <h3>方法2-----</h3> <form action="tb/MantTableAction!findAll2.action" method="post"> <input type="submit" value="多表查詢數據--方法二"/> <table border="1" cellspacing="0"> <thead> <tr> <td>Id</td><td>花的名稱</td><td>花品種</td> </tr> </thead> <tbody> <c:forEach items="${tb2 }" var="tb2"> <tr> <td>${tb2.flowerId} </td> <td>${tb2.flower} </td> <td> ${tb2.type} </td> </tr> </c:forEach> </tbody> </table> </form> </div> <hr/> <div align="center"> <h3>新增-----</h3> <form action="tb/MantTableAction!save.action" method="post"> 啥花 : <input type="text" name="flower"/><br/> 品種 : <select name="typeId"> <option value="1">A品種</option> <option value="2">B品種</option> </select> <br/> <br/> <input type="submit" value="新增"/> </form> </div> </body> </html>
運行效果:
源碼下載鏈接:http://pan.baidu.com/s/1kUG2I3t 密碼:dbpi