Mybatis查询Oracle数据库结果为null,但数据库中存在该条记录 5C

最近学习mybatis时遇到问题,相关配置应该是正确的,用mysql查询也能返回结果,但是将数据源切换到Oracle时总是返回null,求教。mybatis查询日志如下:

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Created connection 174573182.
Returned connection 174573182 to pool.
Opening JDBC Connection
Checked out connection 174573182 from pool.
Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@a67c67e]
==>  Preparing: SELECT ID id, LAST_NAME lastName, GENDER gender, EMAIL email FROM mybatis_employee WHERE ID = ? 
==> Parameters: 1(Integer)
<==      Total: 0
null
Resetting autocommit to true on JDBC Connection [oracle.jdbc.driver.T4CConnection@a67c67e]
Closing JDBC Connection [oracle.jdbc.driver.T4CConnection@a67c67e]
Returned connection 174573182 to pool.

但是,将mybatis发送的SQL复制到数据中直接查询也能查询到该记录。mybatis能返回null,可以说明Oracle数据库连接应该是没问题的,应该是结果的包装出了问题,相关代码描述如下文,求赐教。
Oracle中mybatis_employee表定义如下:

ID        INTEGER                                 
LAST\_NAME VARCHAR2(255) Y                         
GENDER    INTEGER       Y                         
EMAIL     VARCHAR2(255) Y 

mybatis对应的查询配置如下:

   <select id="getEmployeeById" resultType="cn.seu.edu.Mybatis.bean.Employee" databaseId="oracle">
        SELECT ID id, LAST_NAME lastName, GENDER gender, EMAIL email FROM  mybatis_employee WHERE ID = #{id}
    </select>

测试代码如下:

 public void testEmployeeMapper() throws IOException{
        // 创建SqlSessionFactory对象
        InputStream inputStream = Resources.getResourceAsStream("conf/mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 创建session
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Assert.assertNotNull(sqlSession);
        try {
            // 获取接口的实现类对象
            // Mybatis会为接口实现一个代理对象,由代理对象执行sql
            EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
            // 调用接口的方法
            Employee employee = employeeMapper.getEmployeeById(1);
            System.out.println(employee);
        } finally {
            sqlSession.close();
        }
    }

Employee类定义如下

    private Integer id;
    private String lastName;
    private Integer gender;
    private String email;

        以下省略setter和getter
0

9个回答

谢谢各位的帮助,已经找到原因了,感谢 @weixin_38640986 给的灵感。具体原因分析如下:
1、通过“show variables like 'autocommit'”可以看出,MySQL中数据默认是自动提交的,即执行insert语句后会自动commit
2、由于Oracle实现的事务最低级别为read_committed,Oracle不会自动提交更改,默认需要显式commit
本次出现的bug,就是由于在Oracle中执行了insert后没有显式commit,因而mybatis无法查询到相关记录;至于在PL/SQL Developer中可以查看这条
未提交的数据,猜测应该是还在一个事务范围内;
Bug解决方法
1、 显式commit之后,再次执行即可返回结果

2

你的Mapper中的语句只有返回类型,应该需要加一个参数类型。parameterType属性

0
sagwsagw
WYCPhoenix 同样的语句,在mysql中可以运行,到了Oracle却不可以了
一年多之前 回复
sagwsagw
WYCPhoenix 这点我也尝试过,增加了 parameterType="java.lang.Integer",结果还是为null,所以感觉很奇怪
一年多之前 回复

将#换成$ ,#会自动加上""

0
sagwsagw
WYCPhoenix 尝试了一下,会抛出异常There is no getter for property named 'id' in 'class java.lang.Integer';还有,mybatis使用用户输入的值使用的应该就是#{xx}吧,这一点和SpEL是一致的
一年多之前 回复

是不是没有commit

0
sagwsagw
WYCPhoenix 这是select查询语句,不需要commit
一年多之前 回复

jdbc配置的驱动类不对了吧。
mysql : jdbc.driver=com.mysql.jdbc.Driver
oracle: jdbc.driver=oracle.jdbc.driver.OracleDriver

0
sagwsagw
WYCPhoenix 驱动应该是对的,可以正常连接,而且mybatis也没有报错
一年多之前 回复

值有问题不,看是否有默认时间,就是没有给值的,

0
sagwsagw
WYCPhoenix 谢谢,已经知道原因了
一年多之前 回复

关了重启 啊哈哈哈....

0

很明显你的sql语句,动态的有问题呗

0

萌新想请问大佬,这个显式commit怎么写?是在sql/developer中还是在mybatis的mapper.xml中写?正好也遇到了这个问题,想请教一下。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

2
需要查询出所有字段,让userId显示,但是只显示一个,求大佬解答一下
2
需要查询出所有字段,让userId显示,但是只显示一个,求大佬解答一下。
1
需要查询出所有字段,让userId显示,但是只显示一个,求大佬解答一下。
1
新手小白,请帮解决通过DataGraidVIew更新数据库的问题。
1
python数据分析之后处理的数据入什么数据库比较好 mysql?Oracle?
3
我想要将以下的sql语句合并,使查询出的记录包含这些列
2
Oracle中如何实现跨库同步数据
2
SQL server 2008 R2勿删数据库,如何恢复?
1
表单数据和数据库字段里的内容匹配 为什么系统判断为不相等
1
一个有关数据库遇到的算法障碍的问题怎么解决?C语言
2
关于sql语句,批量查询与入库
0
用户任务管理的数据库设计问题
2
【SpringMvc】从数据库读取用户信息,其中图片路径响应变成了text/html,导致图片无法显示
3
JAVA中使用JDBC做批量处理时,没有报错,但是数据没有插入数据库 插入数据显示0条
5
jsp文件如何让下拉框动态读取数据库
2
用thinkphp 在网页上实现form表格(假设有10行数据)的增删改查,连接到数据库中 应该怎么写
5
接收别人推送的数据,存入数据库 sqlserver
1
我需要一个省市区镇街道 五级联动数据库并且需要经纬度,大家说怎么搞
2
mysql删除数据库是出现错误1064《42000》
1
PHP中提示:Warning: mysqli_fetch_array().....应该怎么修改,万分感谢