sagwsagw
WYCPhoenix
采纳率0%
2018-01-08 09:11 阅读 4.6k

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

5

最近学习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
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

9条回答 默认 最新

  • sagwsagw WYCPhoenix 2018-01-08 12: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之后,再次执行即可返回结果

    点赞 2 评论 复制链接分享
  • zshzsh1994 zshzsh1994 2018-01-08 09:29

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

    点赞 评论 复制链接分享
  • qq_23727789 马踏紫陌 2018-01-08 09:48

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

    点赞 评论 复制链接分享
  • weixin_38640986 weixin_38640986 2018-01-08 09:52

    是不是没有commit

    点赞 评论 复制链接分享
  • fhf942656334 mummyFine 2018-01-08 10:37

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

    点赞 评论 复制链接分享
  • qq_39532367 qq_39532367 2018-01-08 11:56

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

    点赞 评论 复制链接分享
  • Yuan_bowen Yuan_bowen 2018-01-08 12:24

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

    点赞 评论 复制链接分享
  • lixiaozhen007 lixiaozhen007 2018-01-08 15:09

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

    点赞 评论 复制链接分享
  • weixin_39251330 菜鸡の养成 2019-01-02 07:17

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

    点赞 评论 复制链接分享

相关推荐