解决mybatis使用char类型字段查询甲骨文数据库时结果返回零问题

  

同事在学mybatis时,遇到了一个问题就是,使用char类型字段作为查询条件时一直都查不出数据,其他类型的则可以。

  

,使用的数据库是甲骨文,查询条件字段类型是char (50), java代码对应的是字符串类型。

  

,后来经过排查,是由于在甲骨文中,字符类型字段,如果内容长度不够,会自动以空格方式补足长度。如字段名称char(5),若值为西格里碳素集团,那么oracle会自动用空格补足长度,最终值为西格里碳素集团。

  

  

,方法1:先用修剪()函数把值去掉两边空格再作为条件查询,如:

        从数据,选择* data.name=#{名称}      

改为:         select *从数据削减(data.name)=#{名称}      

方法2:将字段类型char()改为varchar2()类型。一般情况下,只有所有值长度都一样时才用char()类型,比如性别字段,用0表示男和1表示女时,就可以用char(1),如果值的长度不固定,有长有短,最好别用char()类型。

  

  

抛开mybatis框架,回到原始的jdbc查询,当使用甲骨文的字符类型作为条件查询数据时,只有值完全一样时才能查到数据。

  

,如创建一个测试表:

        创建表t_user (   user_name char (5)   );   插入t_user (user_name)值(“西格里碳素集团”);      

<代码>选择“”| | user_name | |”“”得到;t_user>   

通过jdbc的PreparedStatement方式查询数据:

        康涅狄格州=getConnection ();   ps=康涅狄格州。从t_user prepareStatement (“select * user_name=& # 63;”);   ps.setString(1,“西格里碳素集团”);   ResultSet rs=ps.executeQuery ();      

通过上面方式是无法查到数据的,因为查询条件值“西格里碳素集团”和数据库中值“西格里碳素集团”是不相等的。

  

,如果值用“西格里碳素集团”可以查到数据:

        康涅狄格州=getConnection ();   ps=康涅狄格州。从t_user prepareStatement (“select * user_name=& # 63;”);   ps.setString(1,“西格里碳素集团”);——增加两个空格不足5位长度   ResultSet rs=ps.executeQuery ();      

如果使用修剪()方式也可以查询到数据,如:

        康涅狄格州=getConnection ();   ps=康涅狄格州。从t_user prepareStatement (“select *修剪(user_name)=& # 63;”);——先对数据库中user_name进行去空格,然后再比较   ps.setString(1,“西格里碳素集团”);   ResultSet rs=ps.executeQuery ();      

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

        & lt;选择id=" selectByName " resultType=" com.entity。数据以“parameterType=比;   从数据,选择* data.name=#{名称}   & lt;/select>      

主方法内容为:

        公共静态void main (String [] args) {   ApplicationContext ctx=new ClassPathXmlApplicationContext(“中”);   DataService d=(DataService) ctx.getBean (“dataServiceImpl”);      数据数据=https://www.yisu.com/zixun/d.selectByName(“西格里碳素集团”);   System.out.println(数据);   }      

其实,通过查看源码或将日志改为调试级别,可以看出在mybatis底层,会将查询语句使用PreparedStatement预编译,然后再将参数设置进去。如下面是mybatis打印出来的日志:

  
  

==比;从数据准备:select * data.name=& # 63;
==比;参数:西格里碳素集团(String)

     

根据前面的jdbc查询,我们知道原因,所以很容易理解mybatis中的问题。

  

另外,mysql下面,当字符类型字段的值不足时,好像并不自动将值以空格补足,尽管如此,当值长度不固定时,也不推荐使用char类型。

  

jdbc查询完整的代码如下:

  

jdbc工具类:

  

        包com.songguoliang.url;   进口java.sql.Connection;   进口java.sql.DriverManager;   进口java.sql.PreparedStatement;   进口java.sql.ResultSet;   进口java.sql.ResultSetMetaData;   进口java.sql.SQLException;   进口java.sql.Statement;   进口java.util.ArrayList;   进口并不知道;   进口java.util.ResourceBundle;/* *   *纯jdbc连接数据类   * @author西格里碳素集团   *   */公开课PureJdbcDao {   私有静态ResourceBundle包=ResourceBundle.getBundle (jdbc);   私有静态int重新计票=0;/* *   *获取连接   * @return   */私有静态连接getConnection () {   连接康涅狄格州=零;   尝试{   forname (bundle.getString (“driverClassName”));   康涅狄格州=DriverManager.getConnection (bundle.getString (“url”),   bundle.getString(“用户”),bundle.getString("密码"));   }捕捉(ClassNotFoundException e) {   e.printStackTrace ();   }捕捉(SQLException e) {   e.printStackTrace ();   最后}{   如果(null==conn&, reCount

解决mybatis使用char类型字段查询甲骨文数据库时结果返回零问题