亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

解決mybatis使用char類型字段查詢oracle數據庫時結果返回null問題

2024-07-14 08:41:14
字體:
來源:轉載
供稿:網友

同事在學mybatis時,遇到了一個問題就是,使用char類型字段作為查詢條件時一直都查不出數據,其他類型的則可以。

 使用的數據庫是oracle,查詢條件字段類型是char(50),java代碼對應的是String類型。

 后來經過排查,是由于在oracle中,char類型字段,如果內容長度不夠,會自動以空格方式補足長度。如字段 name char(5),若值為sgl,那么oracle會自動用空格補足長度,最終值為sgl。

一、解決方法:

 方法1:先用trim()函數把值去掉兩邊空格再作為條件查詢,如:

select * from data where data.name=#{name}

改為:

select * from data where trim(data.name)=#{name}

方法2:將字段類型char()改為varchar2()類型。一般情況下,只有所有值長度都一樣時才用char()類型,比如性別字段,用0表示男和1表示女時,就可以用char(1),如果值的長度不固定,有長有短,最好別用char()類型。

二、深入了解mybatis返回null

拋開mybatis框架,回到原始的jdbc查詢,當使用oracle的char類型作為條件查詢數據時,只有值完全一樣時才能查到數據。

 如創建一個測試表:

create table t_user(    user_name char(5));insert into t_user (user_name)values('sgl');

select '"'||user_name||'"' from  t_user; -- 查詢結果為"sgl  ",可以看出oracle自動補了兩個空格

通過jdbc的PreparedStatement方式查詢數據:

conn=getConnection();ps=conn.prepareStatement("select * from t_user where user_name=?");ps.setString(1,"sgl");ResultSet rs = ps.executeQuery();

通過上面方式是無法查到數據的,因為查詢條件值”sgl”和數據庫中值”sgl “是不相等的。

 如果值用“sgl ”可以查到數據:

conn=getConnection();ps=conn.prepareStatement("select * from t_user where user_name=?");ps.setString(1,"sgl "); -- 增加兩個空格不足5位長度ResultSet rs = ps.executeQuery();

如果使用trim()方式也可以查詢到數據,如:

conn=getConnection();ps=conn.prepareStatement("select * from t_user where trim(user_name)=?"); -- 先對數據庫中user_name進行去空格,然后再比較ps.setString(1,"sgl");ResultSet rs = ps.executeQuery();

現在回到mybatis,同事的Mapper文件里查詢sql如下:

<select id="selectByName" resultType="com.entity.Data" parameterType="java.lang.String"> select * from data where data.name=#{name}</select>

main方法內容為:

public static void main(String[] args) {  ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  DataService d = (DataService) ctx.getBean("dataServiceImpl");  Data data = d.selectByName("sgl");  System.out.println(data);}

其實,通過查看源碼或將日志改為debug級別,可以看出在mybatis底層,會將查詢語句使用PreparedStatement預編譯,然后再將參數設置進去。如下面是mybatis打印出來的日志:

==> Preparing: select * from data where data.name=? 
==> Parameters: sgl(String)

根據前面的jdbc查詢,我們知道原因,所以很容易理解mybatis中的問題。

另外,mysql下面,當char類型字段的值不足時,好像并不自動將值以空格補足,盡管如此,當值長度不固定時,也不推薦使用char類型。

jdbc查詢完整的代碼如下:

jdbc工具類:

 

package com.songguoliang.url;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.List;import java.util.ResourceBundle;/** * 純jdbc連接數據類 * @author sgl * */public class PureJdbcDao {  private static ResourceBundle bundle = ResourceBundle.getBundle("jdbc");  private static int reCount = 0;  /**   * 獲取連接   * @return   */  private static Connection getConnection(){    Connection conn=null;    try {      Class.forName(bundle.getString("driverClassName"));      conn = DriverManager.getConnection(bundle.getString("url") ,          bundle.getString("username") , bundle.getString("password"));    } catch (ClassNotFoundException e) {      e.printStackTrace();    } catch (SQLException e) {      e.printStackTrace();    }finally{      if(null==conn&&reCount<5){        try {          Thread.sleep(10000);        } catch (InterruptedException e) {          e.printStackTrace();        }        reCount++;        System.out.println("數據庫第"+reCount+"次重連");        conn = getConnection();      }    }    return conn;  }  /**   * 查詢數據   * @param sql   * @return   */  public static List<String[]>query(String sql){    List<String[]>result=new ArrayList<String[]>();    Connection conn=null;    Statement stmt=null;    try {      //System.out.println("[PureJdbcDao]查詢語句:" + sql);      conn=getConnection();      stmt = conn.createStatement();      ResultSet rs = stmt.executeQuery(sql);      ResultSetMetaData rsMeta = rs.getMetaData();      while(rs.next()){        int columnNum=rsMeta.getColumnCount();        String []field=new String[columnNum];        String fieldValue=null;        for(int i=1;i<=columnNum;i++){          fieldValue=rs.getString(i);          if(fieldValue==null){            fieldValue="";          }          field[i-1]=fieldValue;        }        result.add(field);      }    } catch (SQLException e) {      e.printStackTrace();    }finally{      try {        if(stmt!=null){          stmt.close();        }        if(conn!=null){          conn.close();        }      } catch (SQLException e) {        e.printStackTrace();      }    }    return result;  }  public static List<String[]>query(String sql,List<String>params){    List<String[]>result=new ArrayList<String[]>();    Connection conn=null;    PreparedStatement ps=null;    try {      conn=getConnection();      ps=conn.prepareStatement(sql);      for(int i=0;i<params.size();i++){        ps.setString(i+1,params.get(i));      }      ResultSet rs = ps.executeQuery();      ResultSetMetaData rsMeta = rs.getMetaData();      while(rs.next()){        int columnNum=rsMeta.getColumnCount();        String []field=new String[columnNum];        String fieldValue=null;        for(int i=1;i<=columnNum;i++){          fieldValue=rs.getString(i);          if(fieldValue==null){            fieldValue="";          }          field[i-1]=fieldValue;        }        result.add(field);      }    } catch (SQLException e) {      e.printStackTrace();    }finally{      try {        if(ps!=null){          ps.close();        }        if(conn!=null){          conn.close();        }      } catch (SQLException e) {        e.printStackTrace();      }    }    return result;  }  /**   * 執行sql語句   * @param sql   */  public static void execute(String sql){    Connection conn=null;    Statement stmt=null;    try {      //System.out.println("[PureJdbcDao]sql語句:" + sql);      conn = getConnection();      conn.setAutoCommit(false);      stmt = conn.createStatement();      stmt.execute(sql);      conn.commit();    } catch (SQLException e) {      try {        conn.rollback();      } catch (SQLException e1) {        e1.printStackTrace();      }      e.printStackTrace();    }finally{      try {        if(stmt!=null){          stmt.close();        }        if(conn!=null){          conn.close();        }      } catch (SQLException e) {        e.printStackTrace();      }    }  }}

測試類:

package com.songguoliang;import java.util.Arrays;import java.util.List;import com.songguoliang.url.PureJdbcDao;public class Test {  public static void main(String[] args) {    //List<String[]>list=PureJdbcDao.query("select * from t_user where user_name=?",Arrays.asList("sgl")); // 查詢到條數:0    //List<String[]>list=PureJdbcDao.query("select * from t_user where user_name=?",Arrays.asList("sgl ")); //查詢到條數:1    List<String[]>list=PureJdbcDao.query("select * from t_user where trim(user_name)=?",Arrays.asList("sgl")); //查詢到條數:1    System.out.println("查詢到條數:"+list.size());  }}

總結

以上所述是小編給大家介紹的解決mybatis使用char類型字段查詢oracle數據庫時結果返回null問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲第一区| 日本久久91av| 日韩有码在线播放| 国产精品狼人色视频一区| 91色在线观看| 色偷偷av一区二区三区乱| 日韩暖暖在线视频| 日本道色综合久久影院| 精品高清一区二区三区| 国产成人精品久久二区二区91| 精品国产一区二区三区久久久| 久久精品国产96久久久香蕉| 成人av色在线观看| 欧美激情国产日韩精品一区18| 日韩小视频网址| 亚洲激情视频网站| 国产日韩欧美在线观看| 高清在线视频日韩欧美| 久久偷看各类女兵18女厕嘘嘘| 日韩免费在线观看视频| 亚洲欧美国产另类| 精品成人在线视频| 69影院欧美专区视频| 中文字幕在线视频日韩| 欧美另类第一页| 国产精品成人aaaaa网站| 亚洲自拍偷拍视频| 亚洲欧美综合另类中字| 亚洲日本成人女熟在线观看| 国产成人综合精品| 亚洲精品国精品久久99热一| 久久视频在线直播| 国产精品九九久久久久久久| 黑人狂躁日本妞一区二区三区| 欧美日韩国产成人| 91久久精品一区| 国产精品a久久久久久| 亚洲欧洲在线免费| 亚洲丝袜一区在线| 95av在线视频| 亚洲电影在线观看| 97久久精品视频| 久久久久亚洲精品| 亚洲精品国产成人| 中文国产成人精品| 浅井舞香一区二区| 国产午夜精品全部视频在线播放| 91久久中文字幕| 亚洲激情视频在线| 精品国产一区二区三区久久狼黑人| 日韩精品黄色网| 国产999精品久久久影片官网| 日韩电影中文 亚洲精品乱码| 色综合天天狠天天透天天伊人| 欧美精品性视频| 欧美日韩综合视频网址| 欧美视频在线观看免费| 亚洲天堂av在线免费| 精品亚洲国产成av人片传媒| 成人午夜高潮视频| 日韩精品高清在线观看| 在线观看日韩专区| 欧美一区二三区| 久久国产精品久久久久久久久久| 在线观看成人黄色| 久久久久国产精品免费| 国产精品爽爽爽爽爽爽在线观看| 亚洲人成网站色ww在线| 亚洲一区美女视频在线观看免费| 国产精品午夜视频| 国产精品自拍偷拍视频| 国产精品v片在线观看不卡| 日韩在线中文视频| 国产一区二区三区网站| 国产欧美va欧美va香蕉在| 国产欧美日韩专区发布| 51午夜精品视频| 国产国语videosex另类| 2021国产精品视频| 国产丝袜一区视频在线观看| 亚洲国产精品热久久| 中文字幕日韩免费视频| 日韩av在线电影网| 日韩精品中文字幕在线播放| 亚洲片在线资源| 日韩免费电影在线观看| 性欧美亚洲xxxx乳在线观看| 久久精品国产欧美激情| 国产精品亚洲自拍| 久久久久久久久久久久久久久久久久av| 成人久久精品视频| 亚洲丝袜av一区| 欧美性在线观看| 国外视频精品毛片| 91美女片黄在线观看游戏| 日本久久久久久久久久久| 中文字幕成人在线| 在线播放日韩av| 亚洲自拍小视频| 成人国产精品色哟哟| 亚洲字幕一区二区| www高清在线视频日韩欧美| 中日韩美女免费视频网址在线观看| 91影院在线免费观看视频| 亚洲精品不卡在线| 日韩欧美精品在线观看| 亚洲国产精品va在线看黑人| 中文字幕视频在线免费欧美日韩综合在线看| 97av在线播放| 国产视频亚洲精品| 亚洲男人天堂2024| 欧美大尺度在线观看| 亚洲va码欧洲m码| 亚洲欧洲在线视频| 亚洲第一免费播放区| 欧美日韩激情视频| 国产精品一区二区性色av| 国产z一区二区三区| 欧美富婆性猛交| 奇米四色中文综合久久| 欧美一级淫片丝袜脚交| 亚洲国产欧美在线成人app| 狠狠久久五月精品中文字幕| 在线看片第一页欧美| 欧美天天综合色影久久精品| 日韩av有码在线| 午夜精品一区二区三区视频免费看| 亚洲欧美精品一区| 久久久久中文字幕| 亚洲精品小视频在线观看| 久久69精品久久久久久久电影好| 国产精品欧美日韩一区二区| 久久精彩免费视频| 亚洲丝袜在线视频| 欧美大片在线看| 欧亚精品在线观看| 日韩av最新在线观看| 茄子视频成人在线| 中文字幕综合在线| 亚洲精品日韩丝袜精品| 一本色道久久综合亚洲精品小说| 91精品国产色综合久久不卡98口| 国产一级揄自揄精品视频| 亚洲色图校园春色| 国产成人一区二区三区电影| 九色精品美女在线| 亚洲天堂男人天堂| 久久深夜福利免费观看| 久久人人爽人人爽人人片av高清| 亚洲xxxxx电影| 88国产精品欧美一区二区三区| 91亚洲国产成人精品性色| 国产精品高潮视频| 久久精品一本久久99精品| 一区二区亚洲精品国产| 91精品视频在线播放| 国产亚洲精品久久| 亚洲欧美日韩中文在线| 超在线视频97| 丝袜亚洲欧美日韩综合| 国产精品旅馆在线| 日韩精品视频观看| 亚洲最新av在线| 国产精品免费一区豆花|