搜索到关键字为 mybatis 的相关日志 4 篇: ("[空格]和"+"[加号] 可作搜索分隔符号使用.)

不受支持的 SQL 类型 1111 rainy

Sybase 的官方驱动 jConnect4 (链接字符串:jdbc:sybase:Tds:127.0.0.1:5000/xxx) 结合myBatis使用时,发现如下问题,当insert或者update语句的变量含有null值,会报错:

 ### Cause: java.sql.SQLException: JZ006: 捕获到 IO 例外:java.io.IOException: JZ0SL: 不受支持的 SQL 类型 1111。

Cause: java.sql.SQLException: JZ006: Caught IOException: java.io.IOException: JZ0SL: Unsupported SQL type 1111.

由于参数出现了null值,myBatis进行操作的时候,指定jdbcType类型的参数时,mybatis默认设置为jdbcType.OTHER,导致Sybase数据库无法识别此格式。

解决方法:给参数加上jdbcType可解决(注意大小写) 。

比如:
insert into xxx(a,b) values(#{a,jdbcType=VARCHAR}, #{b,jdbcType=DATE})
update xxx set a=#{a,jdbcType=VARCHAR} where id=#{id}

目前jdbcType含有以下类型:

ARRAY(Types.ARRAY),
BIT(Types.BIT),
...

myBatis 存储过程返回值的问题 cloud

今天在调试myBatis调用Sybase数据库的存储过程的时候,出现了如下错误:

org.apache.ibatis.binding.BindingException: Mapper method 'getNextKey' (interface com.xxxxxxx.PackHandleMapper) attempted to return null from a method with a primitive return type (long).
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:37)
at $Proxy17.getNextKey(Unknown Source)
....

报错信息言下之意是返回值为空,可是我的存储过程明明是返回了一个记录集,存储过程如下:

   sql代码
  1. CREATE PROCEDURE prc_seq(@seq_name varchar(20)) 
  2. AS 
  3. BEGIN
  4.     UPDATE seq SET val=val+1 WHERE [name]=@seq_name 
  5.     SELECT val from seq WHERE [name]=@seq_name 
  6. END 
  7. GO 

而且在数据库终端,可以成功执行和返回数据:
exec prc_seq 'xxx'

--------------------------------------------------------------------------------------------------------

经过排查得知,故障是由于update语句引起的,执行上面的语句,会产生两条执行记录,myBatis获取了update语句的执行情况:

1 record(s) affected
1 record(s) selected  [Fetch MetaData: 0/ms]  [Fetch Data: 0/ms] 

解决方法,去掉update语句的执行情况返回,即增加语句:SET NOCOUNT ON

   sql代码
  1. CREATE PROCEDURE prc_seq(@seq_name varchar(20)) 
  2. AS 
  3. BEGIN 
  4.     SET NOCOUNT ON 
  5.     UPDATE seq SET val=val+1 WHERE [name]=@seq_name 
  6.     SELECT val from seq WHERE [name]=@seq_name 
  7. END 
  8. GO 

...

myBatis 使用Select top 动态参数出现“´@P0´ 附近有语法错误”的解决 cloudy

今天在使用myBatis使用 select top #{num} * from tableName... 传递动态参数的时候会无法执行SQL语句,报错:'@P0'附近有语法错误

最后寻得解决方法应该为:select top ${num} * from tableName...

iBatis2对应语法是:#num# 和 $num$。

具体解释如下:(转自:wangkuoguang的“成长”空间)

1、#是把传入的数据当作字符串,如#field#传入的是id,则sql语句生成是这样,order by "id",这当然会报错。
2、$传入的数据直接生成在sql里,如#field#传入的是id,则sql语句生成是这样,order by id, 这就对了。
3、#方式能够很大程度防止sql注入。
4、$方式无法方式sql注入。
5、$方式一般用于传入数据库对象,例如传入表名。
6、一般能用#的就别用$。


...

iBatis改名myBatis,逐步脱离apache,投向Google Code suny

iBatis改名myBatis,逐步脱离apache,投向Google Code。

半自动的iBatis/myBatis ORM框架
      iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java和.net的持久层框架。

      使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的 Java对象,这一层与通过Hibernate 实现 ORM 而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL 语句,而ibatis 则要求开发者编写具体的 SQL 语句。相对Hibernate等 “全自动”ORM机制而言,ibatis 以 SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。作为“全自动”ORM实现的一种有益补充,ibatis 的出现显得别具意义。

原官方网站、更名和迁移公告:http://ibatis.apache.org

新官方网站: