ssh框架中java的查找_SSH框架的多表查询(方法二)

一:在前一个方法(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

4724150aaad255edeb24499aefd238ce.png

TbType.hbm.xml

0ed7924ff1da0d60fbcdbddd4275e408.png

一对多和多对一的映射原理是一样的,都是在多的一端加入一个外键指向一的一端

它们的区别在于维护的关系不同

多对一维护的关系:多指向一的关系,如果维护了多指向一的关系,那么加载多的时候会把一加载上来

一对多维护的关系:一指向多的关系,如果维护了一指向多的关系,那么加载一的时候会把多加载上来

其实这两者什么鬼关系我也是懵逼的。。半懂又不懂的感觉。

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情况先

9ae478054a1213ffcf5543e16a7e608a.png

2):applicationContext.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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包的情况

69cf66e6fe7be2d7a1589b674471505e.png

TbFlower.java ==>是没有 TbType的变量的

72e06fee55f7aa003e5a0cb7b2dd0b89.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

404d5e76f0192027485c62e8227ba722.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8e5ebae1b95c71148aef873f38a07875.png

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包

ce1d878b182910ec6ff9f4840a81133e.png

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包

5aba5bf9c1723a344dc701d891b42645.png

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包)

4e43177642797fbe84c79ebe4276abd6.png

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";

}

}

d00f7226170810f7c71f5e6c4959d6ef.png

struts.xml

f34bf0f4a3c3d51a210f51b239891bcb.png

/jsp/findAll.jsp

/jsp/fail.jsp

MantTableAction

findAll1

8):jsp

830e28581d95f111826b512d07290e07.png

findAll.jsp

2c794ab824c97d67c6d64e66eecb12ed.png

8b1066ee99d387d7b1aa1cd587406b89.png

Stringpath= request.getContextPath();String basePath= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>

">

多表查询

方法1-----

Id花的名称花品种

${tb2.flowerId} ${tb2.flower} ${tb2.type}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值