2 sagwsagw sagwsagw 于 2018.01.08 17:11 提问

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

8个回答

sagwsagw
sagwsagw   2018.01.08 20:18

谢谢各位的帮助,已经找到原因了,感谢 @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之后,再次执行即可返回结果

zshzsh1994
zshzsh1994   2018.01.08 17:29

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

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

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

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

是不是没有commit

sagwsagw
sagwsagw 这是select查询语句,不需要commit
11 天之前 回复
fhf942656334
fhf942656334   2018.01.08 18:37

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

sagwsagw
sagwsagw 驱动应该是对的,可以正常连接,而且mybatis也没有报错
11 天之前 回复
qq_39532367
qq_39532367   2018.01.08 19:56

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

sagwsagw
sagwsagw 谢谢,已经知道原因了
11 天之前 回复
Yuan_bowen
Yuan_bowen   2018.01.08 20:24

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

lixiaozhen007
lixiaozhen007   2018.01.08 23:09

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!