iBatis에서 사용하는 16개의 SQL 문장

19787 단어 ibatissql 문장
iBatis 소개:
iBatis는apache의 개원 프로젝트로 O/R Mapping 솔루션입니다. iBatis의 가장 큰 특징은 작고 손이 빠르다는 것입니다.만약 너무 복잡한 기능이 필요하지 않다면, iBatis는 당신의 요구를 만족시킬 수 있고 충분히 유연할 수 있는 가장 간단한 해결 방안입니다. 현재의 iBatis는 이미 Mybatis로 개명되었습니다.
홈페이지:http://www.mybatis.org/
1. 매개변수를 단일 값으로 입력

<delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" 
parameterClass="long"> 
delete from 
MemberAccessLog 
where 
accessTimestamp = #value# 
</delete> 
<delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" 
parameterClass="long"> 
delete from 
MemberAccessLog 
where 
accessTimestamp = #value# 
</delete>
2. 매개 변수를 하나의 객체로 입력

<insert id="com.fashionfree.stat.accesslog.MemberAccessLog.insert" 
parameterClass="com.fashionfree.stat.accesslog.model.MemberAccessLog> 
insert into MemberAccessLog 
( 
accessLogId, memberId, clientIP, 
httpMethod, actionId, requestURL, 
accessTimestamp, extend1, extend2, 
extend3 
) 
values 
( 
#accessLogId#, #memberId#, 
#clientIP#, #httpMethod#, 
#actionId#, #requestURL#, 
#accessTimestamp#, #extend1#, 
#extend2#, #extend3# 
) 
</insert> 
<insert id="com.fashionfree.stat.accesslog.MemberAccessLog.insert" 
parameterClass="com.fashionfree.stat.accesslog.model.MemberAccessLog> 
insert into MemberAccessLog 
( 
accessLogId, memberId, clientIP, 
httpMethod, actionId, requestURL, 
accessTimestamp, extend1, extend2, 
extend3 
) 
values 
( 
#accessLogId#, #memberId#, 
#clientIP#, #httpMethod#, 
#actionId#, #requestURL#, 
#accessTimestamp#, #extend1#, 
#extend2#, #extend3# 
) 
</insert>

3. 매개 변수를 하나의java로 입력합니다.util.HashMap

<select id="com.fashionfree.stat.accesslog.selectActionIdAndActionNumber" 
parameterClass="hashMap" 
resultMap="getActionIdAndActionNumber"> 
select 
actionId, count(*) as count 
from 
MemberAccessLog 
where 
memberId = #memberId# 
and accessTimestamp &gt; #start# 
and accessTimestamp &lt;= #end# 
group by actionId 
</select>
<select id="com.fashionfree.stat.accesslog.selectActionIdAndActionNumber" 
parameterClass="hashMap" 
resultMap="getActionIdAndActionNumber"> 
select 
actionId, count(*) as count 
from 
MemberAccessLog 
where 
memberId = #memberId# 
and accessTimestamp &gt; #start# 
and accessTimestamp &lt;= #end# 
group by actionId 
</select>
4. 입력 매개 변수에 그룹 포함

<insert id="updateStatusBatch" parameterClass="hashMap"> 
update 
Question 
set 
status = #status# 
<dynamic prepend="where questionId in"> 
<isNotNull property="actionIds"> 
<iterate property="actionIds" open="(" close=")" conjunction=","> 
#actionIds[]# 
</iterate> 
</isNotNull> 
</dynamic> 
</insert> 
<insert id="updateStatusBatch" parameterClass="hashMap"> 
update 
Question 
set 
status = #status# 
<dynamic prepend="where questionId in"> 
<isNotNull property="actionIds"> 
<iterate property="actionIds" open="(" close=")" conjunction=","> 
#actionIds[]# 
</iterate> 
</isNotNull> 
</dynamic> 
</insert>
설명: actionIds는 전송된 그룹의 이름입니다.dynamic 라벨을 사용하여 수조가 비어 있을 때 sql 문장 문법 오류를 피합니다.isNotNull 탭을 사용하여 수조가 null일 때 ibatis 해석 오류 방지
5. 전달 매개 변수는 하나의 그룹만 포함한다

<select id="com.fashionfree.stat.accesslog.model.StatMemberAction.selectActionIdsOfModule" 
resultClass="hashMap"> 
select 
moduleId, actionId 
from 
StatMemberAction 
<dynamic prepend="where moduleId in"> 
<iterate open="(" close=")" conjunction=","> 
#[]# 
</iterate> 
</dynamic> 
order by 
moduleId 
</select>
<select id="com.fashionfree.stat.accesslog.model.StatMemberAction.selectActionIdsOfModule" 
resultClass="hashMap"> 
select 
moduleId, actionId 
from 
StatMemberAction 
<dynamic prepend="where moduleId in"> 
<iterate open="(" close=")" conjunction=","> 
#[]# 
</iterate> 
</dynamic> 
order by 
moduleId 
</select>
설명: select의 탭에parameterClass가 없습니다.
또한: 여기서hashMap에 수조를 넣을 수도 있지만, 추가 지출을 늘리면 사용을 권장하지 않습니다.
6. ibatis가 매개 변수를 문자열로 직접 해석하도록 하기

<select id="com.fashionfree.stat.accesslog.selectSumDistinctCountOfAccessMemberNum" 
parameterClass="hashMap" resultClass="int"> 
select 
count(distinct memberId) 
from 
MemberAccessLog 
where 
accessTimestamp &gt;= #start# 
and accessTimestamp &lt; #end# 
and actionId in $actionIdString$ 
</select> 
<select id="com.fashionfree.stat.accesslog.selectSumDistinctCountOfAccessMemberNum" 
parameterClass="hashMap" resultClass="int"> 
select 
count(distinct memberId) 
from 
MemberAccessLog 
where 
accessTimestamp &gt;= #start# 
and accessTimestamp &lt; #end# 
and actionId in $actionIdString$ 
</select>
설명: 이런 방법을 사용하면 sql 주입의 위험이 존재하므로 사용을 추천하지 않습니다.
7. 페이지별 조회(pagedQuery)

<select id="com.fashionfree.stat.accesslog.selectMemberAccessLogBy" 
parameterClass="hashMap" resultMap="MemberAccessLogMap"> 
<include refid="selectAllSql"/> 
<include refid="whereSql"/> 
<include refid="pageSql"/> 
</select> 
<select id="com.fashionfree.stat.accesslog.selectMemberAccessLogBy.Count" 
parameterClass="hashMap" resultClass="int"> 
<include refid="countSql"/> 
<include refid="whereSql"/> 
</select> 
<sql id="selectAllSql"> 
select 
accessLogId, memberId, clientIP, 
httpMethod, actionId, requestURL, 
accessTimestamp, extend1, extend2, 
extend3 
from 
MemberAccessLog 
</sql> 
<sql id="whereSql"> 
accessTimestamp &lt;= #accessTimestamp# 
</sql> 
<sql id="countSql"> 
select 
count(*) 
from 
MemberAccessLog 
</sql> 
<sql id="pageSql"> 
<dynamic> 
<isNotNull property="startIndex"> 
<isNotNull property="pageSize"> 
limit #startIndex# , #pageSize# 
</isNotNull> 
</isNotNull> 
</dynamic> 
</sql>
<select id="com.fashionfree.stat.accesslog.selectMemberAccessLogBy" 
parameterClass="hashMap" resultMap="MemberAccessLogMap"> 
<include refid="selectAllSql"/> 
<include refid="whereSql"/> 
<include refid="pageSql"/> 
</select> 
<select id="com.fashionfree.stat.accesslog.selectMemberAccessLogBy.Count" 
parameterClass="hashMap" resultClass="int"> 
<include refid="countSql"/> 
<include refid="whereSql"/> 
</select> 
<sql id="selectAllSql"> 
select 
accessLogId, memberId, clientIP, 
httpMethod, actionId, requestURL, 
accessTimestamp, extend1, extend2, 
extend3 
from 
MemberAccessLog 
</sql> 
<sql id="whereSql"> 
accessTimestamp &lt;= #accessTimestamp# 
</sql> 
<sql id="countSql"> 
select 
count(*) 
from 
MemberAccessLog 
</sql> 
<sql id="pageSql"> 
<dynamic> 
<isNotNull property="startIndex"> 
<isNotNull property="pageSize"> 
limit #startIndex# , #pageSize# 
</isNotNull> 
</isNotNull> 
</dynamic> 
</sql>
설명: 이 예제에서 코드는 다음과 같습니다.

HashMap hashMap = new HashMap(); 
hashMap.put(“accessTimestamp”, someValue); 
pagedQuery(“com.fashionfree.stat.accesslog.selectMemberAccessLogBy”, hashMap);
pagedQuery 방법은 먼저 com이라는 이름을 찾습니다.fashionfree.stat.accesslog.selectMemberAccessLogBy.Count의mappedstatement에서 sql 조회를 진행하여com을 얻습니다.fashionfree.stat.accesslog.selectMemberAccessLogBy 조회의 기록 개수를 기록하고 필요한 paged sql 조회(com.fashionfree.stat.accesslog.selectMemberAccessLogBy)를 진행하며, 구체적인 과정은 utils 클래스의 관련 코드 참조)
8.sql 문장에는 큰 부호>, 작은 부호<1이 포함되어 있다.번호보다 크고 작게: > < 예:

<delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long"> 
delete from 
MemberAccessLog 
where 
accessTimestamp &lt;= #value# 
</delete> 
Xml  
<delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long"> 
delete from 
MemberAccessLog 
where 
accessTimestamp &lt;= #value# 
</delete>
특수 문자를 xml CDATA 영역에 배치하려면 다음과 같이 하십시오.

<delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long"> 
<![CDATA[ 
delete from 
MemberAccessLog 
where 
accessTimestamp <= #value# 
]]> 
</delete> 
<delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long"> 
<![CDATA[ 
delete from 
MemberAccessLog 
where 
accessTimestamp <= #value# 
]]> 
</delete>
첫 번째 방식을 추천합니다.>(XML은 CDATA의 컨텐트를 해석하지 않으므로 CDATA에 dynamic 태그가 있으면 작동하지 않습니다.)
9. include와 sql 라벨은 자주 사용하는 sql 문장을 함께 정리하여 공용하기 편리하다.

<sql id="selectBasicSql"> 
select 
samplingTimestamp,onlineNum,year, 
month,week,day,hour 
from 
OnlineMemberNum 
</sql> 
<sql id="whereSqlBefore"> 
where samplingTimestamp &lt;= #samplingTimestamp# 
</sql> 
<select id="com.fashionfree.accesslog.selectOnlineMemberNumsBeforeSamplingTimestamp" parameterClass="hashmap" resultClass="OnlineMemberNum"> 
<include refid="selectBasicSql" /> 
<include refid="whereSqlBefore" /> 
</select> 
<sql id="selectBasicSql"> 
select 
samplingTimestamp,onlineNum,year, 
month,week,day,hour 
from 
OnlineMemberNum 
</sql> 
<sql id="whereSqlBefore"> 
where samplingTimestamp &lt;= #samplingTimestamp# 
</sql> 
<select id="com.fashionfree.accesslog.selectOnlineMemberNumsBeforeSamplingTimestamp" parameterClass="hashmap" resultClass="OnlineMemberNum"> 
<include refid="selectBasicSql" /> 
<include refid="whereSqlBefore" /> 
</select>
주의: ql 라벨은 인용용으로만 사용할 수 있으며,mappedstatement로 사용할 수 없습니다.예를 들어 이전 예에서 selectBasicSql로 알려진 sql 요소를 사용하여 sql 문장으로 실행하려는 것은 잘못된 것입니다.

sqlMapClient.queryForList(“selectBasicSql”); ×
10. 랜덤 선택 레코드

<sql id=”randomSql”> 
ORDER BY rand() LIMIT #number# 
</sql>
데이터베이스에서 임의로 number 막대 레코드 선택(MySQL에만 적용)
11. SQL GROUP BY 그룹의 필드를 결합합니다.

<sql id=”selectGroupBy> 
SELECT 
a.answererCategoryId, a.answererId, a.answererName, 
a.questionCategoryId, a.score, a.answeredNum, 
a.correctNum, a.answerSeconds, a.createdTimestamp, 
a.lastQuestionApprovedTimestamp, a.lastModified, GROUP_CONCAT(q.categoryName) as categoryName 
FROM 
AnswererCategory a, QuestionCategory q 
WHERE a.questionCategoryId = q.questionCategoryId 
GROUP BY a.answererId 
ORDER BY a.answererCategoryId 
</sql>
<sql id=”selectGroupBy> 
SELECT 
a.answererCategoryId, a.answererId, a.answererName, 
a.questionCategoryId, a.score, a.answeredNum, 
a.correctNum, a.answerSeconds, a.createdTimestamp, 
a.lastQuestionApprovedTimestamp, a.lastModified, GROUP_CONCAT(q.categoryName) as categoryName 
FROM 
AnswererCategory a, QuestionCategory q 
WHERE a.questionCategoryId = q.questionCategoryId 
GROUP BY a.answererId 
ORDER BY a.answererCategoryId 
</sql>
참고: SQL에서 MySQL을 사용한 GROUP_CONCAT 함수
12. IN의 순서대로 정렬
①MySQL:

<sql id=”groupByInArea”> 
select 
moduleId, moduleName, 
status, lastModifierId, lastModifiedName, 
lastModified 
from 
StatModule 
where 
moduleId in (3, 5, 1) 
order by 
instr(',3,5,1,' , ','+ltrim(moduleId)+',') 
</sql> 
<sql id=”groupByInArea”> 
select 
moduleId, moduleName, 
status, lastModifierId, lastModifiedName, 
lastModified 
from 
StatModule 
where 
moduleId in (3, 5, 1) 
order by 
instr(',3,5,1,' , ','+ltrim(moduleId)+',') 
</sql>
②SQLSERVER:

<sql id=”groupByInArea”> 
select 
moduleId, moduleName, 
status, lastModifierId, lastModifiedName, 
lastModified 
from 
StatModule 
where 
moduleId in (3, 5, 1) 
order by 
charindex(','+ltrim(moduleId)+',' , ',3,5,1,') 
</sql> 
<sql id=”groupByInArea”> 
select 
moduleId, moduleName, 
status, lastModifierId, lastModifiedName, 
lastModified 
from 
StatModule 
where 
moduleId in (3, 5, 1) 
order by 
charindex(','+ltrim(moduleId)+',' , ',3,5,1,') 
</sql>
설명: 검색 결과는moduleId가 in 목록에 있는 순서(3,5,1)에 따라 되돌아옵니다.

MySQL : instr(str, substr)
SQLSERVER:charindex(substr,str) 반환 문자열str 중성자 문자열의 첫 번째 출현 위치ltrim(str) 반환 문자열str, 안내(왼쪽) 공백 문자가 삭제됨
13. resultMap resultMap은 SQL 쿼리 결과 집합의 열 값을 Java Bean의 속성 값으로 매핑합니다.

<resultMap class="java.util.HashMap" id="getActionIdAndActionNumber"> 
<result column="actionId" property="actionId" jdbcType="BIGINT" javaType="long"/> 
<result column="count" property="count" jdbcType="INT" javaType="int"/> 
</resultMap> 
Xml  
<resultMap class="java.util.HashMap" id="getActionIdAndActionNumber"> 
<result column="actionId" property="actionId" jdbcType="BIGINT" javaType="long"/> 
<result column="count" property="count" jdbcType="INT" javaType="int"/> 
</resultMap>
resultMap을 사용하여 현식 결과 맵이라고 하는데 이에 대응하는 것은resultClass(내연 결과 맵)입니다. resultClass를 사용하는 가장 큰 장점은 간단하고 편리합니다. 지정한 결과를 표시하지 않고 iBATIS가 반사에 따라 스스로 결정합니다.resultMap은 jdbcType과javaType을 지정하여 더욱 엄격한 설정 인증을 제공할 수 있습니다.
14.typeAlias

<typeAlias alias="MemberOnlineDuration" type="com.fashionfree.stat.accesslog.model.MemberOnlineDuration" /> 
<typeAlias>
너무 긴 이름을 반복해서 입력하지 않도록 별명을 정의할 수 있습니다
15.remap

<select id="testForRemap" parameterClass="hashMap" resultClass="hashMap" remapResults="true"> 
select 
userId 
<isEqual property="tag" compareValue="1"> 
, userName 
</isEqual> 
<isEqual property="tag" compareValue="2"> 
, userPassword 
</isEqual> 
from 
UserInfo 
</select> 
<select id="testForRemap" parameterClass="hashMap" resultClass="hashMap" remapResults="true"> 
select 
userId 
<isEqual property="tag" compareValue="1"> 
, userName 
</isEqual> 
<isEqual property="tag" compareValue="2"> 
, userPassword 
</isEqual> 
from 
UserInfo 
</select>
이 예에서 매개 변수 tag 값에 따라 다른 결과 집합을 얻을 수 있습니다. remapResults = "true"속성이 없으면, iBatis는 첫 번째 조회 때의 결과 집합을 캐시하고, 다음에 다시 실행할 때 (이 프로세스에서) 결과 집합을 다시 비추지 않고 캐시 결과 집합을 사용합니다.
따라서 위의 예에서 remapResult가 기본false 속성이고 다음과 같은 프로그램이 있습니다.

HashMap<String, Integer> hashMap = new HashMap<String, Integer>(); 
hashMap.put("tag", 1); 
sqlClient.queryForList("testForRemap", hashMap); 
hashMap.put("tag", 2); 
sqlClient.queryForList("testForRemap", hashMap);
Java 코드

HashMap<String, Integer> hashMap = new HashMap<String, Integer>(); 
hashMap.put("tag", 1); 
sqlClient.queryForList("testForRemap", hashMap); 
hashMap.put("tag", 2); 
sqlClient.queryForList("testForRemap", hashMap);
프로그램이 마지막 문장의query 쿼리 타임즈 오류를 실행할 수 있습니다. 왜냐하면 iBATIS가 첫 번째 쿼리의 결과 집합을 사용했기 때문입니다. 앞뒤 두 번의 결과 집합이 다르기 때문입니다. (userId,userName)와(userId,userPassword) 때문에 오류가 발생했습니다.remapResults = "true"라는 속성을 사용하면 iBATIS는 조회를 실행할 때마다 결과 집합을 매핑하여 오류가 발생하지 않도록 합니다. (이때 비교적 큰 비용이 발생합니다.)
16.dynamic 라벨의prependdynamic 라벨의prepend 속성은 접두사로 결과 내용 앞에 추가되며, 라벨의 결과 내용이 비어있을 때prepend 속성은 작용하지 않습니다.
dynamic 라벨에prepend 속성이 존재하면 플러그인 라벨의 첫 번째prepend 속성을 무시합니다.예:

<sql id="whereSql"> 
<dynamic prepend="where "> 
<isNotNull property="userId" prepend="BOGUS"> 
userId = #userId# 
</isNotNull> 
<isNotEmpty property="userName" prepend="and "> 
userName = #userName# 
</isNotEmpty> 
</dynamic> 
</sql> 
<sql id="whereSql"> 
<dynamic prepend="where "> 
<isNotNull property="userId" prepend="BOGUS"> 
userId = #userId# 
</isNotNull> 
<isNotEmpty property="userName" prepend="and "> 
userName = #userName# 
</isNotEmpty> 
</dynamic> 
</sql>
이 예에서dynamic 라벨에는 두 개의 하위 라벨 가 포함되어 있습니다.앞에서 서술한 원칙에 따르면 만약에 라벨에prepend='BOGUS'라는 가짜 속성이dynamic를 없애면 라벨에 있는 and가 무시되고 sql 문법 오류가 발생할 수 있습니다.
주의:dynamic 탭에prepend 속성이 없으면 하위 탭의 첫 번째prepend 속성을 자동으로 무시하지 않습니다.
상기 서술한 것은 여러분께 소개해 드린 iBatis 습관용 16개의 SQL 문장입니다. 여러분께 도움이 되었으면 합니다. 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기