mybatis与gbase8s plsql适配问题一

在使用 mybatis 调用 gbase8s oracle模式下创建的plsql时 ,出现空指针的报错

Caused by: java.lang.NullPointerException
    at com.gbasedbt.jdbc.IfxCallableStatement.getResultSet(IfxCallableStatement.java:267)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getFirstResultSet(DefaultResultSetHandler.java:240)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:188)
    at org.apache.ibatis.executor.statement.CallableStatementHandler.query(CallableStatementHandler.java:69)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
    at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:328)
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:157)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)

create or replace procedure p1(m int, n out int) is
a int;
begin
select 1 into a from dual;
n:=a;
end;
/
<select id="getProc" statementType="CALLABLE" resultType="java.util.HashMap">
        call p1(
            #{mm,mode=IN,jdbcType=INTEGER},
            #{ret,mode=OUT,jdbcType=INTEGER}
            )
    </select>
        HashMap<String,Integer> hashMap = new HashMap();
        hashMap.put("mm",23);
        tableOneMapper.getProc(hashMap);
        System.out.println(hashMap.get("ret"));

整体调用逻辑如下

execute(SqlSession sqlSession, Object[] args)  -->
sqlSession.selectOne(command.getName(), param);  -->
this.selectList(statement, parameter);  -->
this.selectList(statement, parameter, RowBounds.DEFAULT);  -->
selectList(statement, parameter, rowBounds, Executor.NO_RESULT_HANDLER);  -->
executor.query(ms, wrapCollection(parameter), rowBounds, handler);  -->
query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);  -->
delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);  -->
queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);  -->
doQuery(ms, parameter, rowBounds, resultHandler, boundSql);  -->
handler.query(stmt, resultHandler);  -->
delegate.query(statement, resultHandler);  -->
resultSetHandler.handleResultSets(cs);  -->
getFirstResultSet(stmt);  -->
gbasedbt.jdbc getResultSet();

其中在最终调用到gbasedbt.jdbc 下的 getResultSet 方法时,当resultset为空时 会直接throw Exception ,将异常传递给上层,导致最终空指针错误

解决方案

1  使用<update> 标签去调用plsql

2 在getResultSet 的上一层 主动 try catch 异常

    private ResultSetWrapper getFirstResultSet(Statement stmt) throws SQLException {
        ResultSet rs;
        try {
            rs = stmt.getResultSet();
        }catch (Exception e){
            rs=null;
        }
        while (rs == null) {
            // move forward to get the first resultset in case the driver
            // doesn't return the resultset as the first result (HSQLDB 2.1)
            if (stmt.getMoreResults()) {
                rs = stmt.getResultSet();
            } else {
                if (stmt.getUpdateCount() == -1) {
                    // no more results. Must be no resultset
                    break;
                }
            }
        }
        return rs != null ? new ResultSetWrapper(rs, configuration) : null;
    }

MyBatis框架下,结合GBase8s JDBC驱动来操作GBase8s数据库,你可以按照以下步骤进行: 1. **添加依赖**: - 首先,你需要将GBase8s JDBC驱动(通常是个.jar文件)添加到项目的类路径中。如果你使用Maven,可以在pom.xml文件中添加如下依赖: ```xml <dependency> <groupId>com.gbase</groupId> <artifactId>gbase8s-jdbc</artifactId> <version>版本号</version> </dependency> ``` 替换`版本号`为实际的驱动版本。 2. **配置数据源**: 在Spring Boot项目中,可以创建个DataSource实例,并配置GBase8s的URL、用户名和密码: ```java @Bean public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("com.gbase.jdbc.GBaseDriver"); dataSource.setUrl("jdbc:gbase://localhost:29700/your_database_name"); dataSource.setUsername("your_username"); dataSource.setPassword("your_password"); return dataSource; } ``` 3. **编写Mapper接口**: 创建MyBatis的Mapper接口,定义SQL映射方法,例如查询、插入、更新和删除操作: ```java // UserMapper.java public interface UserMapper { List<User> getAllUsers(); void addUser(User user); // 其他操作... } ``` 4. **XML映射文件**: 编写Mapper XML文件,描述如何将SQL语句Mapper接口中的方法对应起来: ```xml <!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <select id="getAllUsers" resultType="User"> SELECT * FROM users; </select> <insert id="addUser" parameterType="User"> INSERT INTO users (name, email) VALUES (${name}, ${email}); </insert> <!-- 添加其他SQL映射 --> </mapper> ``` 5. **注入Mapper**: 在需要使用的地方,通过SqlSession获取Mapper并进行数据库操作: ```java @Autowired private UserMapper userMapper; public void main() { SqlSession session = sqlSessionFactory.openSession(); try { List<User> users = userMapper.getAllUsers(); // 查询所有用户 userMapper.addUser(newUser); // 插入新用户 } finally { session.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值