心的方向

新的征途......
posts - 75,comments - 19,trackbacks - 0

今天要实现一个在页面中动态添加以及删除一行列表的功能,查找了几种方法,在此备份,以便日后使用:

========================此方法比较简洁,而且可以解决问题========================
function deleteCurrentRow()//刪除當前行
{
  var currRowIndex=event.srcElement.parentNode.parentNode.rowIndex;
  document.all.table10.deleteRow(currRowIndex);//table10--表格id
}


function insertRow()
{
  var nRow=document.all.table10.rows.length; //表格的總行數
  var objTheRow=document.all.table10.insertRow(nRow);//在最下邊新增一行
  objTheRow.insertCell(0);//新增一個單元格
  objTheRow.insertCell(1);
  objTheRow.insertCell(2);
  objTheRow.cells(0).innerHTML=nRow;//對新增的單元格?容
  objTheRow.cells(1).innerHTML=" ";
  objTheRow.cells(2).innerHTML="<input type='button' value='del this row' onClick='deleteCurrentRow()'>";
}

====================我的程序代码======================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=GB18030">
<META name="GENERATOR" content="IBM WebSphere Studio">
<TITLE>cfbcard.html</TITLE>
</HEAD>

<SCRIPT language="JavaScript">
var j_1 = 1;
function add_row_family(){
 newRow=document.all.family.insertRow(-1) 
 
 newcell=newRow.insertCell() 
 newRow.bgColor='#FFFFFF';
 newcell.className='STYLE3';
 newcell.align='center';
 //newcell.innerHTML="<input type='text' name='familyname"+j_1+"' style='WIDTH: 60px; font-size:9pt; color:#000000' />";
 newcell.innerHTML="<SELECT name='thesistogether"+j_1+"'>"+
                        " <option value='请选择'>"+
      "   请选择"+
      "  </option>"+
      "  <option value='1'>"+
      "   111"+
      "  </option>"+
      "  <option value='2'>"+
      "   222"+
      "  </option>"+
      "  <option value='3'>"+
      "   333"+
      "  </option>"+
      "  <option value='4'>"+
      "   444"+
      "  </option>"+
      "  <option value='5'>"+
      "   555"+
      "  </option>"+
      
                       "</SELECT>";
 for(var i = 0;i<12;i++){
 newcell=newRow.insertCell() ;
 newRow.bgColor='#FFFFFF';
 newcell.className='STYLE3';
 newcell.align='center';
 newcell.innerHTML="<input type='text' name='familyrelation"+j_1+"' style='WIDTH: 60px; font-size:9pt; color:#000000' />";
}
 
 newcell=newRow.insertCell() ;
 newRow.bgColor='#FFFFFF';
 newcell.className='STYLE3';
 newcell.align='center';
 //newcell.innerHTML="<a href='javascript:delTableRow(\""+1+"\")'>删除</a>";
  newcell.innerHTML="<input type='button' value='删除' onClick='deleteCurrentRow()'>";

 j_1++;
 document.all.j_1.value=j_1;
 document.all.family.focus();
}


 
 
 function deleteCurrentRow()//刪除當前行
{
  var currRowIndex=event.srcElement.parentNode.parentNode.rowIndex;
  document.all.family.deleteRow(currRowIndex);//table10--表格id
}


</script>

<body bgcolor="#F5F1F5"  >

<form name="form1" method="post" action="" onsubmit="">
<table>
<tr>
      <td align="right"><INPUT type="button" name="add" onclick="add_row_family();" value="添加"></td>
</tr>
<tr>
     <td>
 <table id="family" style="width:100%" border="1" cellspacing="1" cellpadding="2" class="tbMain">
        <tr>
   <td class="td_name">111</td>
   <td class="td_name">222</td>
   <td class="td_name">333</td>
   <td class="td_name">444</td>
   <td class="td_name">555</td>
   <td class="td_name">666</td>
   <td class="td_name">777</td>
   <td class="td_name">888</td>
   <td class="td_name">999</td>
   <td class="td_name">000</td>
   <td class="td_name">123</td>
   <td class="td_name">456</td>
   <td class="td_name">789</td>
      <td class="td_name">删除</td>
     </tr>
       
    </table>
    </td>
 </tr>
</table>
</form>
</body>
</html>

=================================另外一种方法==============
如何删除表格的行上次讲到了如何动态给表格增加行,那么这次就讲讲如何删除表格的行了。首先建立一个表格,
<table border="1">
 <tr>
  <td>姓名</td>
  <td>地址</td>
 </tr>
 <tbody id="mainbody">
 <tr id="delCell">
  <td>name</td>
  <td>address</td>
 </tr>
 </tbody>
</table>
取得tbody的元素var mailbody = document.getElementById("mainbody");,
接着取得要删除行的元素var cell = document.getElementById("delCell");
最后就是从tbody中移去要删除的行就可以了mainbody.removeChild(cell);
完整的代码如下:
<html>
<head>
 <title>动态删除表格的行</title>
 <script type="text/javascript">
 function deleteCell(){
  var mailbody = document.getElementById("mainbody");
  var cell = document.getElementById("delCell");
  if(cell!=undefined){
     mainbody.removeChild(cell);
  }
 }
</script>
</head>
<body>
<table border="1">
 <tr>
  <td>姓名</td>
  <td>地址</td>
 </tr>
 <tbody id="mainbody">
 <tr id="delCell">
  <td>name</td>
  <td>address</td>
 </tr>
 </tbody>
</table>

<input type="button" value="删除" onclick="deleteCell()"/>
</body>
<html>

posted @ 2007-04-18 23:49 阿伟 阅读(2934) | 评论 (2)编辑 收藏

在jsp中使用smartupload组件上传文件[转]

jsp对上传文件的支持不象php中支持的那么好,直接做成了函数,也不象asp中要通过组件才能实现。jsp中可以通过javabean来实现。但是我们没有必要自己去写一个上载的bean,在网上已经有了很多成型的技术,smartupload就是其中的一个。但是smartupload是将文件先读到服务器的内存中,所以上传太大的文件(超过100兆)有可能会出问题,也算是一个美中不足吧:)

   先说一下提交的页面,smartupload组件要求用字节流的方式来提交<FORM action="upload.jsp"  encType=multipart/form-data method=post>。下面就是个例子upload.htm:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)
http://localhost:8080/jspsmartfile/jsp/uploadTemplate.jsp -->
<HTML><HEAD>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY bgColor=#e6e6e6><BR>
<FORM action="upload.jsp"  encType=multipart/form-data method=post>
<TABLE>
  <TBODY>
  <TR>
    <TD><FONT color=#000000 face=helv,helvetica size=1>&nbsp;&nbsp;File 
      :&nbsp;</FONT>&nbsp;&nbsp;<INPUT  size=60 type=file  name="file"></TD></TR>
        <TR>
    <TR>
    <TD><FONT color=#000000 face=helv,helvetica size=1>&nbsp;&nbsp;File 
      :&nbsp;</FONT>&nbsp;&nbsp;<INPUT  size=60 type=file  name="file1"></TD></TR>
        <TR>  
    <TD><FONT color=#000000 face=helv,helvetica size=1>&nbsp;&nbsp;File 
      :&nbsp;</FONT>&nbsp;&nbsp;<INPUT  size=60 type=text  name="text"></TD></TR>
  <TR>
    <TD
align=right><INPUT type=submit value=Send name="send"></TD></TR></TBODY></TABLE></FORM></BODY></HTML>

  再来看一下接收的页面 ,我们把文件上传到服务器以后就直接把它再存入数据库中:upload.jsp

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<%@ page import="com.jspsmart.upload.*" %>
<%@ page import="DBstep.iDBManager2000.*"%>
<%
   
//实例化上载bean
    com.jspsmart.upload.SmartUpload mySmartUpload=new com.jspsmart.upload.SmartUpload();
   
//初始化
    mySmartUpload.initialize(pageContext); 
   
//设置上载的最大值
    mySmartUpload.setMaxFileSize(500 * 1024*1024);
   
//上载文件
    mySmartUpload.upload();
  
//循环取得所有上载的文件
   for (int i=0;i<mySmartUpload.getFiles().getCount();i++){
  
//取得上载的文件
   com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);
   if (!myFile.isMissing())
    {
  
//取得上载的文件的文件名
    String myFileName=myFile.getFileName();
   
//取得不带后缀的文件名
    String  suffix=myFileName.substring(0,myFileName.lastIndexOf('.'));
   
//取得后缀名
    String  ext= mySmartUpload.getFiles().getFile(0).getFileExt();  
   
//取得文件的大小 
    int fileSize=myFile.getSize();
   
//保存路径
    String aa=getServletContext().getRealPath("/")+"jsp\\";
    String trace=aa+myFileName;
   
//取得别的参数
    String explain=(String)mySmartUpload.getRequest().getParameter("text");
    String send=(String)mySmartUpload.getRequest().getParameter("send");
   
//将文件保存在服务器端
    myFile.saveAs(trace,mySmartUpload.SAVE_PHYSICAL);
   
//下面的是将上载的文件保存到数据库中
   
//将文件读到流中
    java.io.File file = new java.io.File(trace);
    java.io.FileInputStream fis = new java.io.FileInputStream(file);
  out.println(file.length());
  
//打开数据库
   ResultSet result=null;
   String mSql=null;
   PreparedStatement prestmt=null;
   DBstep.iDBManager2000 DbaObj=new DBstep.iDBManager2000();
   DbaObj.OpenConnection();
  
//将文件写到数据库中
   mSql="insert into marklist (markname,password,marksize,markdate,MarkBody) values (?,?,?,?,?)";
   prestmt =DbaObj.Conn.prepareStatement(mSql);
   prestmt.setString(1, "aaa1");
   prestmt.setString(2, "0000");
   prestmt.setInt(3, fileSize);
   prestmt.setString(4, DbaObj.GetDateTime());
   prestmt.setBinaryStream(5,fis,(int)file.length());
   DbaObj.Conn.setAutoCommit(true) ;
   prestmt.executeUpdate();
   DbaObj.Conn.commit();
   out.println(("上载成功!!!").toString());
   }
   else
   { out.println(("上载失败!!!").toString()); }
   }//与前面的if对应
%>

   再说一下下载,下载分两种情况1。从数据库直接下载2。从服务器上下载

  先说从数据库直接下载的情形:就是把输入流从数据库里读出来,然后转存为文件

<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.sql.*"%>
<%@ page import="java.io.*" %>
<%@ page import="DBstep.iDBManager2000.*"%>
<%
    int bytesum=0;
    int byteread=0;
 
//打开数据库
  ResultSet result=null;
  String Sql=null;
  PreparedStatement prestmt=null;
  DBstep.iDBManager2000 DbaObj=new DBstep.iDBManager2000();
  DbaObj.OpenConnection();
 
//取得数据库中的数据
 Sql="select  *  from  t_local_zhongzhuan ";
 result=DbaObj.ExecuteQuery(Sql);
 result.next();

 //将数据库中的数据读到流中
InputStream inStream=result.getBinaryStream("content");
FileOutputStream fs=new FileOutputStream( "c:/dffdsafd.doc");

  byte[]  buffer =new  byte[1444];
int length;
    while ((byteread=inStream.read(buffer))!=-1)
    {
       out.println("<DT><B>"+byteread+"</B></DT>");
       bytesum+=byteread;
       System.out.println(bytesum);
   
   
       fs.write(buffer,0,byteread);
     }
%>

再说从服务器上下载的情形:

<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.io.*" %>
<%
  String fileName = "zsc104.swf".toString();
f//读到流中
InputStream inStream=new FileInputStream("c:/zsc104.swf");
 
//设置输出的格式
  response.reset();
  response.setContentType("bin");
  response.addHeader("Content-Disposition","attachment; filename=\"" + fileName + "\"");
 
//循环取出流中的数据
  byte[] b = new byte[100];
  int len;
  while((len=inStream.read(b)) >0)
  response.getOutputStream().write(b,0,len);  
  inStream.close();
%>

   好了,到这里只要不是太大的文件的上传下载的操作都可以完成了。

posted @ 2007-04-13 14:10 阿伟 阅读(311) | 评论 (0)编辑 收藏


在页面中先设置一个hidden来传递参数以便其他页面用request.getParameter()获得,

hidden必须写在窗体form中,而且另一个要得到它的页面必须是form中的action指向的页

面,不然得不到。切记!!!

posted @ 2007-04-12 18:26 阿伟 阅读(1967) | 评论 (1)编辑 收藏

很多网页都是框架结构的,在很多的情况下会通过按钮点击事件或链接,跳出框架转到其它界面。例如说点击“注销登录”返回到登录界面。

一、通过运行脚本跳出框架有以下几种写法:

1.  <script language = javascript>window.open('Login.aspx','_top')</script>"

2.  <script language = javascript>window.open('Login.aspx','_parent')</script>"

3. <script language = javascript>window.parent.location.href='login.aspx'</script>

4.    Response.Write("<script>window.parent.opener=null;window.top.close();</script>")

       Response.Write("<script>window.open('index.aspx','');</script>")

       这种方法会先关闭原框架窗口,再重新打开一个新的窗口。这在很多功能界面对浏览器进行了改变设置,而回到登陆界面又用缺省设置的情况下适用。

二、链接跳出框架

这种情况就很简单了,加上 target="_top" 属性就可以了。


posted @ 2007-04-04 13:24 阿伟 阅读(5662) | 评论 (4)编辑 收藏

zilong


文章来源:http://21958978.spaces.live.com/Lists/cns!A7DF246804AD47BB!102
posted @ 2007-03-31 10:49 阿伟 阅读(209) | 评论 (0)编辑 收藏

Hibernate  VS  iBATIS

转之ewolf的工作专栏

简介

Hibernate 是当前最流行的 O/R mapping 框架,当前版本是 3.05 。它出身于 sf.net ,现在已经成为 Jboss 的一部分了

iBATIS 是另外一种优秀的 O/R mapping 框架,当前版本是 2.0 。目前属于 apache 的一个子项目了。

相对 Hibernate O/R ”而言, iBATIS 是一种“ Sql Mapping ”的 ORM 实现。

Hibernate 对数据库结构提供了较为完整的封装, Hibernate O/R Mapping 实现了 POJO 和数据库表之间的映射,以及 SQL 的自动生成和执行。程序员往往只需定义好了 POJO 到数据库表的映射关系,即可通过 Hibernate 提供的方法完成持久层操作。程序员甚至不需要对 SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的 SQL 并调用 JDBC 接口加以执行。

iBATIS 的着力点,则在于 POJO SQL 之间的映射关系。也就是说, iBATIS 并不会为程序员在运行期自动生成 SQL 执行。具体的 SQL 需要程序员编写,然后通过映射配置文件,将 SQL 所需的参数,以及返回的结果字段映射到指定 POJO

使用 iBATIS 提供的 ORM 机制,对业务逻辑实现人员而言,面对的是纯粹的 Java 对象,

这一层与通过 Hibernate 实现 ORM 而言基本一致,而对于具体的数据操作, Hibernate 会自动生成 SQL 语句,而 iBATIS 则要求开发者编写具体的 SQL 语句。相对 Hibernate 而言, iBATIS SQL 开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。

二者的对比:

1.   iBATIS 非常简单易学, Hibernate 相对较复杂,门槛较高。

2.   二者都是比较优秀的开源产品

3.   当系统属于二次开发 , 无法对数据库结构做到控制和修改 , iBATIS 的灵活性将比 Hibernate 更适合

4.   系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的 SQL 语句(或存储过程)才能达到系统性能设计指标。在这种情况下 iBATIS 会有更好的可控性和表现。

5.   iBATIS 需要手写 sql 语句,也可以生成一部分, Hibernate 则基本上可以自动生成,偶尔会写一些 Hql 。同样的需求 ,iBATIS 的工作量比 Hibernate 要大很多。类似的,如果涉及到数据库字段的修改, Hibernate 修改的地方很少,而 iBATIS 要把那些 sql mapping 的地方一一修改。

6.   以数据库字段一一对应映射得到的 PO Hibernte 这种对象化映射得到的 PO 是截然不同的,本质区别在于这种 PO 是扁平化的,不像 Hibernate 映射的 PO 是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。

7.   Hibernate 现在已经是主流 O/R Mapping 框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于 iBATIS

8.   最关键的一句话是 iBATIS 的作者说的:

If you are starting a new project and you're in full control of your object model and database design, Hibernate is a good choice of O/R tool.

If you are accessing any 3rd party databases (e.g. vendor supplied), or you're working with a legacy database, or even just a really poorly designed database, then an O/R mapper might not be capable of handling the situation. That's were an SQL Mapper comes in handy

 

结论:

结论:

Hibernate 和iBATIS可以说是互相补充,共同发展的关系.具体你想用什么要看实际情况.如果看了上面的文字还是拿不定注意,那就Just to try it.实践是检验真理的唯一标准.鞋合不合适,只有试了才知道



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=413018


文章来源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!195.entry
posted @ 2007-03-31 10:49 阿伟 阅读(206) | 评论 (0)编辑 收藏

j2ee的O/R方案真是多,和Hibernate相比,iBatis最大的特点就是小巧,上手很快。看iBatis的文档2小时就会用了,这个O/R Mapping特点就是简单易用。只要有SQL基础,相信你不用教程也能看明白。最新版本2.0(下载)。

构建ibatis基础代码
ibatis 基础代码包括:


1. ibatis 实例配置
一个典型的配置文件如下(具体配置项目的含义见后):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
errorTracingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false"
/>
<transactionManager type="JDBC">
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
<dataSource type="SIMPLE">
<property name="JDBC.Driver"
value="com.p6spy.engine.spy.P6SpyDriver"/>
<property name="JDBC.ConnectionURL"
value="jdbc:mysql://localhost/sample"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="mypass"/>
<property name="Pool.MaximumActiveConnections"
value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime"
value="120000"/>
<property name="Pool.TimeToWait" value="500"/>
<property name="Pool.PingQuery" value="select 1 from
ACCOUNT"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan"
value="1"/>
<property name="Pool.PingConnectionsNotUsedFor"
value="1"/>
</dataSource>
</transactionManager>
<sqlMap resource="com/ibatis/sample/User.xml"/>
</sqlMapConfig>


2. POJO(Plain Ordinary Java Object)
下面是我们用作示例的一个POJO:
public class User implements Serializable {
private Integer id;
private String name;
private Integer sex;
private Set addresses = new HashSet();
/** default constructor */
public User() {
}
public Integer getId() {
return this.id;
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSex() {
return this.sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
}


3. 映射文件
与Hibernate 不同。因为需要人工编写SQL 代码,ibatis 的映射文件一般采
用手动编写(通过Copy/Paste,手工编写映射文件也并没想象中的麻烦)。
针对上面POJO 的映射代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<typeAlias alias="user" type="com.ibatis.sample.User"/>
<select id="getUser"
parameterClass="java.lang.String"
resultClass="user">
<![CDATA[
select
name,
sex
from t_user
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
where name = #name#
]]>
</select>
<update id="updateUser"
parameterClass="user">
<![CDATA[
UPDATE t_user
SET
name=#name#,
sex=#sex#
WHERE id = #id#
]]>
</update>
<insert id="insertUser"
parameterClass="user"
>
INSERT INTO t_user (
name,
sex)
VALUES (
#name#,
#sex#
)
</insert>
<delete id="deleteUser"
parameterClass="java.lang.String">
delete from t_user
where id = #value#
</delete>
</sqlMap>
从上面的映射文件可以看出,通过<insert>、<delete>、<update>、
<select>四个节点,我们分别定义了针对TUser 对象的增删改查操作。在这
四个节点中,我们指定了对应的SQL 语句,以update节点为例:
……
<update id="updateUser" ⑴
parameterClass="user"> ⑵
<![CDATA[ ⑶
UPDATE t_user ⑷
SET (
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
name=#name#, ⑸
sex=#sex# ⑹
)
WHERE id = #id# ⑺
]]>
</update>
……

⑴ ID
指定了操作ID,之后我们可以在代码中通过指定操作id 来执行此节点所定
义的操作,如:
sqlMap.update("updateUser",user);
ID设定使得在一个配置文件中定义两个同名节点成为可能(两个update节
点,以不同id区分)

⑵ parameterClass
指定了操作所需的参数类型, 此例中update 操作以
com.ibatis.sample.User 类型的对象作为参数,目标是将提供的User
实例更新到数据库。
parameterClass="user"中,user为“com.ibatis.sample.User”
类的别名,别名可通过typeAlias节点指定,如示例配置文件中的:
<typeAlias alias="user" type="com.ibatis.sample.User"/>

⑶ <![CDATA[……]]>
通过<![CDATA[……]]>节点,可以避免SQL 中与XML 规范相冲突的字符对
XML映射文件的合法性造成影响。

⑷ 执行更新操作的SQL,这里的SQL 即实际数据库支持的SQL 语句,将由
ibatis填入参数后交给数据库执行。

⑸ SQL中所需的用户名参数,“#name#”在运行期会由传入的user对象的name
属性填充。

⑹ SQL 中所需的用户性别参数“#sex#”,将在运行期由传入的user 对象的
sex属性填充。

⑺ SQL中所需的条件参数“#id#”,将在运行期由传入的user对象的id属性
填充。

对于这个示例,ibatis在运行期会读取id 为“updateUser”的update节点
的SQL定义,并调用指定的user对象的对应getter方法获取属性值,并用此
属性值,对SQL中的参数进行填充后提交数据库执行。
此例对应的应用级代码如下,其中演示了ibatis SQLMap的基本使用方法:
String resource ="com/ibatis/sample/SqlMapConfig.xml";
Reader reader;
reader = Resources.getResourceAsReader(resource);
XmlSqlMapClientBuilder xmlBuilder =
new XmlSqlMapClientBuilder();
SqlMapClient sqlMap = xmlBuilder.buildSqlMap(reader);
(上面代码调试不过可用一下代码代替:
Reader reader = Resources.getResourceAsReader( resource );
  SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);)
//sqlMap系统初始化完毕,开始执行update操作
try{
sqlMap.startTransaction();
User user = new User();
user.setId(new Integer(1));
user.setName("Erica");
user.setSex(new Integer(1));
sqlMap.update("updateUser",user);
sqlMap.commitTransaction();
finally{
sqlMap.endTransaction();
}
其中,SqlMapClient是ibatis运作的核心,所有操作均通过SqlMapClient
实例完成。
可以看出,对于应用层而言,程序员面对的是传统意义上的数据对象,而非JDBC
中烦杂的ResultSet,这使得上层逻辑开发人员的工作量大大减轻,同时代码更
加清晰简洁。
数据库操作在映射文件中加以定义,从而将数据存储逻辑从上层逻辑代码中独立
出来。
而底层数据操作的SQL可配置化,使得我们可以控制最终的数据操作方式,通过
SQL的优化获得最佳的数据库执行效能,这在依赖SQL自动生成的“全自动”ORM
机制中是所难以实现的。
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
ibatis配置
结合上面示例中的ibatis配置文件。下面是对配置文件中各节点的说明:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings ⑴
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
errorTracingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false"
/>
<transactionManager type="JDBC"> ⑵
<dataSource type="SIMPLE"> ⑶
<property name="JDBC.Driver"
value="com.p6spy.engine.spy.P6SpyDriver"/>
<property name="JDBC.ConnectionURL"
value="jdbc:mysql://localhost/sample"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="mypass"/>
<property name="Pool.MaximumActiveConnections"
value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime"
value="120000"/>
<property name="Pool.TimeToWait" value="500"/>
<property name="Pool.PingQuery" value="select 1 from
ACCOUNT"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan"
value="1"/>
<property name="Pool.PingConnectionsNotUsedFor"
value="1"/>
</dataSource>
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
</transactionManager>
<sqlMap resource="com/ibatis/sample/User.xml"/> ⑷
<sqlMap resource="com/ibatis/sample/Address.xml"/>
</sqlMapConfig>

⑴ Settings 节点
参数 描述
cacheModelsEnabled 是否启用SqlMapClient上的缓存机制。
建议设为"true"
enhancementEnabled 是否针对POJO启用字节码增强机制以提升
getter/setter的调用效能,避免使用Java
Reflect所带来的性能开销。
同时,这也为Lazy Loading带来了极大的性能
提升。
建议设为"true"
errorTracingEnabled 是否启用错误日志,在开发期间建议设为"true"
以方便调试
lazyLoadingEnabled 是否启用延迟加载机制,建议设为"true"
maxRequests 最大并发请求数(Statement并发数)
maxTransactions 最大并发事务数
maxSessions 最大Session 数。即当前最大允许的并发
SqlMapClient数。
maxSessions设定必须介于
maxTransactions和maxRequests之间,即
maxTransactions<maxSessions=<
maxRequests
useStatementNamespaces 是否使用Statement命名空间。
这里的命名空间指的是映射文件中,sqlMap节点
的namespace属性,如在上例中针对t_user
表的映射文件sqlMap节点:
<sqlMap namespace="User">
这里,指定了此sqlMap节点下定义的操作均从
属于"User"命名空间。
在useStatementNamespaces="true"的情
况下,Statement调用需追加命名空间,如:
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
sqlMap.update("User.updateUser",use
r);
否则直接通过Statement名称调用即可,如:
sqlMap.update("updateUser",user);
但请注意此时需要保证所有映射文件中,
Statement定义无重名。

⑵ transactionManager节点
transactionManager 节点定义了ibatis 的事务管理器,目前提供了以下几
种选择:
Ø JDBC
通过传统JDBC Connection.commit/rollback实现事务支持。
Ø JTA
使用容器提供的JTA服务实现全局事务管理。
Ø EXTERNAL
外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自
动的事务管理机制。此时ibatis 将把所有事务委托给外部容器进行管理。
此外,通过Spring 等轻量级容器实现事务的配置化管理也是一个不错的选
择。关于结合容器实现事务管理,参见“高级特性”中的描述。

⑶ dataSource节点
dataSource从属于transactionManager节点,用于设定ibatis运行期使
用的DataSource属性。
type属性: dataSource节点的type属性指定了dataSource的实现类型。
可选项目:
Ø SIMPLE:
SIMPLE是ibatis内置的dataSource实现,其中实现了一个简单的
数据库连接池机制, 对应ibatis 实现类为
com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。
Ø DBCP:
基于Apache DBCP 连接池组件实现的DataSource 封装,当无容器提
供DataSource 服务时,建议使用该选项,对应ibatis 实现类为
com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。
Ø JNDI:
使用J2EE 容器提供的DataSource 实现,DataSource 将通过指定
的JNDI Name 从容器中获取。对应ibatis 实现类为
com.ibatis.sqlmap.engine.datasource.JndiDataSourceFacto
ry。
dataSource的子节点说明(SIMPLE&DBCP):
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
参数 描述
JDBC.Driver JDBC 驱动。
如:org.gjt.mm.mysql.Driver
JDBC.ConnectionURL 数据库URL。
如:jdbc:mysql://localhost/sample
如果用的是SQLServer JDBC Driver,需要
在url后追加SelectMethod=Cursor以获得
JDBC事务的多Statement支持。
JDBC.Username 数据库用户名
JDBC.Password 数据库用户密码
Pool.MaximumActiveConn
ections
数据库连接池可维持的最大容量。
Pool.MaximumIdleConnec
tions
数据库连接池中允许的挂起(idle)连接数。
以上子节点适用于SIMPLE 和DBCP 模式,分别针对SIMPLE 和DBCP 模式的
DataSource私有配置节点如下:
SIMPLE:
参数 描述
Pool.MaximumCheckoutTi
me
数据库联接池中,连接被某个任务所允许占用的
最大时间,如果超过这个时间限定,连接将被强
制收回。(毫秒)
Pool.TimeToWait 当线程试图从连接池中获取连接时,连接池中无
可用连接可供使用,此时线程将进入等待状态,
直到池中出现空闲连接。此参数设定了线程所允
许等待的最长时间。(毫秒)
Pool.PingQuery 数据库连接状态检测语句。
某些数据库在连接在某段时间持续处于空闲状态
时会将其断开。而连接池管理器将通过此语句检
测池中连接是否可用。
检测语句应该是一个最简化的无逻辑SQL。
如“select 1 from t_user”,如果执行此语句
成功,连接池管理器将认为此连接处于可用状态。
Pool.PingEnabled 是否允许检测连接状态。
Pool.PingConnectionsOl
derThan
对持续连接时间超过设定值(毫秒)的连接进行
检测。
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
Pool.PingConnectionsNo
tUsedFor
对空闲超过设定值(毫秒)的连接进行检测。
DBCP:
参数 描述
Pool.MaximumWait 当线程试图从连接池中获取连接时,连接池中无
可用连接可供使用,此时线程将进入等待状态,
直到池中出现空闲连接。此参数设定了线程所允
许等待的最长时间。(毫秒)
Pool.ValidationQuery 数据库连接状态检测语句。
某些数据库在连接在某段时间持续处于空闲状态
时会将其断开。而连接池管理器将通过此语句检
测池中连接是否可用。
检测语句应该是一个最简化的无逻辑SQL。
如“select 1 from t_user”,如果执行此语句
成功,连接池管理器将认为此连接处于可用状态。
Pool.LogAbandoned 当数据库连接被废弃时,是否打印日志。
Pool.RemoveAbandonedTi
meout
数据库连接被废弃的最大超时时间
Pool.RemoveAbandoned 当连接空闲时间超过
RemoveAbandonedTimeout时,是否将其废
弃。
JNDI由于大部分配置是在应用服务器中进行,因此ibatis中的配置相对简单,下面
是分别使用JDBC和JTA事务管理的JDNI配置:
使用JDBC事务管理的JNDI DataSource配置
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource"
value="java:comp/env/jdbc/myDataSource"/>
</dataSource>
</transactionManager>
<transactionManager type="JTA" >
<property name="UserTransaction"
value="java:/ctx/con/UserTransaction"/>
<dataSource type="JNDI">
<property name="DataSource"
value="java:comp/env/jdbc/myDataSource"/>
</dataSource>
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
</transactionManager>

⑷ sqlMap节点
sqlMap 节点指定了映射文件的位置,配置中可出现多个sqlMap 节点,以指定
项目内所包含的所有映射文件。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=669112


文章来源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!196.entry
posted @ 2007-03-31 10:49 阿伟 阅读(372) | 评论 (0)编辑 收藏
inner join&left outer join&right outer join
left outer join === left join
rirht outer join === right join
full outer join === full join
inner join  === A = B
 
no full inner join
no left inner join
no right inner join
 
they are the same as the "inner join"
 
 
 
 
Join types

By default, a join is assumed to be an inner join. You can also request other types of joins by clicking Join Type on the Joins page of SQL Assist. The following types of joins are available:

  • Inner join
  • Left outer join
  • Right outer join
  • Full outer join

7 An inner join is join method in which 7 a column that is not common to all of the tables being joined is dropped from 7 the resultant table. If your database supports the OUTER JOIN keywords, you 7 can extend the inner join to add rows from one table that have no matching 7 rows in the other table.

For example, you want to join two tables to get the last name of the manager for each department. The first table is a Department table that lists the employee number of each department manager. The second table is an Employee table that lists the employee number and last name of each employee. However, some departments do not have a manager; in these cases, the employee number of the department manager is null. To include all departments regardless of whether they have a manager, and the last name of the manager, if one exists, you create a left outer join. The left outer join includes rows in the first table that match the second table or are null. The resulting SQL statement is as follows:

SELECT DEPTNO, DEPTNAME, EMPNO, LASTNAME
   FROM DEPARTMENT LEFT OUTER JOIN EMPLOYEE
      ON MGRNO = EMPNO 

A right outer join is the same as a left outer join, except that it includes rows in the second table that match the first table or are null. A full outer join includes matching rows and null rows from both tables.

For example, you have two tables, Table 1 and Table 2, with the following data:

Table 1. Table 1
Column A Column B
1 A
2 B
3 C
Table 2. Table 2
Column C Column D
2 X
4 2

You specify a join condition of Column A = Column C. The result tables for the different types of joins are as follows:

Inner join
Table 3. Inner join result table
Column A Column B Column C Column D
2 B 2 X
Left outer join
Table 4. Left outer join result table
Column A Column B Column C Column D
1 A null null
2 B 2 X
3 C null null
Right outer join
Table 5. Right outer join result table
Column A Column B Column C Column D
2 B 2 X
null null 4 2
Full outer join
Table 6. Full outer join result table
Column A Column B Column C Column D
1 A null null
2 B 2 X
3 C null null
null null 4 2

If you specify value (a,c), you obtain the following result:

Table 7. Result of value (a,c)
Value (a,c)
1
2
3
4
Related concepts

文章来源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!197.entry
posted @ 2007-03-31 10:49 阿伟 阅读(1137) | 评论 (0)编辑 收藏
刻录光碟超刻方法
[size=2]最近在学习刻盘,刚好在wuyou看到一篇“刻录光碟如何设置超刻”,转过来一起学习一下。
具体方法如下:
1.启动NERO到如下画面:
[b]
[img]http://bbs.crsky.com/1128632305/Mon_0702/6_181952_4b6f4a1db0f69cd.jpg[/img]

2、在开始刻录前首先需要在Nero中进行参数设置,设置方法如下:
[b]
[img]http://bbs.crsky.com/1128632305/Mon_0702/6_181952_4be2b6e9fb19105.jpg[/img]

单击菜单:文件-设置--高级属性,按图设置:
[b]
[img]http://bbs.crsky.com/1128632305/Mon_0702/6_181952_09ddc4bcc1c9789.jpg[/img]

3、从“文件”菜单下选择“刻录镜像文件”,然后单击工具栏上的刻录按钮,在刻录方式下选择“光盘一次刻录”选项。
4、这时Nero会提醒光盘容量不足,不用理会,之后会出现以下提示信息,单击“刻录超烧光盘”按钮开始刻录。 接下来只要等待刻录结束即可。[/size]
[b]
[img]http://bbs.crsky.com/1128632305/Mon_0702/6_181952_f6705fd32f2e2a2.jpg[/img]

文章来源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!198.entry
posted @ 2007-03-31 10:49 阿伟 阅读(301) | 评论 (0)编辑 收藏
Nero超刻方法
 
2006-10-06 22:28:58
 
大中小
中文NERO
    首先,看你的刻录机是否支持超刻。
    打开,Nero Burning ROM,菜单:
刻录器>>选择刻录器...,或快捷键CTRL+R,选中刻录机,看刻录机属性,如果提示是:“超烧功能:支持
”,那就可以超刻。有的nero版本有刻录精灵,一定要关闭。
 
    然后,测试盘片最大超刻容量。
    放入CD-R,打开Nero ToolKit中的Nero CD-DVD Speed,选择“其它”->(超刻测试...)。用它可以
测试最大超刻容量。点击“开始”按钮,超刻测试开始。测试完成,软件能把测试的最大时间(容量)以
数据库的形式保存起来,这个工具同时能够检测碟片的ATIP信息和给出碟片制造商和染料代号等信息。
 
    测完之后,在Nero Burning ROM菜单:
 首先,在菜单:
文件->参数选项  ->专家功能
选中Enable over burn Disk-at-once,打开超刻功能,同时写上测试出的容量(小一点保险)
 其次,在文件->专辑信息(F7)->多区段,选择无多区段。
       ->刻录Burn,选择关闭光盘Finalize CD,写入模式Write Method->选择光盘一次刻录(Disc-At-
Once,简称DAO)
   最后,进行刻录的时候,跳出的窗口选择“是”
   事实上,超刻与刻录机,刻录盘关系很大,不同的刻录机超刻能力不一样,一般能超刻750M。
以上的刻录机都会把这点专门说明,因此,你的刻录机未必能刻出盘能达到的超刻容量。
请谨慎行事.
英文版NERO
    首先,看你的刻录机是否支持超刻。
    打开,Nero Burning ROM,菜单:
    Recorder>>Choose Recorder...,或快捷键CTRL+R,选中刻录机,看刻录机属性,如果提示是
verburn: suppored,那就可以超刻。有的nero版本有刻录精灵,一定要关闭。
 
    然后,测试盘片最大超刻容量。
    放入CD-R,打开Nero ToolKit中的Nero CD-DVD Speed,选择Extra->Overburning test...。用它可
以测试最大超刻容量。点击“开始”按钮,超刻测试开始。测试完成,软件能把测试的最大时间(容量)
以数据库的形式保存起来,这个工具同时能够检测碟片的ATIP信息和给出碟片制造商和染料代号等信息。
 
    测完之后,在Nero Burning ROM菜单:
  首先,在菜单:
File->Preference->Expert Features
选中Enable over burn Disk-at-once,打开超刻功能,同时写上测试出的容量(小一点保险)
  其次,在文件File->Compilation Properties...(F7)->Multisesion,No Multisesson。
          ->Burn,选择关闭光盘Finalize CD,写入模式Write Method->选择光盘一次刻录(Disc-At-
Once,简称DAO)
   最后,进行刻录的时候,跳出的窗口选择“是”
   事实上,超刻与刻录机,刻录盘关系很大,不同的刻录机超刻能力不一样,一般能超刻750M。
以上的刻录机都会把这点专门说明,因此,你的刻录机未必能刻出盘能达到的超刻容量。
--------------------------------------------------------------------------------------------
名词解释——超刻——一般有两个意思:
1、超CD-R容量刻录。比如一般的CD-R盘片容量为700MB,你想刻入710MB的数据;
2、超速刻录。比如你的刻录机是52X,而你买的CD-R盘片标称值是40X,你要用52速刻录。
这里的“超刻”是指第一种——超容量刻录,最大利用CD-R盘片。
超刻需要具备三个条件:
1、刻录机支持超刻;
2、CD-R盘片支持超刻;
3、刻录软件设置正确。
所以,超刻前,要先检测你的盘片和刻录机是否支持;刻录时,软件要设置正确。
 
 

文章来源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!199.entry
posted @ 2007-03-31 10:49 阿伟 阅读(707) | 评论 (0)编辑 收藏
仅列出标题
共8页: 上一页 1 2 3 4 5 6 7 8 下一页