Mybatis的结合oracle的2个困扰

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis的结合oracle的2个困扰相关的知识,希望对你有一定的参考价值。

第一问题是在oracle存储类型为 char 类型时,为什么在编辑mybatis对应的mapper.xml中这样写:
<select id="selectMsgById" parameterType="String" resultType="msg">
select * from MTP_MSG_TAB where MSG_ID=#msg_id
</select>
然后在接口中传入一个java类型中的String类型的值afa,我在数据库有条字段也为afa
但是却无论如何返回null值,意思是没有满足where语句的等于条件。那么请问orcale中char类型的jdbcType难道不合java中String类型对应么。另外如果直接写语句:
<select id="selectMsgById" parameterType="String" resultType="msg">
select * from MTP_MSG_TAB where MSG_ID=‘afa'
</select>
这样子是可以查出来的。

第二个问题是用mybatis如何在orcale中调用procedure。
有人说 是这样定义xml:
<select id="proHello" statementType="CALLABLE">
<![CDATA[
call pro_hello (#p_user_name,mode=IN,jdbcType=VARCHAR,#result,mode=OUT,jdbcType=VARCHAR)
]]>
</select>
请问那个CDATA是干啥用的。也有人这样写:
<select id="getGroupNum" statementType="CALLABLE" parameterType="com.guorui.model.ParamSPC">
call GYL_COMMON.GETGROUPNUM(
#IN_PARAMETERID,jdbcType=VARCHAR,mode=IN,
#IN_STEELID,jdbcType=VARCHAR,mode=IN,null,null,null,
#OUT_GN,jdbcType=INTEGER,mode=OUT,
#RST,jdbcType=CURSOR,mode=OUT,resultMap=BaseResultMap2,javaType=java.sql.ResultSet)
</select>

很遗憾的是mybatis提供的dtd中并没有在#内的关于jdbcType的提示。

首先回答你的第一个问题 char存储的时候没达到指定长度空出部分已空格填充
第二个问题,直接使用包含就ok了。
参考技术A 建议你把mybatis转换后的sql语句打印出来看看吧,一看就知道了追问

你知道怎么转换么?

Oracle结合Mybatis实现取表TOP 10

之前一直使用mysql和informix数据库,查表中前10条数据十分简单:

 

最原始版本:

select top * from student

当然,我们还可以写的复杂一点,比如外加一些查询条件?

比如查询前10条成绩大于80分的学生信息

 

添加了where查询条件的版本:

select top * from table where score > 80

 

但是!!oracle中没有top啊!!!!那么该如何实现呢?

嗯,可以用rownum!

oracle中原始版本

select * from student where rownum < 10

上面这个好像也没有复杂的地方。。但是问题来了,如果我们还希望加上分数大于80呢?

对于我这个oracle初学者来说,真的是费力。在这里就直接贴出来了,希望可以让一些人少费一些力!

 

oracle添加了where查询条件的版本

select * from(
        select rownum rn,A.* from student where score > 80) 
where rn < 10

简单分析一下上面的代码。实际上是先通过内嵌的sql语句查询出分数大于80的数据,再选择内嵌sql查询结果中的前10条数据

 

最后附上mybatis代码?

<select id="selectStudent" parameterType="hashmap" resultMap="BaseResultMap">
     select *
     from (
        select rownum rn, A.* from student A
        where STATUS = 99
        and score <![CDATA[>]]> #{scores,jdbcType=INTEGER}) 
     where rn <![CDATA[<=]]> #{number,jdbcType=INTEGER}
  </select>

上面的scores和number均为变量

 

碎碎念一般的写了这么点。希望能帮助一下遇到和我相同问题的朋友。

以上是关于Mybatis的结合oracle的2个困扰的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis 杂项(分页,缓存,处理BLOBCLOB数据)

Mybatis学习过程记录

Mybatis学习过程记录

Mybatis学习过程记录

Oracle结合Mybatis实现取表TOP 10

mybatis与spring集成