ibatis常见问题

来源:互联网 发布:mysql order by count 编辑:程序博客网 时间:2024/05/29 18:31
1、自增主键。

比如表 table1 中列id为主键,且自增,那么插入记录的时候SQL怎么写?

<insert id="insert" parameterClass="riskmCatalogDO" >
      INSERT INTO riskm_catalog( id, title)  VALUES ( #id#, #title#)
      <selectKey keyProperty="id" resultClass="java.lang.Integer" >
           SELECT LAST_INSERT_ID() AS value
      </selectKey>
</insert>

如果传入的riskmCatalogDO中id类型为:private Integer id;

new RiskmCatalogDO() 时,id为null,那么上述SQL就类似于

insert into riskm_catalog (id,title) values(null,"dckjdnca");结果就是id数据库会自增。

如果传入id值,则数据库会校验该主键是否已存在!

其中, SELECT LAST_INSERT_ID() AS value 要返回数据插入记录id,前提是设置数据库id字段自增

注意:

如果insert时传入主键,则返回值为0,参考SQL语句:insert into `risk_catalog`(id,title) values(12,'test');select LAST_INSERT_ID();

如果insert时未传入主键,则返回数据库插入记录自动生成的id值,参考SQL语句:insert into `risk_catalog`(title) values('test');select LAST_INSERT_ID();

 

2、查询某个时间段的记录数

select count(*from roster_value_0032 where gmt_create >= '2013-03-01 00:00:00' and gmt_create <= '2013-03-31 23:59:59'

今天遇到奇怪的问题,上述SQL用双引号时查询不出结果!!!MYSQL手册上是这么说的:

字符串指用单引号(‘'’)或双引号(‘"’)引起来的字符序列。例如:'a string'  "another string"

如果SQL服务器模式启用了NSI_QUOTES,可以只用单引号引用字符串。用双引号引用的字符串被解释为一个识别符。

 

3、查询返回Map怎么做?

xml文件里这么写,resultClass 是 hashmap,返回id-title两列

<select id="getCatalogByPid" parameterClass="int" resultClass="java.util.HashMap">
      SELECT id,title FROM risk_catalog WHERE pid=#value# 
</select>

java代码怎么写呢?它怎么知道那个是key呢?需要明确指明的哈

getTemplate().queryForMap(getNamespace()+".getCatalogByPid", pid, "id");

最后的结果如下:

{
    12:{
              id:12
              title: 一级
         }
     13:{
               id:13
               title:一层菜单
          }
}

结果是一个嵌套的Map结构,这样支持多个key/value对的结果,类似于List<DO>

和我们想象的结果稍有不同哈。

 

4、批量操作为什么用事务?

为了提高效率,SQL可以将多次操作合并为一次操作,这样减少了磁盘IO次数。

通过事务可以保证这些操作要么全部成功,要么全部失败!对于数据的校验可以插入之前完成。批量操作时可以通过事务来保证批量insert成功!

 

5、Mysql中的反引号有什么用?

mysql中有些保留字不能当作列名,比如desc、key等。那怎么办呢?可以用反引号(键盘上'~'那个按键)

 比如 SELECT `id`,`key_` as `key` FROM risk_catalog 

 

6、Ibatis中 <isNotNull> 和 <isNotEmpty>的区别?[第二次遇到该问题]

 isNotNull 只判断传入的参数如果不是NULL,则执行条件内的语句

 isNotEmpty 会判断传入的参数如果不是NULL&不为空串,则执行条件内语句

 

7、Dynamic,prepend语句编写注意事项[第二次遇到该问题]

问题回顾:

<select id="getCount" parameterClass="hashmap" resultClass="int">
      SELECT count(*) FROM risk_catalog
     <dynamic prepend="where"> 
          leaf = 1
          <isNotEmpty property="title" prepend="AND">
               <![CDATA[ title like CONCAT('%',#title#,'%') ]]>
          </isNotEmpty>
          <isNotNull property="status" prepend="AND">
               <![CDATA[ status = #status# ]]>
          </isNotNull>
     </dynamic>
</select>

 如果传入的status=1 则生成的SQL语句是

SELECT COUNT(*) FROM risk_catalog where leaf = 1 status = 1

 因此会报错!什么inline parameter。。。也就是 prepend="AND" 失效了!!!

问题分析:

dynamic和prepend配合使用的时候,有一个潜规则。如果dynamic拥有"prepend='where'"属性,则dynamic语句中的第一个含有prepend属性且条件为真的判断语句的prepend值会被忽略。详情请见ibatis的dynamicSQL中,关于prepend的使用

为何有这个潜规则?因为 where 子句后面跟着的第一个为的条件是不需要and的!!!也就是如果没有"leaf=1",则生成的SQL语句是正确的,即 SELECT COUNT(*) FROM risk_catalog where status = 1,where后面是不需要"and"的!

如果所有的条件都是放入dynamic通过<isNotNull>或者<isNotEmpty>来判断,则直接用就可以了。但如果需要引入某些已知条件,比如 "leaf=1" 则需要采用下面的方法来解决了!!

解决办法:

方法一:dynamic语句中去掉prepend语句,将where子句提到外面。

<select id="getCount" parameterClass="hashmap" resultClass="int">
      SELECT count(*) FROM risk_catalog
      where leaf = 1
     <dynamic prepend=""> 
          <isNotEmpty property="title" prepend="AND">
               <![CDATA[ title like CONCAT('%',#title#,'%') ]]>
          </isNotEmpty>
          <isNotNull property="status" prepend="AND">
               <![CDATA[ status = #status# ]]>
          </isNotNull>
     </dynamic>
</select>

方法二:把dynamic子句条件中的 prepend去掉

<select id="getCount" parameterClass="hashmap" resultClass="int">
      SELECT count(*) FROM risk_catalog
      <dynamic prepend="where"
          leaf = 1
          <isNotEmpty property="title" prepend="">
               <![CDATA[ and title like CONCAT('%',#title#,'%') ]]>
          </isNotEmpty>
          <isNotNull property="status" prepend="">
               <![CDATA[ and status = #status# ]]>
          </isNotNull>
     </dynamic>
</select> 

推荐使用方法一,保持风格的一致性!!

8、Order by子句的默认排序是什么?asc,desc各代表什么?

order by 默认是升序,也就是asc;desc是降序。一般情况,按照时间排序,则需要降序排列,即把最新修改的记录显示在最前面!