说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

求助:请各位老大帮忙看看在JAVA中处理NULL的问题,不盛感激!

编辑:说三道四文库 发布时间:2018-06-24 12:05
HTML文档下载 WORD文档下载 PDF文档下载
我的数据库查询BEAN如下DCBquery.java:
package DCB;
import java.sql.*;
import DBconnect.*;
public class DCBquery{

    private String table_name_sql;//定义表名
    private ResultSet rs = null;//定义结果集类
      DBconnect cc = new DBconnect();
    Connection conn= cc.getConnect();//建立连接类
    Statement stmt=conn.createStatement();

       /**
     * 该方法是以传递过来的参数提取该表的记录
     * @return
     */
    public ResultSet rs_record() {
      String sql="select * from "+this.getTable_name_sql();
      try{
         rs = stmt.executeQuery(sql);
      }
      catch(Exception e){
         System.out.println("rs_record=" +e.getMessage());
      }
       return rs;
      }
     
    public DCBquery() throws Exception {
    }
/**
     * 该方法返回该表的记录总数
     * @return
     * @throws Exception
     */
    public int sum() throws Exception{
      String sql_sum = "select count(rowid) as t    from "+this.getTable_name_sql();
      rs=stmt.executeQuery(sql_sum);
      rs.next();
      if(rs != null){
         sum = rs.getInt("t");
         return sum;
      }
      else{
         return 0;
      }
    }
    /**
     * 该方法是获得一个表名或者是一个表名加条件的形式
     * 比如:dcb01或者dcb01 where jh='DW112'的格式
     * @return
     */
  public String getTable_name_sql() {
    return table_name_sql;
  }
  /**
   * 该方法是设置一个表名或者是一个表名加条件的形式
   * @param table_name_sql 表名或者表名加条件
   * 比如:dcb01或者dcb01 where jh='DW112'的格式
   */
  public void setTable_name_sql(String table_name_sql) {
    this.table_name_sql = table_name_sql;
  }
}
下面是通过该查询页面显示的数据D_EJDW.jsp:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="DCB.*"%>
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>二级单位代码</title>
<link rel=stylesheet href="../sstyle.css" type="text/css">
<script language="JavaScript" src="../js/sys_alert.js"></script>
</head>

<body>

<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber1">
  <tr>
    <td width="100%">
      <p align="center"><b>二级单位代码</b></td>
  </tr>
  <tr>
    <td width="100%"><font size="2">&nbsp; <a href="D_EJDWAdd.jsp">录入二级单位代码</a></font></td>
  </tr>
  <tr>
    <td width="100%">    <table border="1" cellpadding="1" cellspacing="1" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber2">
      <tr height="20">
        <td width="6%" align="center"><font size="2"><b>代码</b></font></td>
        <td width="17%" align="center"><font size="2"><b>单位名称</b></font></td>
<td width="10%" align="center"><font size="2"><b>局级单位代码</b></font></td>
        <td width="54%" align="center"><font size="2"><b>备注</b></font></td>
        <td width="7%" align="center"><b><font size="2">修改</font></b></td>
        <td width="6%" align="center"><b><font size="2">删除</font></b></td>
      </tr>
      <%
DCBquery D_EJDW=new DCBquery();
D_EJDW.setTable_name_sql("D_EJDW");
int curPages = Pagination.curPages(Pagination.strPage(request,"page"));
Pagination.setRows(10);//每页显示10条
int totalPages = Pagination.getPages(D_EJDW.sum());//取出总页数
if(D_EJDW.sum()>0){
ResultSet rs = Pagination.getPageSet(D_EJDW.rs_record(),curPages);
while(rs.next()){
%>
      <tr align="center">
        <td><%=rs.getString("DM")%></td>
        <td><%=rs.getString("DWMC")%></td>
        <td><%=rs.getString("JJDWDM")%></td>
        <td><%=rs.getString("BZ")%></td>
      </tr>
      <%
         }
rs.close();
%>
          </table></td>
  </tr>
  
</table>
</body>

</html>
我的问题是这样的:当通过上面的查询BEAN:DCBquery.java查询出数据的时候,下面显示的页面,如果字段中有空值NULL的时候,会显示在下面,当然有个比较笨的办法是可以在取出每个字段的数据比如在:rs.getString("DM")之前可以用个IF语句分别判断每个字段,这样可以判断;
    如果几张表还可以,如果表多的话,很浪费时间的;我的问题是有没有比较简单的方法,直接在上面的BEAN里面处理一下,直接从select * from 表名;取出的数据处理一下,当然也有的想法是通过VAL这个函数判断,但是这样也会写不少的SQL语句,有没有更简单的方法,请各位高手给小弟指点一下!
太长了,晕~
你可以做一个函数,比如
public String isDataNull(Object obj){
 if (obj==null){
  return "";
 }else{
  return obj;
 }
}
然后把<%=rs.getString("DM")%>改成<%=isDataNull(rs.getString("DM"))%>

这个方法我没有测试过,你测试一下,如果能确定取出来的都是String ,那么把Object参数改成String更好。
((rs.getString("DM")==null)?" ":rs.getString("DM"))

 <tr align="center">
        <td><%=((rs.getString("DM")==null)?" ":rs.getString("DM"))%></td>
        ....
 </tr>

为null就显示空格 
try catch
呵呵
timtin0361(全力以赴我们心中的梦) 其实你的这个方法也不简洁,相当于IF语句,我有好多张表的,最少80张,这样判断太多了吧
我也Up一下

我也Up两下

!!!
只要保证不让NULL值参与运算就不会有这种问题的
平时初始化,实例化的时候注意一点就ok了
这个NULL倒是不参与运算,我就是查询的时候不想让它在界面中显示出来,也就是NULL变成空白就行了
lightninglei(闪电磊) 兄的方法,我试验过了,提示下面的错误:
D:\Tomcat 5.0\work\Catalina\localhost\_\org\apache\jsp\zyyt\TestWell\DCB02List_jsp.java:57: illegal start of expression
public String isDataNull(Object obj){
^

An error occurred at line: 79 in the jsp file: /zyyt/TestWell/DCB02List.jsp

Generated servlet error:
D:\Tomcat 5.0\work\Catalina\localhost\_\org\apache\jsp\zyyt\TestWell\DCB02List_jsp.java:86: cannot resolve symbol
symbol  : method isDataNull (java.lang.String)
location: class org.apache.jsp.zyyt.TestWell.DCB02List_jsp
      out.print(isDataNull(rs.getString("CSLXDM")));
                ^
2 errors

自己定义相应的类型类重载toString()方法:可以这样处理
toString(){
 if(this==null)
   return "";
 else
   return super.toString();
}
//只是一种想法。
zsh168(zsh168):
   首先你是否确认你的数据类型都是String?也就是你的数据库取出来的内容是否全部都是String,如果是可以用:
  public String isDataNull(String str){
   if (obj==null){
    return "";
   }else{
    return str;
   }
  }

如果不是,那么你需要对每个类型都自己判断。

当然你也可以用 instanceof 来判断是什么类型再做操作,如果嫌麻烦,也可以做个函数,里面try一下,出错就返回""就好了。
up
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘