添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

记录一下开发过程中遇到的一个问题(Mybatis执行select count(*)返回结果为0,但是数据库表中有数据),以及解决过程;

  • 问题阐述:

Oracle数据库下,通过MyBatis执行下面这行sql:

select 
    count(*) 
    tm_user 
where 
    empid = #{empID}

service里接收到的结果总是0,通过调试把sql加入参数放到navicat里执行返回的count是1,至此问题很明确了。
解决过程

  1. parameterType="java.lang.String"没问题;
  2. resultType="java.lang.Integer"没问题;
  3. 观察log,参数占位符位置没问题,带入的参数也是传入的参数,没问题。执行结果Total为1,说明sql执行正常;(明确一下这里的Total不是count的数量,只是结果集行数,即使count为8,Total也是1);
  4. 是不是连错数据库了,应该连开发库错连到测试库了?检查数据库连接,没问题,是开发库;
  5. 好怪~
  6. 去掉参数, 换一个参数,再换回刚才的参数
  7. 怀疑是传入的参数里有空格?trim()一下,执行,还是有问题~
  8. 看数据库empid字段,CHAR类型长度32,原因找到了,

CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim()。
解决:
也就是说,并不是传入的参数里有空格,而是数据库存的这个empid有问题,因为字段定长32,而这个奇葩的empid是‘EMDM1846’,长度只有8,但实际存储的是EMDM1846还跟着24个空格,所以本身sql是没有问题,但查询结果就是0,因为参数没有符合的记录对应啊,即便你觉得对应,但oracle不那样认为。

目的:记录一下开发过程中遇到的一个灵异问题(Mybatis执行select count(*)返回结果为0,但是数据库表中有数据),以及解决过程; - 问题阐述:Oracle数据库下,通过MyBatis执行下面这行sql:select count(*) from tm_user where empid = #{empID}service里接收到...
mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题MyBatisPlus是一个Mybatis的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它主要通过启动时自动注入基本CURD,达到简化操作的目的。 关于mybatis-plus的更多介绍及特性,可以参考本文档,详细的介绍了从入门到提高的一个过程,感兴趣的可以下载了解。 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增 强不做改变,为简化开发、提高效率而生。 特性:无侵入、损耗小、强大的CRUD操作,支持lambda 形势调用、支持多种数据库,支持主键自动生成、支持ActiveRecord模式,支持自定义全局通用操作、支持关键词自动转义,内置代码生成器、内置分页插件、内置性能分析插件,内置全局拦截插件、内置sql注入剥离器 《MyBatis-Plus入门文档》主要介绍了MyBatis-Plus入门使用,以及关于mybatis-plus的更多介绍及特性,感兴趣的可以下载学习一下
在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述这三者的作用,关系以及背后的原理。 往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表扫描。而实际上如何写Count并没有区别。 Count(1)和Count(*)实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指定NULL,因此
<select id="selectCountt" resultType="java.lang.Integer"> select count(user_code) from sys_law_case_project_user where user_code =#{userCode} </select> 写一个select块来调用查询。 在mybatis plus中有集成好的selectCount的方法。 from ApiTest.models import ApiTest from django.shortcuts import render def api_test_manage(request): apitest_count = ApiTest.objects.all().count() return render(request, apitest_manage.html, {'user': username, 'apitests': apitest_list, 'apitests_count': apitest_co
最近在学习开发一个小程序,过程中遇到了许多bug,今天便开始将这些遇到的问题以及寻得的解决办法记录下来,以便日后的学习。也希望对读者有所帮助。 昨天在使用mybatis查询的时候出现了返回结果为null,报错具体情况如下图: 我是用junit进行的接口测试,通过上图可以知道,测试结果返回了7条数据,但是7条数据都为null值。而我的数据库表确是有值的,这说明我的sql语句是没有问题的,于是查看了mapper文件,发现了一个问题。 从上图的insert语句中可看出,在数据库表user中,我的字段名称都有一个user前缀(如user_nickName),而在我的持久类中字段名是没有这个前缀的。
分页查询代码如下,数据能查询出来,但是分页的total总是为0。经过多次调试,发现查询的过程中没有进入分页拦截器(PaginationInterceptor),原来是容器中缺少了这个bean: 解决办法:只需要在容器中添加这个bean就行了......
mybatis执行sql语句部分参数返回null问题通常是由于参数类型与实际传入参数类型不匹配导致的。为了解决这个问题,我们需要对参数进行调试和检查。下面,我们提供几种常用的解决方案。 1.在SqlMapper.xml中添加参数类型 在SqlMapper.xml文件中对参数类型进行明确声明,可以避免参数传递出现歧义。例如,在参数为字符串类型时,可以使用如下的方式声明参数类型: <parameterMap type="java.lang.String" /> 2.修改Java对象对应的类 在Java对象对应的类中,修改该属性的类型,使其与数据库对应的列类型一致。例如,如果数据库中的列为varchar类型,就需要将Java对象的类对应属性的类型设置为String类型。 3.使用TypeHandler 通过使用TypeHandler,可以将Java对象的属性映射到数据库中对应的列上,避免了参数类型不匹配的情况。例如,对于通过Java对象传递的时间,可使用如下的TypeHandler实现对时间进行转换: public class DateTypeHandler extends BaseTypeHandler<Date> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException { ps.setTimestamp(i, new Timestamp(parameter.getTime())); @Override public Date getNullableResult(ResultSet rs, String columnName) throws SQLException { return new Date(rs.getTimestamp(columnName).getTime()); @Override public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return new Date(rs.getTimestamp(columnIndex).getTime()); @Override public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return new Date(cs.getTimestamp(columnIndex).getTime()); 使用TypeHandler,可以将Java对象的属性与数据库对应的列进行映射,解决参数类型不匹配的问题。 总之,解决mybatis执行sql语句部分参数返回null问题需要认真检查参数类型的匹配问题,并对参数类型进行适当的调整和配置。