Mapper查询技巧
时间:2019-04-15
本文章向大家介绍Mapper查询技巧,主要包括Mapper查询技巧使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Sql字段动态比较判断
<sql id="getUserInfoList_body"> SELECT * from userinfo <dynamic prepend="WHERE"> <isNotNull prepend="AND" property="id"> a.id=#id#</isNotNull> <isNotNull prepend="AND" property="userName"> a.userName like concat('%', #userName#, '%') </isNotNull> <isNotNull prepend="AND" property="inschoolTimeEnd"> a.inschoolTime < #inschoolTimeEnd# </isNotNull> <isNotNull property="roleID"> <isEqual property="roleID" compareValue="3" prepend="AND"> addrProvinceID in (SELECT areaID FROM co_user_area WHERE adminID = #adminID#)</isEqual> <isEqual property="roleID" compareValue="4" prepend="AND"> addrCityID in (SELECT areaID FROM co_user_area WHERE adminID = #adminID#)</isEqual> </isNotNull> </dynamic> ORDER BY a.id DESC </sql>
sql语句返回主键id
<insert id=""> //注意无需resultClass … <selectKey resultClass="int" keyProperty="id"> SELECT @@IDENTITY AS id </selectKey> </insert> public Integer insert(Invoice invoice) throws DAOException { return (Integer)getSqlMapClientTemplate().insert("insert",invoice); }
sql时间范围查询条件
//一 < isNotNull prepend="AND" property="createStartDateStr">
CONVERT(varchar(100), kb.createDate , 23) >= #createStartDateStr#
</isNotNull> <isNotNull prepend="AND" property="createEndDateStr"> CONVERT(varchar(100),kb.createDate,23) <=#createEndDateStr#
</isNotNull> //二 <isNotNull prepend="AND" property="startTime"> kc.createDate >= #startTime#
</isNotNull> <isNotNull prepend="AND" property="endTime"> <![CDATA[kc.createDate <= #endTime#]]>
</isNotNull> //三 <isNotNull prepend="AND" property="startTime"> CONVERT(varchar(100), kb.createDate , 23) >= #startTime#
</isNotNull> <isNotNull prepend="AND" property="endTime"> CONVERT(varchar(100), kb.createDate , 23) <= #endTime#
</isNotNull>
sql每月数据统计
SELECT COUNT(DISTINCT kes.userID) AS examCount, CONVERT(nvarchar(7), kesd.createTime, 120) AS month FROM kp_out_system kos WITH (NOLOCK) LEFT JOIN kp_exam_score kes WITH (NOLOCK) ON kes.outSystemSign = kos.outSystemSign LEFT JOIN kp_exam_score_detail kesd WITH (NOLOCK) ON kesd.examScoreID = kes.id AND kesd.valid = 1 < isNotNull prepend="AND" property="startTime"> kesd.createTime >= #startTime# </isNotNull> <isNotNull prepend="AND" property="endTime"> kesd.createTime <= #endTime# </isNotNull> WHERE kos.status = 1 <isNotNull prepend="AND" property="outSystemSign"> kos.outSystemSign=#outSystemSign# </isNotNull> AND kos.outSystemSign IS NOT NULL AND kos.sysAreaID IS NOT NULL AND kesd.createTime IS NOT NULL GROUP BY CONVERT(nvarchar(7), kesd.createTime, 120) ORDER BY CONVERT(nvarchar(7), kesd.createTime, 120)
sql对sum()结果判空
SELECT ISNULL(SUM(myTable.thesisCount),0) AS thesisCount FROM ( SELECT COUNT(kuu.id) AS thesisCount, ISNULL(kos.outSystemName, '无') AS outSystemName FROM kp_out_system kos WITH (NOLOCK) LEFT JOIN kp_user_upload_thesis kuu WITH (NOLOCK) ON kuu.outSystemSign = kos.outSystemSign AND kuu.valid = 1 WHERE kos.status = 1 <isNotNull prepend="AND" property="outSystemSign"> kuu.outSystemSign = #outSystemSign# </isNotNull> AND kos.outSystemSign IS NOT NULL AND kos.sysAreaID IS NOT NULL GROUP BY ISNULL(kos.outSystemName, '无')
) AS myTable
验证某个属性是否已存在(修改信息时用)
select COUNT(*) from ... where id != #id# and ... = #...#
sql数组传参(in)
//Action代码 if (null != studyID && 2 == studyID.intValue()) { Integer[] studyIDs = new Integer[] { 2,3, 4 }; userInfo.setStudyIDs(studyIDs); } else { userInfo.setStudyID(studyID); } //Xml文件 <isNotNull prepend="AND" property="studyID"> a.studyID=#studyID# </isNotNull> <isNotNull prepend="AND" property="studyIDs"> a.studyID in <iterate property="studyIDs" open="(" close=")" conjunction=","> #studyIDs[]# </iterate> </isNotNull>
Int类型拼接需要使用cast()
SELECT (SELECT DISTINCT CAST(studyID AS varchar) + ',' FROM kp_study_type WHERE outSystemSign = 'drivingcoach' AND valid = 1 FOR xml PATH ('')) AS studyIDs, ISNULL( SUM(CASE WHEN b.isPass = 1 THEN 1 ELSE 0 END), 0) AS isPassCount, ISNULL( SUM(CASE WHEN b.isOpen = 1 OR b.isOpen = 3 THEN 1 ELSE 0 END), 0) AS isOpenCount, ISNULL( SUM(CASE WHEN b.isOpen = 1 OR b.isOpen = 3 THEN 0 ELSE 1 END), 0) AS isNotOpenCount FROM kp_study_type a WITH (NOLOCK) INNER JOIN kp_select_studyType b WITH (NOLOCK) ON a.studyID = b.studyID AND b.valid = 1 INNER JOIN kp_user_info kui WITH (NOLOCK) ON kui.ID = b.userID AND kui.valid = 1 LEFT JOIN (SELECT k.studyID, k.userID, SUM(k.studyTimes) studyTimes, SUM(CASE WHEN k.studyTimes >= k.studyTime * 60 THEN 1 ELSE 0 END) coursefinishCount, COUNT(k.courseID) courseCount FROM (SELECT r.studyID, t.userID, SUM(t.studyTimes) AS studyTimes, r.courseID, r.studyTime FROM kp_studyCourse_relation r WITH (NOLOCK) LEFT JOIN kp_course c WITH (NOLOCK) ON r.courseID = c.id LEFT JOIN kp_study_course_time t WITH (NOLOCK) ON c.courseNumber = t.courseNumber AND t.studyID = r.studyID WHERE r.valid = 1 AND c.valid = 1 AND t.id IS NOT NULL GROUP BY r.studyID, t.userID, r.courseID, r.studyTime) k GROUP BY k.studyID, k.userID) e ON a.studyID = e.studyID AND b.userID = e.userID WHERE a.valid = 1 AND a.studyID IN (SELECT DISTINCT studyID FROM kp_select_studyType WHERE outerSystemSign = 'drivingcoach' AND valid = 1 AND isOpen = 1)
sql截取字符串
SELECT DISTINCT ISNULL(SUBSTRING(areaID, 1, 6), 0) AS areaID FROM kp_user_info 或 SELECT TOP 10 kui.username FROM kp_user_info kui WITH (NOLOCK) LEFT JOIN dic_area dc WITH (NOLOCK) ON RIGHT(kui.areaID, 6) = dc.areaID
地区搜索,传参设置
if(null != provinceID && !"000000".equals(provinceID)){ productOrder.setAreaID(provinceID); } if(null!=cityID && cityID != ""){ //数据库存储为110000:110101,依据存储方式设置 productOrder.setAreaID(provinceID+":"+cityID); } <dynamic prepend=""> <isNotNull prepend="AND" property="areaID"> kui.areaID like #areaID# + '%' </isNotNull> </dynamic>
以...开头
* FROM computer WHERE sex = '男' AND LEFT(name, 1) IN ('李', '陈') 或 SELECT * FROM computer WHERE sex = '男' (and name like '李__'or name like '陈__')
跨库复制表数据
//-1- SET IDENTITY_INSERT cdel_jxjy_flat20171106..op_ip_login_control ON; //-2- INSERT INTO cdel_jxjy_flat20171106..op_ip_login_control (id, ip, notes, valid, creator, createTime) SELECT * FROM cdel_jxjy_flat0725..op_ip_login_control
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【译】9个强大的JavaScript技巧
- 【译】算法的记录
- 运行时类型识别
- 外观模式-分析和C++实现
- CSS八种让人眼前一亮的HOVER效果
- 懒加载图片以获取最佳性能的最佳方案
- Egg.js 试水 - 天气预报
- Egg.js试水 - 文章增删改查【前后端分离】
- Flutter基础widgets教程-Offstage篇
- 一份礼物.apk - o泡果奶-的逆向分析
- 代码审计-.NET下的序列化与反序列化(BinaryFormatter)
- 02.视频播放器整体结构
- Spring中@Component和@Bean
- HTTP对接方式
- 使用ShardingSphere 过程中遇到的关于spring boot 版本的问题