最近学习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
你的Mapper中的语句只有返回类型,应该需要加一个参数类型。parameterType属性
将#换成$ ,#会自动加上""
是不是没有commit
jdbc配置的驱动类不对了吧。
mysql : jdbc.driver=com.mysql.jdbc.Driver
oracle: jdbc.driver=oracle.jdbc.driver.OracleDriver
值有问题不,看是否有默认时间,就是没有给值的,
谢谢各位的帮助,已经找到原因了,感谢 @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之后,再次执行即可返回结果
关了重启 啊哈哈哈....
很明显你的sql语句,动态的有问题呗
萌新想请问大佬,这个显式commit怎么写?是在sql/developer中还是在mybatis的mapper.xml中写?正好也遇到了这个问题,想请教一下。
如果你写了to_char()函数,并且给日期一列加了别名,建议把as去掉试试!
这是在公司遇到的一个bug,以不可思议的方式解决!