一:在前一个方法(http://www.cnblogs.com/zhu520/p/7774144.html)一对多的查询中,我使用的是一对多的映射来查询数据的
如:一种品种类型(TbType)有多种花(TbFlower)
1):Po对象:
要在 1 的那方 包含 多的
TbType.java
privateInteger typeId;privateString type;private Set setFlowers=new HashSet();public SetgetSetFlowers() {returnsetFlowers;
}public void setSetFlowers(SetsetFlowers) {this.setFlowers =setFlowers;
}
2):而在多那方就要:引用一的类
TbFlower.java
privateInteger flowerId;privateString flower;privateInteger 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
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">
org.hibernate.dialect.MySQLDialect
true
update
zhu/cfg/TbFlower.hbm.xml
zhu/cfg/TbType.hbm.xml
applicationContext.xml
web。xml
index.jsp
contextConfigLocation
classpath:applicationContext*.xml
org.springframework.web.context.ContextLoaderListener
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
*.action
web.xml
3):po包的情况
TbFlower.java ==>是没有 TbType的变量的
packagezhu.po;public classTbFlower {privateInteger flowerId;privateString flower;privateInteger typeId;publicInteger getFlowerId() {returnflowerId;
}public voidsetFlowerId(Integer flowerId) {this.flowerId =flowerId;
}publicString getFlower() {returnflower;
}public voidsetFlower(String flower) {this.flower =flower;
}publicInteger getTypeId() {returntypeId;
}public voidsetTypeId(Integer typeId) {this.typeId =typeId;
}
}
TbFlower.java
TbType.java ==》没有TbFlower
packagezhu.po;importjava.util.HashSet;importjava.util.Set;public classTbType {privateInteger typeId;privateString type;publicInteger getTypeId() {returntypeId;
}public voidsetTypeId(Integer typeId) {this.typeId =typeId;
}publicString getType() {returntype;
}public voidsetType(String type) {this.type =type;
}
}
TbType.java
TbFlowerTypeVo.java==》这个是把上面的两个类全部变量的组合(2个以上的表也可以这样做,测试过是行的通的)
packagezhu.po;public classTbFlowerTypeVo {privateInteger flowerId;privateString flower;privateInteger typeId;privateString type;publicTbFlowerTypeVo(){}public TbFlowerTypeVo(int flowerId,String flower,inttypeId, String type){this.flowerId=flowerId;this.flower=flower;this.typeId=typeId;this.type=type;
}publicInteger getFlowerId() {returnflowerId;
}public voidsetFlowerId(Integer flowerId) {this.flowerId =flowerId;
}publicString getFlower() {returnflower;
}public voidsetFlower(String flower) {this.flower =flower;
}publicInteger getTypeId() {returntypeId;
}public voidsetTypeId(Integer typeId) {this.typeId =typeId;
}publicString getType() {returntype;
}public voidsetType(String type) {this.type =type;
}
}
4):映射文件 只需要映射 TbFlowe和TbType不需要映射TbFlowerTypeVo
TbType.hbm.xml
/p>
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
TbFlower.hbm.xml
/p>
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
5):dao包
IFlowerDao.java
新增修改删除和以前的操作是一样的,,所以下面并没有修改和删除的操作
packagezhu.dao;importjava.util.List;importzhu.po.TbFlower;importzhu.po.TbFlowerTypeVo;public interfaceIFlowerDao {/*** 方法一
* 查询所有数据
* 多表查询
*@return
*/
public ListfindAll1();/*** 方法2
* 查询所有数据
* 多表查询
*@return
*/
public ListfindAll2();/*** 新增
*@param*@return
*/
public booleansave(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两者的区别 可以去看看这边文章
packagezhu.dao.impl;importjava.util.ArrayList;importjava.util.List;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.springframework.stereotype.Repository;importorg.springframework.transaction.annotation.Transactional;importzhu.dao.IFlowerDao;importzhu.po.TbFlower;importzhu.po.TbFlowerTypeVo;
@Transactional
@Repository(value="flowerDao")public class FlowerImpl implementsIFlowerDao{
SessionFactory sessionFactory;publicSessionFactory getSessionFactory() {returnsessionFactory;
}public voidsetSessionFactory(SessionFactory sessionFactory) {this.sessionFactory =sessionFactory;
}publicSession getSession(){returngetSessionFactory().openSession();
}/**使用TbFlowerTypeVo即可查询* 方法一:*/@SuppressWarnings("unchecked")
@Overridepublic List 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 listManyVos=getSession().createQuery(hql).list();returnlistManyVos;
}/**左链接* 方法二:*/@SuppressWarnings("unchecked")
@Overridepublic List 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 listobje=getSession().createSQLQuery(sql).list();
List VolistMany=new ArrayList();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());
}returnVolistMany;
}
@Overridepublic booleansave(TbFlower t) {boolean b=false;try{
getSession().save(t);
b=true;
}catch(Exception e) {
}returnb;
}
}
6):service包
IFlowerDaoService.java
packagezhu.service;importjava.util.List;importzhu.po.TbFlower;importzhu.po.TbFlowerTypeVo;public interfaceIFlowerDaoService {/**查询所有数据
* 多表查询
*@return
*/
public ListfindAll1();/*** 方法2
* 查询所有数据
* 多表查询
*@return
*/
public ListfindAll2();/***新增*/
public booleansave(TbFlower t);
}
FlowerDaoServiceImpl.java
packagezhu.service.impl;importjava.util.List;importjavax.annotation.Resource;importorg.springframework.stereotype.Service;importzhu.dao.IFlowerDao;importzhu.po.TbFlower;importzhu.po.TbFlowerTypeVo;importzhu.service.IFlowerDaoService;
@Servicepublic class FlowerDaoServiceImpl implementsIFlowerDaoService{
@Resource(name="flowerDao")
IFlowerDao flowerDao;
@Overridepublic ListfindAll1() {//TODO Auto-generated method stub
returnflowerDao.findAll1();
}
@Overridepublic ListfindAll2() {//TODO Auto-generated method stub
returnflowerDao.findAll2();
}
@Overridepublic booleansave(TbFlower t) {//TODO Auto-generated method stub
returnflowerDao.save(t);
}
}
7:action包(即web包)
MantTableAction.java
注意:
ModelDriven:模型驱动,对所有action的模型对象进行批处理
简单的数ModelDriven,意思是直接把实体类当成页面数据的收集为对象
这篇文章写挺全面的可以去看看
packagezhu.action;importjava.util.List;importorg.apache.struts2.ServletActionContext;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importzhu.po.TbFlower;importzhu.po.TbFlowerTypeVo;importzhu.service.impl.FlowerDaoServiceImpl;importcom.opensymphony.xwork2.ActionContext;importcom.opensymphony.xwork2.ActionSupport;importcom.opensymphony.xwork2.ModelDriven;
@Controllerpublic class MantTableAction extends ActionSupport implements ModelDriven{
TbFlowerTypeVo tbFlowerTypeVo1;
@Autowired
FlowerDaoServiceImpl myfServiceImpl;
@OverridepublicTbFlowerTypeVo getModel() {
tbFlowerTypeVo1=newTbFlowerTypeVo();returntbFlowerTypeVo1;
}/**方法1
* 多表查询所有
*@return
*/
publicString findAll1(){
ActionContext actionContext=ServletActionContext.getContext();
List list=myfServiceImpl.findAll1();
actionContext.put("tb1", list);return "find";
}/**方法2
* 多表查询所有
*@return
*/
publicString findAll2(){
ActionContext actionContext=ServletActionContext.getContext();
List list=myfServiceImpl.findAll2();
actionContext.put("tb2", list);return "find";
}/*** 新增*/
publicString save(){
System.out.println(tbFlowerTypeVo1.getTypeId());
TbFlower tbFlower=newTbFlower();
tbFlower.setFlower(tbFlowerTypeVo1.getFlower());
tbFlower.setTypeId(tbFlowerTypeVo1.getTypeId());if(myfServiceImpl.save(tbFlower)) {return "ok";
}return "fail";
}
}
struts.xml
/jsp/findAll.jsp
/jsp/fail.jsp
MantTableAction
findAll1
8):jsp
findAll.jsp
Stringpath= request.getContextPath();String basePath= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
">
多表查询方法1-----
Id花的名称花品种
${tb2.flowerId} ${tb2.flower} ${tb2.type}