
// 表的细节
ResultSetMetaData rsmd = rsgetMetaData();
// oracle下标是从1开始 打印列名
for (int i = 1; i <= rsmdgetColumnCount(); i++) {
Systemoutprint(rsmdgetColumnName(i) + "\t");
}
用本地sql查询 : 会得到 List<Object[]> 其中 object[] 是得到的一行 一行的数据 值的顺序是你sql语句查询的列名的顺序 你可以封装成List<Map
Hib的检索方式
1‘导航对象图检索方式。通过已经加载的对象,调用iterator()方法可以得到order对象
如果是首次执行此方法,Hib会从数据库加载关联的order对象,否则就从缓存中得到。
2‘OID检索方式。通过session的get,load方法知道了OID的情况下可以使用
3‘HQL检索方式。使用面向对象的HQL查询语句session的find方法利用HQL来查询
4‘QBC检索方式。利用QBCAPI来检索它是封装了基于字符串的查询语句
5‘本地的SQL检索方式。使用本地数据库的SQL查询语句Hib会负责把检索到的JDBC结果集映射为持久化对象图。
Order的用法
一、名词order作“顺序”、“次序”、“整齐”、“秩序”解:
1 The machine is in good working order 机器运转良好。
2 The four seasons follow in order 四个季节依次轮换。
3 Our laboratory is kept in good order 我们的实验室保持整齐。(句中in good order为主语补语。)
4 In case the device is out of order, you have to repair it at once 如果该装置发生故障,你就得马上修理。
5 N2, H2 and He, in the order named, are more difficult to liquefy than air N2,H2和He比空气难于液化的程度按其顺序依次递增。
6 A list of some of the common metals in the order of their activity is given below 下面列出了某些金属按其活泼顺序排列的一个表格。
二、名词order作“订货”、“订货单”、“数量级或范围”、“命令”解:
1 The factory has received an order for 2,000 machine tools 工厂受到了一张要买2,000 台机床的订货单。
2 These machines are made to order 这些机器是定做的。(to order指按照订货要求的样式而言。)
3 The average diameter of an atomic nucleus is of the order 10 or 10 centimeter 原子核平均直径在10(10的负12次方)或10(10的负13次方)厘米范围内。
4 Maximum signal currents are of the order of 50 ma 最大信号电流是在50毫安这个数量级。
5 He gave orders for the work to be started (=…orders that the work should be started)他下令开始工作。
三、用“in order+带to的不定式”表示目的状语:
1 We are working hard (in order) to build socialism in China 我们正在为中国建设社会主义而努力工作。
2 In order to measure the resistance of a conductor, it is necessary to have some fixed standard 为了测量导体的电阻,就要有某种固定的标准。
3 They took off their shoes upon (on) entering, in order not to soil the mats 他们进来时都脱鞋,免得弄脏地毯。
4 In order to adjust the level, we may screw the bolt up or down 我们上下拧动螺钉以调节该水平仪。
注1:有时可省略in order,而直接用不定式表示目的状语:
We have produced a lot of tractors (in order) to meet the needs of our agriculture我们生产了许多拖拉机以满足我们农业的需要。
(In order) To understand these uses, you must know some of the properties of oxygen要了解这些用途,你必须知道氧的某些性质。
注2:注意in order后面出现不定式的逻辑主义for…的情况:
In order for two forces to neutralize each other, they must act on the same object为了使两个力互相抵消,它们必须作用于同一物体上。
注3:若用“on purpose+不定式”代替“in order +不定式”,则前者含有特地、故意意味而使目的的状语语气加强。例如:
She has left this tool on purpose for you to use她有意把这个工具留在这里让出使用。
四、用“in order that”引导目的从句:
1 What is needed in order that electrical charges may moves 需要什么才能使电荷运动呢?
2 In order that work can be done, in scientific sense, a force must move an object through some distance 就科学意义来说,为了做功,力必须推动物体通过一定距离。
3 You must knock down the machines before shipping in order that they shall arrive in good shape 你们必须在装运前拆卸这些机器以使他们完整无损到达。
4 The old worker, in order that there might be no time lost, oiled the machines himself 为节省时间,老工人亲自给机器上油。
注:在in order that引出的目的状语从句内,常用情态动词may,might,can,could,shall等。当目的的状语从句在句末时,还常可用so that或to the end that代替in order that。
五、动词order作“定制”、“订购”、“命令”解:
1 They have ordered 1,000 oil pumps from our factory他们已向我厂订购1,000台油泵。
2 The doctor ordered him to stay there医生嘱咐他留在那里。(不定式短语to stay there作宾语补语)
在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用
sessioncreateSQLQuery(sql)setResultTransformer(TransformersALIAS_TO_ENTITY_MAP);
来转化为map来进行处理,可以通过以下方式将查询结果转化为实体类:
1,sql语句 String sql="select sid as id,sclassname as classname from grade s,student st where sid=stclassid"
利用以下语句
sessioncreateSQLQuery(sql) setResultTransformer(TransformersaliasToBean(Gradeclass))可以将sql中查询出来的字段转化为班级这个实体类,但是必须为每个字段指定别名,别名就是班级类里面的对应的属性,但必须注意,对每一个列都必须addScalar("列名"),如果不设置addScalar方法可能会报转型错误的异常如果查询的结果里面包括多个表里面的字段,不能对应一个实体类去接受,就需要新建一个与查询结果对应的实体类,或者直接使用map结果集
2,sql语句 String sql="select {s} from grade s,student st where sid=stclassid"
针对这样的全部字段查询的sql可以利用addEntity来转化为实体类
SQLQuery query=sessioncreateSQLQuery(sql) ;
queryaddEntity("s", Gradeclass);
SQL查询语句,它带一个占位符,可以让Hibernate使用字段的别名
查询返回的实体,和它的SQL表的别名
addEntity()方法将SQL表的别名和实体类联系起来,并且确定查询结果集的形态。
这样就可以将班级这张表里面的所有字段的值赋值给班级这个实体类java培训机构排名,而且必须是所有的属性
3,sql语句 String sql="select {s},{st} from grade s,student st where sid=stclassid"
SQLQuery query=sessioncreateSQLQuery(sql) ;
queryaddEntity("s", Gradeclass);
queryaddEntity("st", Studentclass);
利用这样的查询得到的是一个object[]数组,object[0]就是班级实体类,object[1]就是学生实体类
可以用addScalar(String arg,Type type)方法定义要返回的字段类型,如
screateSQLQuery(shuiQingHQL)addScalar("STCD",HibernateSTRING)addScalar("STNM")
Hibernate <>的一对多和多对一 *** 作真的很方便 如果系统采用Hibernate作为持久层 完全可以把对应的一对多和多对一逻辑关系放在Hibernate里面控制 减少数据库的负担 而且也更清晰
多对一和一对多概念
其实这个概念上来说很简单 比如一个客户可以有多个订单 多个订单属于同一个客户 就是最基本的一对多 和多对一 数据库使用中 感觉多对一和一对多算是比较常见的逻辑关系了
我曾经做过一些数据库 比如某些 部门的 其表单很设计的很简单粗糙 甚至连主键都没有 完全靠在事务层补全这些关系 其实通过Hibernate持久层来实现逻辑关系也是很不错的方法 下面的例子 就是数据库逻辑上基本没有定义 主要放在持久层里面 这个也主要是我对数据库 *** 作属于半通水的原因
数据库层
这里面有两个表单 一个CUSTOMER 客户表单 一个是ORDERS 订单表单 生成客户表单 这个是在SQLServer里面做的 其实其他都一样 因为逻辑关系在Hibernate上面 id是主键非空 其他可以为空
CREATETABLE[dbo] [CUSTOMER](
[id][numeric]( )NOTNULL
[name][varchar]( )NULL
[age][int]NULL
CONSTRAINT[PK_CUSTOMER]PRIMARYKEY)
订单表单
id为主键非空 CUSTOMER_id是对应客户主键 也非空 这里不做外键设置
CREATETABLE[dbo] [ORDERS](
[id][numeric]( )NULLPRIMARYKEY
[CUSTOMER_id][numeric]( )NOTNULL
[ORDER_NUMBER][varchar]( )NULL
[PRICE][numeric]( )NULL
)
Hibernate设定
HIbernate里面 一对多的对象体现 是客户有一个集合set set里面放著对应订单 而多对一体现 是订单里面有一个CUSTOMER对象 表明该订单所属的客户 其中 CUSTOMER类为
publicclassCustomerimplementsjava io Serializable{
privateLongid;
privateStringname;
privateIntegerage;
privateSetrderses=newHashSet();
}
后面的getXXX和setXXX方法就省去了 同样订单类就是
publicclassOrdersimplementsjava io Serializable{
privateLongid;
privateCustomercustomer;
privateStringorderNumber;
privateDoubleprice;
}
而对应hbm文档 就是map文档如下
CUSTOMER hbm xml
<!DOCTYPEhibernate mappingPUBLIC //Hibernate/HibernateMappingDTD //EN
mapping dtd >
<!
MappingfileautogeneratedbyMyEclipsePersistenceTools
>
<hibernate mapping>
<classnameclassname= onetomany Customer table= CUSTOMER schema= dbo catalog= DBTEST >
<idnameidname= id type= java lang Long >
<columnnamecolumnname= id precision= scale= />
<generatorclassgeneratorclass= increment />
</id>
<propertynamepropertyname= name type= java lang String >
<columnnamecolumnname= name length= />
</property>
<propertynamepropertyname= age type= java lang Integer >
<columnnamecolumnname= age />
</property>
<setnamesetname= orderses inverse= true lazy= true cascade= all >
<key>
<columnnamecolumnname= CUSTOMER_id precision= scale= not null= true />
</key>
<one to manyclassone to manyclass= onetomany Orders />
</set>
</class>
</hibernate mapping>
这个里面 其他都很简答了 其中<generatorclass= increment />表示主键值自动增加 这个主要针对字符串对应的 主要体现多对以的是
<setnamesetname= orderses inverse= true lazy= true cascade= all >
<key>
<columnnamecolumnname= CUSTOMER_id precision= scale= not null= true />
</key>
<one to manyclassone to manyclass= onetomany Orders />
</set>
其中 set表示 对应集合 fetch和lazy主要是用来级联查询的 而cascade和inverse主要是用来级联插入和修改的 这几个主要包括对集合的控制 <one to manyclass= onetomany Orders />表示对应类 即set里面包含的类 而key主要是用于确定set里面对应表单列
ORDERS的hbm
<xmlversionxmlversion= encoding= utf >
<!DOCTYPEhibernate mappingPUBLIC //Hibernate/HibernateMappingDTD //EN
mapping dtd >
<!
MappingfileautogeneratedbyMyEclipsePersistenceTools
>
<hibernate mapping>
<classcatalogclasscatalog= DBTEST name= onetomany Orders schema= dbo table= ORDERS >
<idnameidname= id type= java lang Long >
<columnnamecolumnname= id precision= scale= />
<generatorclassgeneratorclass= increment />
</id>
<many to oneclas any to oneclass= onetomany Customer fetch= select name= customer >
<columnnamecolumnname= CUSTOMER_id precision= scale= />
</many to one>
<propertygeneratedpropertygenerated= never lazy= false name= orderNumber type= java lang String >
<columnlengthcolumnlength= name= ORDER_NUMBER />
</property>
<propertygeneratedpropertygenerated= never lazy= false name= price type= java lang Double >
<columnnamecolumnname= PRICE precision= scale= />
</property>
</class>
</hibernate mapping>
<many to oneclas any to oneclass= onetomany Customer fetch= select name= customer >
<columnnamecolumnname= CUSTOMER_id precision= scale= />
</many to one>
表示CUSTOMER熟悉对应的类 和其作为key的列名 上面这些都可以在MyEclipse里面自动生成 另外注意的一点是 在生成的DAO里面 涉及表单 *** 作的save()和delete()方法 必须要事件提交 数据库才有反映 可以就该Hibernate xml 或者用下面这样代码来实现
Sessionse=getSession();
Transactiontx=se beginTransaction();
se delete(persistentInstance);
//se save(instance);
mit();
验证效果
新增用户
如果新增一个用户 该用户里面包含有两个表单 那么 由于持久层已经实现了逻辑关系 只要用户类里面的set包含了表单 则表单可以自动增加 实现代码
CustomerDAOcd=newCustomerDAO();
Customerxd=newCustomer( 王小虎 null);
Ordersord =newOrders();
ord setCustomer(xd);
ord setOrderNumber( 王小虎的买单 );
Ordersord =newOrders();
ord setCustomer(xd);
ord setOrderNumber( 王小虎的买单 );
Setrderses=newHashSet();
orderses add(ord );
orderses add(ord );
xd setOrderses(orderses);
cd save(xd);
代码里面 加入一个王小虎用户 两个订单 通过setOrderses加入 只使用cd save这一个对持久层 *** 作 完成后查询
王小虎
=================================
王小虎的买单
王小虎的买单
显示 CUSTOMER里面加入了王小虎 ORDERS里面也加入他的订单
删除 *** 作
List<Customer>csList=cd findByProperty( name 王小虎 );
for(Customercs:csList){
cd delete(cs);
}
这个很简单了 通过其中findByProperty( name 王小虎 );对应SQL为deletefromtableCUSTOMERwherename= 王小虎 ;删除了王小虎 而ORDERS里面 王小虎对应的表单也同时被删除
小小总结
lishixinzhi/Article/program/Java/ky/201311/28543
以上就是关于hibernate 查询数据库,如何得到表头信息全部的内容,包括:hibernate 查询数据库,如何得到表头信息、hibernate查询多张表,并且页面显示查询结果怎么整、Hibernate中的order的排序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)