아이바티스에서 like 검색할 일이 생겼는데
삽질을 경험하게 되었다.
DBMS마다 약간의 문법차이가 있었던 것이다 !! ㅠㅠ ..
오라클은 like '%'||#value#||'%' Mysql은 like concat('%','#value#','%') Sysbase, SQL SERVER like '%' + #value# + '%'
아이바티스에서 like 검색할 일이 생겼는데
삽질을 경험하게 되었다.
DBMS마다 약간의 문법차이가 있었던 것이다 !! ㅠㅠ ..
오라클은 like '%'||#value#||'%' Mysql은 like concat('%','#value#','%') Sysbase, SQL SERVER like '%' + #value# + '%'
HTTP 헤더에는 이전 페이지의 URL이 Referer 라는 이름으로 전송된다.
만약 인터넷 브라우저에서 직접 URL을 입력하고 페이지를 호출하였다면,
이전 페이지가 없는 상태이므로 전송되는 HTTP 헤더부분에 Referer 정보는 없다.
그러나 어떤 페이지에서는 링크를 통해 다른 페이지를 호출하는 경우,
HTTP 헤더에는 링크를 포함한 페이지의 URL 이 Referer 에 저장된다.
JSP 에서 이전 페이지의 URL 이 필요할 경우,
request 내장 객체의 getHeader()를 이용해서 이전 페이지의 URL 을 알 수 있다
<% out.println(request.getHeader("referer")); // 이전 페이지의 URL. 링크 돼서 들어온게 아니라면 당연히 null %>
Do it simply by adding a class to the body:
.stop-scrolling { height: 100%; overflow: hidden; }
Add the class then remove when you want to re-enable scrolling, tested in IE, FF, Safari and Chrome.
$('body').addClass('stop-scrolling')
For mobile devices, you’ll need to handle the touchmove event:
$('body').bind('touchmove', function(e){e.preventDefault()})
And unbind to re-enable scrolling. Tested in iOS6 and Android 2.3.3
$('body').unbind('touchmo
우선 mybatis와 ibatis에서는 동적태그를 기본적으로 지원을 합니다.
즉, 프로시저로 짜여져 있는 로직을 동적태그를 사용하여 쿼리로 변경할 수 있습니다.
장점이 있을수도 있지만 자칫 잘못 사용하면 큰 문제를 일으킬수 있다는 단점이있을수 있다는…
양날의 칼날과 같다는것만 알아두시면 되겠습니다.
ibatis 비교문 지원 태그
isNull : "널일경우"
isNotNull : "널이아닐경우"
isEmpty : "공백일경우"
isNotEmpty : "공백이아닐경우"
isGreaterTan : ">"
isGreaterEqual : ">="
isLessThan : "<"
isLessEqual : "<="
isEqual : "=="
isNotEqual : "!="
mybatis 비교문 지원 태그
if : 단일조건문
choose when otherwise : 다중조건문
위와같이 각 mybatis(ibatis) 별 동적태그를 지원합니다.
ibatis에 비해 mybatis의 비교문태그가 간단해졌습니다.
ibatis에서 지원되는 태그들 if문과 choose문만을 이용하여 비교가 가능해 진것이죠.
일반 자바코드와 ibatis/mybatis 별로 비교문 예를 들어보도록 하겠습니다.
Null 비교문
if(stringProperty == null) { // code here } <!--ibatis --> <isNull property="stringProperty"> 조건문 </isNull> <!--mybatis--> <if test="stringProperty == null"> 조건문 </if>
NOT NULL 비교문
if(stringProperty != null) { // code here } <!--ibatis --> <isNotNull property="stringProperty"> 조건문 </isNotNull> <!--mybatis(1)--> <if test="stringProperty != null"> 조건문 </if> <!--mybatis(2)--> <choose> <when test="stringProperty == null"> NULL일경우 조건문 </when> <otherwise> NULL이 아닐경우 조건문 </otherwise> </choose>
공백일경우 비교문
if(stringProperty.equals("")) { //code here } <!--ibatis--> <isEmpty property="stringProperty"> 조건문 </isEmpty> <!--mybatis--> <if test="stringProperty == ''"> 조건문 </if>
공백이 아닐경우 비교문
if(!stringProperty.equals("")) { //code here } <!--ibatis--> <isNotEmpty property="stringProperty"> 조건문 </isNotEmpty> <!--mybatis(1)--> <if test="stringProperty != ''"> 조건문 </if> <!--mybatis(2)--> <choose> <when test="stringProperty == ''"> 공백일경우 조건문 </when> <otherwise> 공백 아닐경우 조건문 </otherwise> </choose>
숫자비교문(1)
if(numberProperty > 5) { //code here } <!--ibatis--> <isGreaterThan property="numberProperty" compareValue="5"> 5보다 클경우 조건문 </isGreaterThan> <!--mybatis--> <if test='id > 5'> 5보다 클경우 조건문 </if>
숫자비교문(2)
if(numberProperty >= 5) { //code here } <!--ibatis--> <isGreaterEqual property="numberProperty" compareValue="5"> 5보다 크거나같을경우 조건문 </isGreaterEqual> <!--mybatis--> <if test='id >= 5'> 5보다 크거나같을경우 조건문 </if>
숫자비교문(3)
if(numberProperty < 5) { //code here } <!--ibatis--> <isLessThan property="numberProperty" compareValue="5"> 5보다 작을경우 조건문 </isLessThan> <!--mybatis--> <if test='id < 5'> 5보다 작을경우 조건문 </if>
숫자비교문(4)
if(numberProperty <= 5) { //code here } <!--ibatis--> <isLessEqual property="numberProperty" compareValue="5"> 5보다 작거나같을경우 조건문 </isLessEqual> <!--mybatis--> <if test='id <= 5'> 5보다 작거나같을경우 조건문 </if>
문자열 비교(1)
if(stringProperty.equals("title")) { //code here } <!--ibatis--> <isEqual property="stringProperty" compareValue="title"> stringProperty 속성값이 "title"일 경우 </isEqual> <!--mybatis--> <if test='stringProperty == "title"'> stringProperty 속성값이 "title"일 경우 </if>
문자열 비교(2)
if(!stringProperty.equals("title")) { //code here } <!--ibatis--> <isNotEqual property="stringProperty" compareValue="title"> stringProperty 속성값이 "title"이 아닐경우 </isNotEqual> <!--mybatis--> <if test='stringProperty != "title"'> stringProperty 속성값이 "title"이 아닐경우 </if>
복잡한 형태의 쿼리를 만들다 보면 로직에따라 if문을 추가해야 한다던지
if else 문을 추가해야할 경우가 있다.
myBatis는 이를위해 동적 쿼리를 위한 기능을 제공한다.
그중에서도 가장 많이 사용되는 if 문과 choose문을 살펴보자.
동적쿼리는 XML 매퍼에 지정하게 되는데, JSTL을 사용해봤던 사람들이라면 큰 어려움이 없는 문법이다.
1. IF문
Continue reading →
ALTER 문에 대해서 좀 끄적여 놓으려 한다.
우선 ALTER문은 이미 존재하는 테이블의 구조나 형식등을 바꾸기 위해 사용한다.
따라서, 칼럼의 구조나 형식을 변경하기 위해 ALTER명령을 사용하게 된다.
ALTER 명령어는 다음과 같다.
1. 테이블 형식 변경
– Engine 사용 : ALTER TABLE 테이블명 ENGINE=형식;
– type 사용 : ALTER TABLE 테이블명 TYPE=형식;
2. 테이블 이름 변경
– ALTER TABLE 테이블명 RENAME 바꿀이름
– RENAME TABLE 테이블명 TO 바꿀이름
3. 칼럼 추가
– 마지막에 추가 : ALTER TABLE 테이블명 ADD COLUMN 칼럼이름 칼럼타입
– 지정 칼럼 뒤에 : ALTER TABLE 테이블명 ADD COLUMN 칼럼이름 칼럼타입 AFTER 칼럼이름
– 제일 앞에 : ALTER TABLE 테이블명 ADD COLUMN 칼럼이름 칼럼타입 FIRST
4. 칼럼 삭제
– ALTER TABLE 테이블명 DROP COLUMN 칼럼이름
5. 칼럼 변경
– ALTER TABLE 테이블명 MODIFY 컬럼이름 새컬럼타입
– ALTER TABLE 테이블명 CHANGE 컬럼이름 새컬럼이름 새컬럼타입
6. 인덱스에 새항목 추가
– ALTER TABLE 테이블명 ADD INDEX(컬럼이름)
7. 인덱스 삭제
– ALTER TABLE 테이블명 DROP INDEX 컬럼이름
– DROP INDEX 인덱스이름 ON 테이블명
7. 기본키(Primary Key) 지정하기
– ALTER TABLE 테이블명 ADD PRIMARY KEY(칼럼이름) 컬럼이름
mysql> DESCRIBE test;
+——-+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————-+——+—–+———+——-+
| t1 | varchar(40) | | | | |
| t2 | varchar(40) | YES | | NULL | |
| t3 | varchar(40) | YES | | NULL | |
| t4 | varchar(40) | YES | | NULL | |
+——-+————-+——+—–+———+——-+
4 rows in set (0.00 sec)
mysql> ALTER TABLE test ADD PRIMARY KEY(t1);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE test;
+——-+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————-+——+—–+———+——-+
| t1 | varchar(40) | | PRI | | |
| t2 | varchar(40) | YES | | NULL | |
| t3 | varchar(40) | YES | | NULL | |
| t4 | varchar(40) | YES | | NULL | |
+——-+————-+——+—–+———+——-+
4 rows in set (0.00 sec)
7. 기본키 삭제
– ALTER TABLE 테이블명 DROP PRIMARY KEY
최근 회사에서 MySQL 버전을 5.5 로 업그레이드하면서 문제되는 쿼리가 있다고 해서 알아본 내용을 적어본다.
MySQL 5.5 로 업그레이드후 기존 쿼리중 서브쿼리에 SQL_NO_CACHE 옵션을 사용한 쿼리에서 문제가 발생했는데 원인은 MySQL 5.5 에서 서브쿼리에 대해 SQL_NO_CACHE 옵션을 사용할수 없게 했기 때문이었다. 이와 비슷하게 UNION 지시어에 대해서도 첫번째 SELECT 에만 지시어 사용이 가능하다.
MySQL 설정의 query_cache_type 의 값에 따라서 쿼리 결과에 대한 캐시 동작이 달라지는데 설정 값은 다음과 같다.(query_cache_type 설정값)
0 -> 쿼리 결과를 캐시하지 않는다.
1 -> SELECT SQL_NO_CACHE 로 시작하는 경우를 제외한 캐시가능한 쿼리 결과를 캐시한다.(기본값)
2 -> SELECT SQL_CACHE 로 시작하는 캐시가능한 쿼리에 대해서만 결과를 캐시한다.
SQL_CACHE, SQL_NO_CACHE 는 쿼리 결과를 다음에 쓸수 있도록 캐쉬할지 여부를 결정한다. SQL_CACHE 는 쿼리의 결과를 캐시에 저장한다. SQL_NO_CACHE 라고 하면 해당 쿼리의 실행결과를 캐쉬에 저장하지 않을뿐 아니라 쿼리의 캐시가 기존에 있었는지도 확인하지 않는다.
(select 쿼리 캐쉬 옵션 문서)
SQL_NO_CACHE 의 제약사항은 서브쿼리에 사용할수 없는것과 UNION 조합의 경우 첫번째에만 사용할수 있다는것이다. (select 문서)
예를 들어 아래와 같은 상황에서 마지막 쿼리는 에러를 발생한다.
create table a( b int );
select * from (select b from a) tmp ; => ok
select * from (select sql_no_cache b from a) tmp; => Last_SQL_Error: Error 'Incorrect usage/placement of 'SQL_NO_CACHE'' on query.
에러가 발생된 이유는 서브쿼리에 SQL_NO_CACHE 를 사용했기 때문인데 이는 MySQL 5.5 이전에는 없던 제약사항이다.
우선 서브쿼리에 SQL_NO_CACHE 를 사용할수 없는것은 애초에 서브쿼리의 결과는 캐시 되지 않기 때문이다.(서브쿼리캐쉬에 대한 답변)
그리고 UNION 조합에서 첫번째에만 사용할수 있는것은 UNION 쿼리에서 캐시는 각각의 SELECT 별로 캐시되는것이 아니라 전체 쿼리를 하나로 판단해서 캐시되기 때문이다.(UNION 옵션 캐시에 대한 답변)
MySQL 5.7 이전버전에서는 SQL_NO_CACHE 옵션을 사용할때 앞에 공백문자가 있어야 된다. 이는 쿼리 파서의 문제라고 하며 공백이 아닌 줄바꿈 같은거 있으면 안된다.
개인적으로 개발할때는 PostgreSQL 만 사용하고 있기 때문에 요즘 MySQL 에는 별로 흥미가 없다. PostgreSQL 에 대한 글들이 유독 많이 보이고 재미있는 것들도 많은것을 보면서 MySQL 을 대체할것이 나온다면 MariaDB 가 아니라 PostgreSQL 이 아닐까 생각해본다. 벤치마크나 장단점에 의한 판단이 아니라 내가 자주 보는 Rails 나 개발 블로그들의 포스팅 비중이 그렇기 때문인데 이쪽 방향으로 따라가는것같다.
” ” : 공백(스페이스 한 칸)을 의미
<
부등호(<)
>
부등호(>)
&
앰퍼샌드(&) 기호
"
쌍따옴표(“) 하나를 표[\”] 이것도 쌍따옴표가 되겠다.
&35; #추가
shap(#)하나를 표현
&39#추가
따옴표(‘) 하나를 표현, [\’] 이것도 따옴표가 되겠다.
이 간접 표현식이 난 맨날 아직도 해깔린다.. 특히 <> –; 언제 한번 정리 하려 했는데 이제야 정리 하는 군…
더 아는데로 계속추가…
이 표현은 여기 저기 많이 쓰인다… html뿐 아니라 ibatis에서도.
인덱스 만들기
Apache Tomcat™ is an open source software implementation of the Java Servlet and JavaServer Pages technologies. Different versions of Apache Tomcat are available for different versions of the Servlet and JSP specifications. The mapping between the specifications and the respective Apache Tomcat versions is:
Servlet Spec | JSP Spec | EL Spec | WebSocket Spec | Apache Tomcat version | Actual release revision | Support Java Versions |
---|---|---|---|---|---|---|
4.0 | TBD (2.4?) | TBD (3.1?) | TBD (1.2?) | 9.0.x | None | 8 and later |
3.1 | 2.3 | 3.0 | 1.1 | 8.0.x | 8.0.20 | 7 and later |
3.0 | 2.2 | 2.2 | 1.1 | 7.0.x | 7.0.59 | 6 and later (WebSocket 1.1 requires 7 or later) |
2.5 | 2.1 | 2.1 | N/A | 6.0.x | 6.0.43 | 5 and later |
2.4 | 2.0 | N/A | N/A | 5.5.x (archived) | 5.5.36 (archived) | 1.4 and later |
2.3 | 1.2 | N/A | N/A | 4.1.x (archived) | 4.1.40 (archived) | 1.3 and later |
2.2 | 1.1 | N/A | N/A | 3.3.x (archived) | 3.3.2 (archived) | 1.1 and later |