一、基础标签使用
在XML中,需要转义的字符有:
(1) & &
(2) < <
(3) > >
(4)" "
(5)' '
(1)if 标签
and stu_name like '%' ||#{stuName}||'%'
//这个标记所包含的内容将表示为纯文本,内部的所有内容都会被解析器忽略
#{stuBirthdate}]]>
2、choose标签
choose元素相当于java语句的if … else if …else语句
and stu_name=#{stuName}
and stu_birthdate=#{stuBirthdate}
and stu_phone=#{stuPhone}
3、where标签
使用where元素会自动根据条件的个数增删where语句and运算符
and stu_name=#{stuName}
and stu_birthdate=#{stuBirthdate}
4、trim 标签
二、mybatis内部类映射写法
(1)java实体类创建
/**
* 具体消息返回封装
* @author YJX
*
*/
public class MessageCenterVo extends MessageCenter implements Serializable{
private static final long serialVersionUID = 1L;
private String activeTime;
public String getActiveTime() {
return activeTime;
}
public void setActiveTime(String activeTime) {
this.activeTime = activeTime;
}
//阅读名单
static class ReadingList{
private String city; //城市
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
/*public ReadingList() {
super();
// TODO Auto-generated constructor stub
}*/
}
}
外部类调用内部类:
MessageCenterVo.ReadingList list = new MessageCenterVo.ReadingList()
(2)内部类映射写法
三、新增返回主键
(1)当表没有设置主键
insert into user(userName,password,comment)
values(#{userName},#{password},#{comment})
useGeneratedKeys="true" 表示给主键设置自增长
keyProperty="userId" 表示将自增长后的Id赋值给实体类中的userId字段。
(2)表设置有主键
SELECT LAST_INSERT_ID()
INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});
四、trim标签与foreach标签组合使用
OR dd.arriveOvertime=1
OR dd.getOvertime=1
OR dd.deliveryOvertime=1
OR dd.errorDriverGetReceiveLocation=1
OR (UNIX_TIMESTAMP(dd.driverDeliveryTime)-UNIX_TIMESTAMP(dd.driverGetTime))<60
OR dd.seriousOvertime=1
prefix:在trim标签内sql语句加上前缀。
suffix:在trim标签内sql语句加上后缀。
suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。
prefixOverrides:指定去除多余的前缀内容
五、批量更新与case when结合使用
UPDATE t_delivery_item
SET
state = CASE itemId
WHEN #{deliveryItem.itemId} THEN IF((#{deliveryItem.itemAuantity} - RefundingNum)=0,0,1)
END,
RefundingNum = CASE itemId
WHEN #{deliveryItem.itemId} THEN RefundingNum - #{deliveryItem.itemAuantity}
END,
RefundedNum = CASE itemId
WHEN #{deliveryItem.itemId} THEN RefundedNum + #{deliveryItem.itemAuantity}
END
WHERE
orderCode=#{orderCode} AND itemId IN
#{deliveryItem.itemId}
UPDATE pms_sku_stock
SET
lock_stock = CASE id
WHEN #{promotionItem.productSkuId} THEN lock_stock + #{promotionItem.quantity} + #{promotionItem.restrictQuantity}
END,
version = CASE id
WHEN #{promotionItem.productSkuId} THEN version=version+1
END
WHERE
version = CASE id
WHEN #{promotionItem.productSkuId} THEN version=version+1
END
AND id IN
#{promotionItem.productSkuId}
六、MySql解析JSON字符串自定义函数
DELIMITER $$
DROP FUNCTION IF EXISTS fn_parseJson$$
CREATE FUNCTION fn_parseJson(p_jsonstr VARCHAR(255) character set utf8, p_key VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
DECLARE rtnVal VARCHAR(255) DEFAULT '';
DECLARE v_key VARCHAR(255);
SET v_key = CONCAT('"', p_key, '":');
SET @v_flag = p_jsonstr REGEXP v_key;
IF(@v_flag = 0) THEN
SET rtnVal = '';
ELSE
SELECT val INTO rtnVal FROM (
SELECT @start_pos := locate(v_key, p_jsonstr),
@end_pos := @start_pos + length(v_key),
@tail_pos := if(locate(",", p_jsonstr, @end_pos) = 0, locate("}", p_jsonstr, @end_pos), locate(",", p_jsonstr, @end_pos)),
substring(p_jsonstr, @end_pos + 1, @tail_pos - @end_pos - 2) as val) as t;
END IF;
RETURN rtnVal;
END $$
DELIMITER;
七、以半分钟进行分组
SELECT sum(revNum),dataStartTime FROM
(
SELECT DATE_FORMAT( concat(date(dataStartTime),' ',HOUR(dataStartTime),':',floor( MINUTE(dataStartTime)/30 )*30) ,'%Y-%m-%d %H:%i') AS dataStartTime
FROM devicedata
) a
GROUP BY DATE_FORMAT( dataStartTime ,'%Y-%m-%d %H:%i')
八、以年、月、日、时、分、秒进行分组
%M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。
1、以年分组
SELECT year(END_TIME) time from zfzb_equip GROUP BY year(END_TIME)
SELECT DATE_FORMAT(END_TIME,'%Y') time from zfzb_equip GROUP BY DATE_FORMAT(END_TIME,'%Y')
2、以月分组
SELECT month(END_TIME) time from zfzb_equip GROUP BY month(END_TIME)
SELECT DATE_FORMAT(END_TIME,'%Y-%m') time from zfzb_equip GROUP BY DATE_FORMAT(END_TIME,'%Y-%m')
3、以日分组
SELECT date(END_TIME) from zfzb_equip GROUP BY date(END_TIME)
SELECT DATE_FORMAT(END_TIME,'%Y%m%Y%m%d') time from zfzb_equip GROUP BY DATE_FORMAT(END_TIME,'%Y%m%d')