개발/Database 15

[Mysql] 여러 컬럼 IN문 사용하기

보통 IN문 사용할 때, 한 컬럼에 대한 것으로 주로 검색한다. SELECT * FROM table WHERE id IN (1, 2, 3, 4) 두 컬럼이 unique한데 여러 값을 가져와야할 때는??? 예를들어 id1, id2 컬럼으로 여러 값을 가져와야한다면 아래와 같이 사용한다. SELECT * FROM table WHERE (id1, id2) IN ( SELECT id1, id2 FROM table WHERE (id1=1 AND id2=2) OR (id1=3 AND id2=4) OR (id1=5 AND id2=6) ); IN문 안에 서브쿼리로~ (id1, id2) IN ((1, 2), (3, 4))... 이런식이었으면 좋으련만 ㅋㅋ

개발/Database 2017.05.26

timestamp의 가장 큰 값

Mysql의 timestamp 컬럼을 쓰고 있는데, 큰 수의 년도를 저장하려고 시도했더니 Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: 이런 에러가 발생했다. https://dev.mysql.com/doc/refman/5.5/en/datetime.html Mysql 레퍼런스에 따르면 timestamp는 '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC. 이 시간의 범위를 저장할 수 있다고 한다. 애매한 시간인 2038년 1월 19일까지인 이유는 초를 4byte로 저장하기 때문이고, 그 max 값이 저 날짜이기 때문이다. 현재 timestamp의 가장 ..

개발/Database 2016.09.12

(MyBatis) Mysql tinyint(1) boolean이 integer로 바뀌는 현상

Mysql의 컬럼 타입 중 tinyint(1)은 0이면 false, 0보다 크면 true를 반환하므로, boolean으로 주로 사용하고 있다. query.xml SELECT test_yn FROM test LIMIT 1 DAO.java public Map selectYn() { return sqlSessionTemplate.selectList("selectYn"); } 이해하기 쉽게 boolean 컬럼 한 행을 가져오는 쿼리로 예를 들어봤다. test_yn이 tinyint(1) 이라면 나는 결과 값을 hashmap으로 받았으니 {"test_yn" : false} 이런식으로 받아질 것이고, Boolean으로 캐스팅해서 test_yn 값을 쓸 수 있다. 그런데 쿼리를 아래와 같이 바꿔보았다. SELECT t..

개발/Database 2015.09.17

[myBatis] select시 NoSuchMethodException , <init>() error

mybatis에서 select문을 실행시킬 때 객체에 저장하는 과정에서 아래와 같은 에러가 발생했다. error:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class 클래스명 with invalid types () or values (). Cause: java.lang.NoSuchMethodException: 클래스명() select 결과를 저장하는 클래스는 아래와 같은 형식이었다. public class Test { private int a; private int b; public Test(int a, int ..

개발/Database 2015.04.24

[iBatis/myBatis] #와 $의 차이점

1. #는 쿼리가 수행될 때, 다음과 같이 된다 SELECT * FROM USER WHERE col = ? parameter : [값] ?에 bind된 값이 들어가게 된다. 이 쿼리의 컴파일 된 내용을 재사용 할 수 있고, 파라미터에 따라 대입해주므로 효율적이다.내부적으로 preparedStatement 객체에서 ? 에 들어갈 파라미터의 값을 set 해줌으로써 사용이 된다. * preparedStatement는 한번 수행한 쿼리를 캐싱하는 객체 사용 용도 >> #일 경우, 값에 사용한다. myBatis : 컬럼명 = #{값} iBatis : 컬럼명 = #값# * 쿼리에 작은 따옴표가 붙게 된다. 2. $는 쿼리가 수행될 때, 다음과 같이 된다 SELECT * FROM USERWHERE col = 값 값이..

개발/Database 2013.04.11

MySql] JOIN 속도를 빠르게! EXPLAIN, STRAIGHT_JOIN

내가 만든 웹페이지중에 엄청나게 속도가 느린 곳이 있었다.분명 DB에서 SELECT하는데 문제가 있을 것이었다. 문제의 그 쿼리는 3개의 테이블을 JOIN해서 SELECT 하는데, 매우 느렸다. 아래와 같은 방법을 써서 JOIN 하는 쿼리의 속도를 개선시켰다. 1. 쿼리의 성능을 측정(EXPLAIN) 그 쿼리가 어떻게 돌아가는지 보기 위해 EXPLAIN 을 써보았다. EXPLAINSELECT * FROM 테이블명 WHERE 조건 다음과 같은 쿼리를 실행하면, 아래와 같은 항목이 나타난다. id select type table type possible_keys key key_len ref extra 각 항목에 대한 자세한 정보는http://www.mysqlkorea.co.kr/sub.html?mcode=m..

개발/Database 2012.11.18

java + temporary table. 임시테이블 사용하기. MYSQL

임시테이블을 쓰는 경우는 여러가지가 있겠지만,다음 예제는 select시 in문 대신 temporary table을 사용하는 법이다. 만약 id가 1,2,3,4,5 인 것을 가져와야 한다고 하자.쿼리는 이렇게 된다. SELECT * FROM TABLE WHERE ID IN (1,2,3,4,5) 만약 검색할 ID의 개수가 1,000개 이상이라면??... 방안중에 하나로 임시테이블을 쓸 수 있다. IN문에 들어갈 번호들을 임시테이블에 쫙 넣고, 임시테이블과 테이블과 INNER JOIN을 하는것이다. 예제 ㄱㄱ 1. 임시테이블 생성 CREATE TEMPORARY TABLE IF NOT EXISTS TEMP_TABLE ( ID BIGINT(20) NOT NULL ) 2. 임시테이블에 INSERT (일반 INSER..

개발/Database 2012.10.26

MyBatis] There is no getter for property named.. error

어제 단 한문장 때문에 에러가 나서 3시간동안 해맨거..... 내가 쓴 문법은 아래와 같았다. SELECT * FROM TABLE WHERE NAME = #{name} 이렇게 했을 뿐인데 There is no getter for property named 'name' in 'class java.lang.String'이런 에러가 계속 나타났다. if문을 지우면 #{name}에는 이상없이 잘 실행된다는거. 이유는if문에서 name을 가져오는 방식이 parameterType 안에 들어있는 클래스에서getter 메소드로 name을 받아오기 때문이다. 즉, 에러 그대로 String 객체에 name을 뱉어주는 getter 메소드가 없기 때문이다.Integer를 넘기거나 Long을 넘긴 사람이라면 다들 안됐을 것이다..

개발/Database 2012.09.07

MyBatis/iBatis] 방금 INSERT 된 Key 가져오기

여러 테이블에 insert를 해야되는데, 방금 insert 된 그 PK를 다른테이블에서 써야할 때... select를 해올수도 없고 그럴땐??? 1. MyBatis /* query */ id가 autoincrement인 PK일 경우, 여기서 insert 된 행의 id 값을 가져오게 된다. 그 id값은 DataClass에 선언되어있는 id 필드 안으로 값이 저절로 들어간다. java단에서 DataClass 객체의 id값을 보면 값이 들어있을 것이다. 2. iBatis /* query */ SELECT LAST_INSERT_ID() id 값을 리턴 받는 곳은 DAO 클래스에서 insert문을 호출하는 구문에서 값을 리턴 받으면 된다. int id = commonDB.insert(NAMESPACE + "ins..

개발/Database 2012.09.05