INSERT INTO riskm_catalog( id, title) VALUES ( #id#, #title#)
SELECT LAST_INSERT_ID() AS value
如果传入的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,title FROM risk_catalog WHERE pid=#value#
java代码怎么写呢?它怎么知道那个是key呢?需要明确指明的哈
getTemplate().queryForMap(getNamespace()+".getCatalogByPid", pid, "id");
最后的结果如下:
{
12:{
id:12
title: 一级
}
13:{
id:13
title:一层菜单
}
}
结果是一个嵌套的Map结构,这样支持多个key/value对的结果,类似于List
和我们想象的结果稍有不同哈。
4、批量操作为什么用事务?
为了提高效率,SQL可以将多次操作合并为一次操作,这样减少了磁盘IO次数。
通过事务可以保证这些操作要么全部成功,要么全部失败!对于数据的校验可以插入之前完成。批量操作时可以通过事务来保证批量insert成功!
5、Mysql中的反引号有什么用?
mysql中有些保留字不能当作列名,比如desc、key等。那怎么办呢?可以用反引号(键盘上'~'那个按键)
比如 SELECT `id`,`key_` as `key` FROM risk_catalog
6、Ibatis中
isNotNull 只判断传入的参数如果不是NULL,则执行条件内的语句
isNotEmpty 会判断传入的参数如果不是NULL&不为空串,则执行条件内语句
7、Dynamic,prepend语句编写注意事项[第二次遇到该问题]
问题回顾:
如果传入的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通过
解决办法:
方法一:dynamic语句中去掉prepend语句,将where子句提到外面。
SELECT count(*) FROM risk_catalog
where leaf = 1
方法二:把dynamic子句条件中的 prepend去掉
SELECT count(*) FROM risk_catalog
leaf = 1
and title like CONCAT('%',#title#,'%') ]]>
and status = #status# ]]>
推荐使用方法一,保持风格的一致性!!
8、Order by子句的默认排序是什么?asc,desc各代表什么?
order by 默认是升序,也就是asc;desc是降序。一般情况,按照时间排序,则需要降序排列,即把最新修改的记录显示在最前面!