- 浏览: 308081 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ae6623:
ae6623 写道大哥,你是怎么知道它对临时文件有限制的,我也 ...
导出excel2007 poi3.8 -
ae6623:
大哥,你是怎么知道它对临时文件有限制的,我也发现这个bug了, ...
导出excel2007 poi3.8 -
coralandbill:
下载不了啊 能不能给我发一个simpleProj.war包啊 ...
jqgrid使用步骤及说明 -
maojin:
这是jqgrid几?那个电话号码校验的函数能调到吗?
jqgrid使用步骤及说明 -
qingyezhu:
请问,用poi3.8中的wordtohtmlconver类将d ...
导出excel2007 poi3.8
使用iBatis开发已经有一年了,这一年来不管愿意不愿意,喜欢不喜欢,都得用,想用Hibernate不行。
随着对iBatis的熟悉,渐渐发现初次接触的人因为不能很好的掌握iBatis使用的方法而对其有一些偏激的看法。
1、iBatis的是用来自由写SQL的,对SQL语句的简单的封装,相当于在JDBC上加了层外壳。
我认为,iBatis的目标是简化JDBC的操作,对SQL的查询结果做了很好的映射封装,这样查询的结果就形成了一个java对象、集合、或者Map等。这样的数据结构相比JDBC结果集的处理是一个质的飞跃。
iBatis虽然支持随意的SQL查询,并且对查询结果集也没有什么特别限制,最懒惰的是定义查询结果集类型为map。但是,这并不是
iBatis设计者的本意,我认为,在使用iBatis的时候,尽可能写通用的增删改差sql,然后通过通过这些sql所对应DAO方法的组合,来实现各
种业务,而不是写很多特殊的sql、甚至存储过程。当你在更换数据库的时候,移植这些特殊sql和过程就是一件很困难的事情。
2、iBatis映射太麻烦,表字段和实体(Entity,也有人称POJO)对应比较麻烦,不够直观,开发困难。
其实,最好的做法就是使用数据库表字段名作为实体的属性名,这样完全对应起来,问题就解决了。并且,可以写个工具,从数据库生成POJO和SQLMap、DAO、Service等等。这样可以极大提高效率,我就这么做的。
3、iBatis分页是内存分页,假分页
的确如此,对于小数据量是够用了,对于大数据量,这是不可接受的。因此可以通过动态SqL来拼装分页查询Sql。
<
dynamic
prepend="">
< isNotNull property ="_start" >
< isNotNull property ="_size" >
limit #_start#, #_size#
</ isNotNull >
</ isNotNull >
</ dynamic >
< isNotNull property ="_start" >
< isNotNull property ="_size" >
limit #_start#, #_size#
</ isNotNull >
</ isNotNull >
</ dynamic >
4、iBatis无法做成Hibernate那样的关连查询、级联保存、级联删除。
iBatis可以做到,而且实现很灵活方便。但是比Hibernate操作更容易,也很好理解。这里面对结果集映射类型也很讲究。
<
resultMap
id
="result_base"
class
="Channel"
>
< result property ="id" column ="id" />
< result property ="stationid" column ="stationid" />
< result property ="remark" column ="remark" />
< result property ="status" column ="status" />
</ resultMap >
< resultMap id ="result" class ="Channel" extends ="channel.result_base" >
< result property ="cfgList" column ="id" select ="videoregxp.findByChannelId" />
</ resultMap >
< result property ="id" column ="id" />
< result property ="stationid" column ="stationid" />
< result property ="remark" column ="remark" />
< result property ="status" column ="status" />
</ resultMap >
< resultMap id ="result" class ="Channel" extends ="channel.result_base" >
< result property ="cfgList" column ="id" select ="videoregxp.findByChannelId" />
</ resultMap >
<
resultMap
id
="result_base"
class
="Videoregxp"
>
< result property ="id" column ="id" />
< result property ="lmid" column ="lmid" />
< result property ="name" column ="name" />
< result property ="cname" column ="cname" />
< result property ="sortnum" column ="sortnum" />
< result property ="remark" column ="remark" />
</ resultMap >
< resultMap id ="result" class ="Videoregxp" extends ="videoregxp.result_base" >
< result property ="regex" column ="id" select ="regexpar.findByVideoregxpId" />
</ resultMap >
< result property ="id" column ="id" />
< result property ="lmid" column ="lmid" />
< result property ="name" column ="name" />
< result property ="cname" column ="cname" />
< result property ="sortnum" column ="sortnum" />
< result property ="remark" column ="remark" />
</ resultMap >
< resultMap id ="result" class ="Videoregxp" extends ="videoregxp.result_base" >
< result property ="regex" column ="id" select ="regexpar.findByVideoregxpId" />
</ resultMap >
/**
* 保存一个视频信息,级联保存相关的剧集和视频分段文件
*
* @param videoinfo 视频信息对象
* @return 返回保存后的对象
*/
public Videoinfo saveVideoinfoWithCascade(Videoinfo videoinfo) {
videoinfoDAO.saveVideoinfo(videoinfo);
for (Juji juji : videoinfo.getJujiList()) {
juji.setVideoid(videoinfo.getId());
jujiDAO.saveJuji(juji);
for (Secfiles file : juji.getSecfileList()) {
file.setSegmentid(juji.getId());
secfilesDAO.saveSecfiles(file);
}
}
return videoinfo;
}
* 保存一个视频信息,级联保存相关的剧集和视频分段文件
*
* @param videoinfo 视频信息对象
* @return 返回保存后的对象
*/
public Videoinfo saveVideoinfoWithCascade(Videoinfo videoinfo) {
videoinfoDAO.saveVideoinfo(videoinfo);
for (Juji juji : videoinfo.getJujiList()) {
juji.setVideoid(videoinfo.getId());
jujiDAO.saveJuji(juji);
for (Secfiles file : juji.getSecfileList()) {
file.setSegmentid(juji.getId());
secfilesDAO.saveSecfiles(file);
}
}
return videoinfo;
}
/**
* 删除指定标识的一个栏目
*
* @param id 栏目标识
*/
public void deleteChannelById(Long id) {
//todo:做可行性校验,以及级联删除等操作,并做业务特殊需求校验
Channel ch = channelDAO.findChannelById(id);
for (Videoregxp v : ch.getCfgList()) {
regexparDAO.deleteRegexparByCfgId(v.getId());
}
videoregxpDAO.deleteVideoregxpByLmId(ch.getId());
channelDAO.deleteChannelById(id);
}
* 删除指定标识的一个栏目
*
* @param id 栏目标识
*/
public void deleteChannelById(Long id) {
//todo:做可行性校验,以及级联删除等操作,并做业务特殊需求校验
Channel ch = channelDAO.findChannelById(id);
for (Videoregxp v : ch.getCfgList()) {
regexparDAO.deleteRegexparByCfgId(v.getId());
}
videoregxpDAO.deleteVideoregxpByLmId(ch.getId());
channelDAO.deleteChannelById(id);
}
5、iBatis延迟加载好像有问题,本人现在不能确信。
6、iBatis用熟悉了和Hibernate一样容易,通过自己开发工具,可以极大提高开发效率。我会在附件贡献出我的代码生成工具。
7、iBatis的cache缓存没感觉到有多大优势,也没感觉性能的提升。
8、iBatis的动态SQL功能强大,Map参数更能获取最大的灵活性,这是Hibernate和其他持久化框架所无法相比的。
<
select
id
="findByParams"
parameterClass
="map"
resultMap
="channel.result"
>
< include refid ="sql_select" />
< include refid ="sql_where" />
</ select >
< include refid ="sql_select" />
< include refid ="sql_where" />
</ select >
/**
* 根据动态条件查询栏目
*
* @param map 参数map
* @return 查询结果集
*/
public List<Channel> findChannelByParams(Map map) {
return getSqlMapClientTemplate().queryForList("channel.findByParams" , map);
}
* 根据动态条件查询栏目
*
* @param map 参数map
* @return 查询结果集
*/
public List<Channel> findChannelByParams(Map map) {
return getSqlMapClientTemplate().queryForList("channel.findByParams" , map);
}
但是map参数也缺乏明确性,使用者无法清楚知道map参数里面究竟可以传什么类型,但是使用者可以通过查看sqlMap进一步获得对参数的详细认识,比如上面的完整SQLMap片段是:
<!-- 动态条件分页查询
-->
< sql id ="sql_count" >
select count(*)
</ sql >
< sql id ="sql_select" >
select *
</ sql >
< sql id ="sql_where" >
from channel
< dynamic prepend ="where" >
< isNotNull prepend ="and" property ="stationid" >
stationid = #stationid#
</ isNotNull >
< isNotEmpty prepend ="and" property ="name" >
name like '%$name$%'
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="url" >
url like '%$url$%'
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="regxp" >
regxp like '$regxp$%'
</ isNotEmpty >
< isNotNull prepend ="and" property ="encoding" >
encoding = #encoding#
</ isNotNull >
< isNotEmpty prepend ="and" property ="_timeout_ge" >
<![CDATA[
timeout >= #_timeout_ge#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_timeout_lt" >
<![CDATA[
timeout < #_timeout_lt#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_maxrow_ge" >
<![CDATA[
maxrow >= #_maxrow_ge#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_maxrow_lt" >
<![CDATA[
maxrow < #_maxrow_lt#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_start_ge" >
<![CDATA[
start >= #_start_ge#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_start_lt" >
<![CDATA[
start < #_start_lt#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="pagereg" >
pagereg like '%$pagereg$%'
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="kind" >
kind = #kind#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="mapname" >
mapname = #mapname#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="replaceb" >
replaceb = #replaceb#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="replacea" >
replacea = #replacea#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="ifredo" >
ifredo = #ifredo#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="fenbianlv" >
fenbianlv = #fenbianlv#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_size_ge" >
<![CDATA[
size >= #_size_ge#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_size_lt" >
<![CDATA[
size < #_size_lt#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="remark" >
remark like '%$remark$%'
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="status" >
status = #status#
</ isNotEmpty >
</ dynamic >
< dynamic prepend="">
< isNotNull property ="_start" >
< isNotNull property ="_size" >
limit #_start#, #_size#
</ isNotNull >
</ isNotNull >
</ dynamic >
</ sql >
< select id ="findByParamsForCount" parameterClass ="map" resultClass ="int" >
< include refid ="sql_count" />
< include refid ="sql_where" />
</ select >
< select id ="findByParams" parameterClass ="map" resultMap ="channel.result" >
< include refid ="sql_select" />
< include refid ="sql_where" />
</ select >
< sql id ="sql_count" >
select count(*)
</ sql >
< sql id ="sql_select" >
select *
</ sql >
< sql id ="sql_where" >
from channel
< dynamic prepend ="where" >
< isNotNull prepend ="and" property ="stationid" >
stationid = #stationid#
</ isNotNull >
< isNotEmpty prepend ="and" property ="name" >
name like '%$name$%'
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="url" >
url like '%$url$%'
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="regxp" >
regxp like '$regxp$%'
</ isNotEmpty >
< isNotNull prepend ="and" property ="encoding" >
encoding = #encoding#
</ isNotNull >
< isNotEmpty prepend ="and" property ="_timeout_ge" >
<![CDATA[
timeout >= #_timeout_ge#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_timeout_lt" >
<![CDATA[
timeout < #_timeout_lt#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_maxrow_ge" >
<![CDATA[
maxrow >= #_maxrow_ge#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_maxrow_lt" >
<![CDATA[
maxrow < #_maxrow_lt#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_start_ge" >
<![CDATA[
start >= #_start_ge#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_start_lt" >
<![CDATA[
start < #_start_lt#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="pagereg" >
pagereg like '%$pagereg$%'
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="kind" >
kind = #kind#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="mapname" >
mapname = #mapname#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="replaceb" >
replaceb = #replaceb#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="replacea" >
replacea = #replacea#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="ifredo" >
ifredo = #ifredo#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="fenbianlv" >
fenbianlv = #fenbianlv#
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_size_ge" >
<![CDATA[
size >= #_size_ge#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="_size_lt" >
<![CDATA[
size < #_size_lt#
]]>
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="remark" >
remark like '%$remark$%'
</ isNotEmpty >
< isNotEmpty prepend ="and" property ="status" >
status = #status#
</ isNotEmpty >
</ dynamic >
< dynamic prepend="">
< isNotNull property ="_start" >
< isNotNull property ="_size" >
limit #_start#, #_size#
</ isNotNull >
</ isNotNull >
</ dynamic >
</ sql >
< select id ="findByParamsForCount" parameterClass ="map" resultClass ="int" >
< include refid ="sql_count" />
< include refid ="sql_where" />
</ select >
< select id ="findByParams" parameterClass ="map" resultMap ="channel.result" >
< include refid ="sql_select" />
< include refid ="sql_where" />
</ select >
通过上面的映射,我们可以很清楚的看到,SQL的片段得到了重用,分页很优雅,统计和全功能查询也非常强大,相比hibernate,有过之而无不及,当然如果你不会这么用,那就麻烦多了。
9、我认为,iBatis应该尽量使用单表增删改差业务来组合功能更为强大的业务操作。但并不排斥使用多表关联进行查询,多表关联查询,结果集往往需要定义新的JavaBean来进行存储,但也可以简单的返回一个Map来存储结果集。
<!-- 动态条件分页查询
-->
< sql id ="sql_count" >
select count(a.*)
</ sql >
< sql id ="sql_select" >
select a.id vid,
a.img imgurl,
a.img_s imgfile,
b.vfilename vfilename,
c.id sid,
c.url url,
c.filename filename,
c.status status
</ sql >
< sql id ="sql_where" >
From secfiles c, juji b, videoinfo a
where
a.id = b. videoid
and b.id = c.segmentid
and c.status = 0
< dynamic prepend="">
< isNotNull property ="_start" >
< isNotNull property ="_size" >
limit #_start#, #_size#
</ isNotNull >
</ isNotNull >
</ dynamic >
</ sql >
<!-- 返回没有下载的记录总数 -->
< select id ="getUndownFilesForCount" parameterClass ="map" resultClass ="int" >
< include refid ="sql_count" />
< include refid ="sql_where" />
</ select >
<!-- 返回没有下载的记录 -->
< select id ="getUndownFiles" parameterClass ="map" resultClass ="java.util.HashMap" >
< include refid ="sql_select" />
< include refid ="sql_where" />
</ select >
< sql id ="sql_count" >
select count(a.*)
</ sql >
< sql id ="sql_select" >
select a.id vid,
a.img imgurl,
a.img_s imgfile,
b.vfilename vfilename,
c.id sid,
c.url url,
c.filename filename,
c.status status
</ sql >
< sql id ="sql_where" >
From secfiles c, juji b, videoinfo a
where
a.id = b. videoid
and b.id = c.segmentid
and c.status = 0
< dynamic prepend="">
< isNotNull property ="_start" >
< isNotNull property ="_size" >
limit #_start#, #_size#
</ isNotNull >
</ isNotNull >
</ dynamic >
</ sql >
<!-- 返回没有下载的记录总数 -->
< select id ="getUndownFilesForCount" parameterClass ="map" resultClass ="int" >
< include refid ="sql_count" />
< include refid ="sql_where" />
</ select >
<!-- 返回没有下载的记录 -->
< select id ="getUndownFiles" parameterClass ="map" resultClass ="java.util.HashMap" >
< include refid ="sql_select" />
< include refid ="sql_where" />
</ select >
在上面,我们的结果集返回为resultClass="java.util.HashMap",这时候,需要根据字
段的名称来取值,值类型为Object,key类型为String,这点要注意了:
public
List<Map<String,Object>> findUndownFiles(Map map) {
return getSqlMapClientTemplate().queryForList("secfiles.getUndownFiles" , map);
}
return getSqlMapClientTemplate().queryForList("secfiles.getUndownFiles" , map);
}
public
void
test_findUndownFiles() {
List<Map<String, Object>> co = ser.findUndownFiles(new HashMap());
StringBuilder s = new StringBuilder();
for (Map<String, Object> map : co) {
System.out.println("---------------------------" );
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.print(entry.getKey()+"\t" );
System.out.println(entry.getValue());
}
}
}
List<Map<String, Object>> co = ser.findUndownFiles(new HashMap());
StringBuilder s = new StringBuilder();
for (Map<String, Object> map : co) {
System.out.println("---------------------------" );
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.print(entry.getKey()+"\t" );
System.out.println(entry.getValue());
}
}
}
打印结果:
---------------------------
sid 1
vfilename 200905252009235799
url http://d18.v.iask.com/f/1/f47817a394730dc682e660b943e84cc41006606.flv
status 0
filename 200905252009235799-00.flv
imgfile 200905252009234399.jpg
vid 1
imgurl http://p4.v.iask.com/95/595/1757503_1.jpg
---------------------------
sid 2130
vfilename 2009062615063867492
url http://lz.dhot.v.iask.com/f/1/0ee2ae8b973988f6a93c071c8045ca5217266409.mp4
status 0
filename 2009062615063867492-00.mp4
imgfile 2009062615063825434.jpg
vid 93
imgurl http://cache.mars.sina.com.cn/nd/movievideo//thumb/2/1502_120160.jpg
---------------------------
sid 2131
vfilename 2009062615064184076
url http://lz5.dhot.v.iask.com/f/1/36d3dadacb8d6bda434a58e7418ad3cc19037464.flv
status 0
filename 2009062615064184076-00.flv
imgfile 2009062615064136733.jpg
vid 94
imgurl http://cache.mars.sina.com.cn/nd/movievideo//thumb/6/2106_120160.jpg
sid 1
vfilename 200905252009235799
url http://d18.v.iask.com/f/1/f47817a394730dc682e660b943e84cc41006606.flv
status 0
filename 200905252009235799-00.flv
imgfile 200905252009234399.jpg
vid 1
imgurl http://p4.v.iask.com/95/595/1757503_1.jpg
---------------------------
sid 2130
vfilename 2009062615063867492
url http://lz.dhot.v.iask.com/f/1/0ee2ae8b973988f6a93c071c8045ca5217266409.mp4
status 0
filename 2009062615063867492-00.mp4
imgfile 2009062615063825434.jpg
vid 93
imgurl http://cache.mars.sina.com.cn/nd/movievideo//thumb/2/1502_120160.jpg
---------------------------
sid 2131
vfilename 2009062615064184076
url http://lz5.dhot.v.iask.com/f/1/36d3dadacb8d6bda434a58e7418ad3cc19037464.flv
status 0
filename 2009062615064184076-00.flv
imgfile 2009062615064136733.jpg
vid 94
imgurl http://cache.mars.sina.com.cn/nd/movievideo//thumb/6/2106_120160.jpg
发表评论
-
JVM配置详解及调优
2012-06-21 14:13 1180堆大小设置 JVM 中最大 ... -
WABACUS框架介绍
2012-05-17 10:07 2152... -
JAVA开发性能调优
2012-05-09 11:41 1033下面是参考网络资源总结的一些在Java编程中尽可能要做到 ... -
使用WFetch查看HTTP请求、响应报文
2012-05-07 10:36 1349WFetch界面比较简陋,但是已经满足我的一般需求了。想 ... -
java命令行指定JDK运行环境
2011-12-14 22:05 2842set path=C:/Program Files/J ... -
关于struts2 遍历Map最全的总结
2011-04-06 16:44 1040Struts2 中iterator标签遍 ... -
Struts2+JSON+jQuery实现异步交互数据时选择要序列化的属性(一注解方式)
2011-03-29 00:59 1623在使用Struts2的JSON插件,实现Action中的属性序 ... -
struts2 + jquery struts2 处理json
2011-03-28 14:10 2470<package name="default& ... -
cascade 与 inverse区别
2011-03-15 09:58 1064一、cascade 1.概述 ... -
hibernate fetch的select 和 join的区别
2011-03-11 17:15 3710join 查询的时候,是用一条语句查处所有记录,包括关联表记录 ... -
深入struts2的配置文件 struts2标签解释
2011-03-08 22:59 1739[color=darkred][/color]深入struts ... -
ajax访问SSH2返回connect异常的处理
2011-03-08 22:38 1547在struts2 pojo action中有对象属性的,并被h ... -
SSH2整合设计 事务管理
2011-03-08 22:27 1604ssh2整合SSH2整合 2009-12-02 09:31:4 ... -
ssh dao设计
2011-03-07 23:45 1190spring和hibernate 泛型:http://lbxh ... -
ldap查询条件
2010-08-30 09:19 2627定义查询过滤器(Search Filter Definitio ... -
在CXF中用JAXB数据绑定支持HashMap类型
2010-07-22 10:00 1675在CXF中用JAXB数据绑定支持HashMap类型 ... -
java.lang.NoSuchMethodError: com.sun.xml.ws.api.server.WSEndpoint.getPolicyMap()
2010-07-20 16:42 4581在使用CXF 和spring发布WEB服务时出现了java.l ... -
jax ws 注释详解
2010-07-09 10:38 2763基于 XML 的 Web Service 的 Java A ... -
Rest 和 soap比较
2010-07-07 15:48 1186我有这样一个推断,在计算机世界中,但凡那些让开发人员记住的重要 ... -
serviceMix发布webservice服务
2010-07-07 09:44 2970利用serviceMix对外发布外部的webservice服务 ...
相关推荐
在Java编程中,级联查询和分页查询是数据库操作中的常见需求,特别是在处理大量数据时。级联查询用于获取一个实体的相关实体信息,而分页查询则用于提高查询效率和用户体验,避免一次性加载过多数据导致性能下降。...
“Hibernate 级联查询”是指在使用Hibernate这个Java持久化框架时,如何处理对象之间的关联查询。Hibernate提供了级联操作来简化数据的保存、更新和删除等操作,使得开发者无需手动编写复杂的SQL语句,就能实现关联...
2015年最新最全的省市区街道级联查询
"Ajax+SSH实现省份城市级联查询"是一个典型的示例,展示了如何利用这些技术提高用户体验,减少服务器负载。在此,我们将深入探讨Ajax、Spring、Hibernate和Struts2这四个关键技术以及它们在实现级联查询中的作用。 ...
省市区sql文件 单表
在IT领域,动态实现下拉列表框的三级级联查询是一项常见的前端交互功能,它能够为用户提供更加便捷的导航和筛选体验。在这个场景中,我们使用JSP(JavaServer Pages)脚本语言来实现这一功能。JSP是Java平台上的...
DB2作为一款成熟的关系型数据库管理系统,提供了跨数据库级联查询的功能,使得对不同数据库中的数据进行统一管理和查询成为可能。DB2跨库级联查询不仅能够提高数据管理的效率,还能有效解决数据量大、差异小的问题,...
利用javascript+json实现级联查询
文件包括了:项目工程(关键部分注解详细),以及sql文件。功能:选中第一个下拉框,局部刷新第二个下拉框的值,且每次选中第一个下拉框,第二个下拉框都会有对应的值提供选择。主要使用了MySQL,jdbc,servlet,jsp...
行政区域级联查询js,可引用至网页。。
Oracle数据库中的级联查询、级联删除和级联更新是数据库设计中常用的操作,它们用于在多表关联的关系型数据库中实现数据的联动处理。在Oracle中,这些操作主要涉及外键约束和触发器。 首先,级联查询是通过自连接来...
本主题聚焦于“Jquery实现ajax二级级联查询”,这是一个常见的前端交互设计,常见于下拉菜单联动,例如省份选择后自动更新城市选择。在这个场景中,我们通常会利用服务器端(如JSP或Servlet)动态生成XML文件,因为...
本项目围绕“级联查询”和“商品上下架审核”这两个核心功能进行阐述,旨在提供一个可以直接使用的小型项目模板,适合初学者理解和实践。 首先,级联查询是数据库操作中的一个重要概念,尤其是在复杂业务场景下。在...
在Java编程中,实现两个表的级联查询是数据库操作中的常见需求,特别是在处理关联数据时。级联查询涉及到从一个表中获取数据,并根据这些数据进一步查询另一个表,以获得更完整的信息。这里我们将深入探讨如何在Java...
在IT领域,级联失效(Cascading Failure)是一种复杂的现象,特别是在网络系统中,如电力网格、互联网或通信网络。当一个组件故障时,它可能导致其他相关组件相继失效,从而引发大规模的系统崩溃。MATLAB作为一种...
创建数据库,创建一个客户表(customer), 包括客户id,姓名(name),年龄(age),职业(occupation)...应用Mybatis级联查询功能,根据客户id查询表记录信息映射到Customer类对象(包括id,姓名, 年龄,职业,卡号,卡级别)
本示例中,我们将探讨如何使用`aggregate`进行级联查询,以获取特定公司下发表有效文章最多的前十个客户的信息。首先,我们需要了解涉及的三个数据模型:Account、Customer和Article。 Account模型代表公司信息,...
级联菜单的数据通常存储在多层关联的表结构中,Hibernate可以通过HQL(Hibernate Query Language)或 Criteria API 查询这些数据。 4. **级联菜单的概念**:级联菜单,也称为下拉菜单或子菜单,是指菜单项展开后...
用户选择了一个选项,然后javascript脚本将该选项的值传递给服务器,服务器端的脚本将根据该值从数据库中查询相关数据,并将其返回给客户端,然后客户端根据返回的数据生成下一个级联菜单。 动态级联菜单的实现 ...