이번포스팅은 테이블에 데이터 INSERT 후 시퀀스값 SELECT 해오는 것에 대하여 포스팅 하도록 하겠음
우선은 테스트 테이블을 생성 해보도록 하자
테이블명은 DBMS와 무관하게 동일하게 잡도록 해보겠음
테이블명 : seq_test
컬럼명 |
타입 |
idx |
bigint or number |
title |
varchar(20) |
MySQL 테이블 생성
CREATE TABLE seq_test(
idx bigint primary key auto_increment, title varchar(20) )
MS-SQL 테이블 생성
CREATE TABLE seq_test( idx bigint IDENTITY(1,1) primary key , title varchar(20) )
ORACLE 테이블 생성 (별도의 시퀀스 생성 필요)
CREATE TABLE seq_test( idx number primary key , title varchar(20) ); create sequence idx_test_seq start with 1 increment BY 1 maxvalue 10000;
테이블을 생성 하였다면 임의의 controller,dao,vo를 생성해보도록 하자
VO
public class Test { private int idx; private String title; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getIdx() { return idx; } public void setIdx(int idx) { this.idx = idx; } }
CONTROLLER
@Autowired private Dao dao; @RequestMapping(value="/insertSelectSeq") public void insertSelectSeq(Test test) { try { test.setTitle("insert test"); System.out.println("등록전 idx 값 :"+test.getIdx()); dao.insertSelectSeq(test); System.out.println("등록후 idx 값 :"+test.getIdx()); } catch (Exception e) { e.printStackTrace(); } }
DAO
@Autowired private SqlSession sql; public int insertSelectSeq(Test test) throws SQLException { return sql.insert("sql.insertSelectSeq",test); }
위의 소스에서 보다시피 dao에서는 int 형으로 return을 주지만
컨트롤러에서는 별도로 받는 vo객체가 존재하지 않는다.
그냥 dao에 parameter로 넘겨준 test객체에 담기는 것이다.
DBMS별로 INSERT 후 시퀀스값을 SELECT 해오는방법중 본인은 2가지 방식을 설명
하도록 하겠음
1. MySQL, MS-SQL 처럼 시퀀스가 자동 증가인 DBMS일 경우
사용가능
<insert id="insertSelectSeq" parameterType="com..model.Test" useGeneratedKeys="true" keyProperty="idx"> INSERT INTO seq_test (title) VALUES(#{title}) </insert>
위 코드처럼 정해주면 된다
※ keyProperty는 vo에 정의해준 변수명이다.
(시퀀스 컬럼값과 일치 시켜줘야함)
그럼 위의 코드로 테스트를 해보도록 하자
본인은 MySQL로 진행을 해보도록 하겠음
실행결과
위의 결과처럼 INSERT 호출전 VO객체의 들어있던 idx 의 값은 0이었으나 INSERT 처리를 한 후에는
자동증가값이 들어가있는 것을 확인 하였다.
2. 오라클처럼 시퀀스를 별도록 등록해주어야 하는 경우
※ 해당 방법은 꼭 오라클이 아니고 MySQL,MS-SQL
모두 사용이 가능 한 방법이다
<!--oracle--> <insert id="insertSelectSeq" parameterType="com.model.Test"> INSERT INTO seq_test(idx,title) VALUES(idx_test_seq.nextval,#{title}) <selectKey keyProperty="idx" resultType="Integer" order="AFTER"> SELECT idx_test_seq.currval FROM dual </selectKey> </insert> <!--mysql--> <insert id="insertSelectSeq" parameterType="com.model.Test"> INSERT INTO seq_test(title) VALUES(#{title}) <selectKey keyProperty="idx" resultType="Integer" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> </insert> <!--mssql--> <insert id="insertSelectSeq" parameterType="com.model.Test"> INSERT INTO seq_test(title) VALUES(#{title}) <selectKey keyProperty="idx" resultType="Integer" order="AFTER"> SELECT IDENT_CURRENT('seq_test') </selectKey> </insert>
DBMS 종류별로 각각의 Mybatis의 쿼리XML은 위와 같다.
※ MS-SQL 버전에서의 IDENT_CURRENT('seq_test') 의
seq_test는 insert했던 테이블 명을 적어주면 된다
그럼 위의 코드로 테스트를 해보도록 하자
본인은 오라클로 진행을 해보도록 하겠음
실행결과
위와같이 결과가 나왔다.
DBMS 무관하게 결과는 모두 동일하게 나올것이다.
1. 지속적인 구독을 원하신다면 네이버 이웃추가 부탁드립니다
2. 도움이 되셨다면 공감한번 꾹! 눌러주세요
3. 궁금하신점이 있으시다면 댓글 GOGO
ibatis vs mybatis LIKE절 검색하기 (0) | 2014.08.04 |
---|---|
ibatis vs mybatis 조건문 + mybatis 공백조건 비교시 안될경우 및 두개이상 조건주기 (0) | 2014.08.01 |
ibatis(iterate) vs mybatis(foreach) 비교 샘플 (0) | 2014.07.31 |
지난주 주말내내는 몸이 좋지 않아서 포스팅은 전혀 하지 못하였음..
이번 포스팅에는 쿼리문의 LIKE 절을 DBMS별로 비교 하려함.
IBATIS / MYBATIS의 차이는 #XXX# / #{XXX} 의 차이뿐이고 솔직히 문법은 동일함
ORACLE LIKE 절
- ibatis
WHERE(AND) column LIKE '%'||#search_value#||'%'
- mybatis
WHERE(AND) coumn LIKE '%'||#{search_value}||'%'
MS-SQL LIKE 절
- ibatis
WHERE(AND) column LIKE '%'+#search_value#+'%'
- mybatis
WHERE(AND) column LIKE '%'+#{search_value}+'%'
MySQL LIKE절
- ibatis
WHERE(AND) column LIKE CONCAT('%',#search_value#,'%')
- mybatis
WHERE(AND) column LIKE CONCAT('%',#{search_value},'%')
위와같이 주로 쓰이는 DBMS 별로 예제를 들어보았음.
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
mybatis - INSERT 후 시퀀스값 SELECT하기(MySQL,MS-SQL,ORACLE) (0) | 2014.09.03 |
---|---|
ibatis vs mybatis 조건문 + mybatis 공백조건 비교시 안될경우 및 두개이상 조건주기 (0) | 2014.08.01 |
ibatis(iterate) vs mybatis(foreach) 비교 샘플 (0) | 2014.07.31 |
ibatis(mybatis) 쿼리 xml을 작성할때 조건문이 필요할 경우가 생긴다.
ibatis(mybatis)의 장점은 조건을 주면서 동적쿼리를 생성할수 있다는 장점이 있다.
즉, 프로시저를 사용하지 않아도 어느정도의 출력이 가능하다는 이야기임.
다음과 같은 테이블이 있다고 가정하자
- board
id |
int |
title |
varchar |
content |
text |
create_id |
varchar |
update_id |
varchar |
위의 기준으로 생성된 테이블에서 예를들기 위해 몇가지 조건에 따라 비교를 하도록 하겠음
1. update_id null/not null 체크 조건문
- ibatis(isNull / isNotNull)
<isNull property="update_id"> 조건절 </isNull> <isNotNull property="update_id"> 조건절 </isNotNull>
-mybatis(if / choose when otherwise)
<if test="update_id == null"> 조건절 </if> <if test="update_id != null"> 조건절 </if>또는
<choose> <when test="update_id == null"> null 조건절 </when> <otherwise> not null 조건절 </otherwise> </choose>
2. update_id 공백유무 체크 조건문
- ibatis(isEmpty / isNotEmpty)
<isEmpty property="update_id"> 조건절 </isEmpty> <isNotEmpty property="update_id"> 조건절 </isNotEmpty>
-mybatis(if / choose when otherwise)
<if test="update_id == ''"> 조건절 </if> <if test="update_id != ''"> 조건절 </if>또는
<choose> <when test="update_id == ''"> 공백일경우 조건절 </when> <otherwise> 공백 아닐경우 조건절 </otherwise> </choose>
mybatis의 공백조건 체크를 위와같이 조건을 주었는데도 체크가 되지 않을 경우에
하단 내용 처럼
쌍따옴표("") -> 홑따옴표('') and 홑따옴표('') -> 쌍따옴표("")로 변경을 해주자
문자열쪽에서 문제가 발생하는거 같음
3. id(숫자) 비교체크 조건문
- ibatis(isGreaterThan/isGreaterEqual/isLessThan/isLessEqual)
<isGreaterThan property="id" compareValue="3"> 3보다 크다 </isGreaterThan> <isGreaterEqual property="id" compareValue="3"> 3보다 크거나 같다 </isGreaterEqual> <isLessThan property="id" compareValue="3"> 3보다 작다 </isLessThan> <isLessEqual property="id" compareValue="3"> 3보다 작거나 같다 </isLessEqual>
- mybatis(if/choose when otherwise)
<if test='id > 3'> 3보다 크다 </if> <if test='id >= 3'> 3보다 크거나 같다 </if> <if test='id < 3'> 3보다 작다 </if> <if test='id <= 3'> 3보다 작거나 같다 </if>또는
<choose> <when test='id > 3'> 3보다 크다 </when> <when test='id == 3'> 3이다 </when> <when test='id < 3'> 3보다 작다 </when> </choose>
4. 검색 조건 선택후 검색버튼 클릭했을경우라고 가정
(문자열) 비교체크 조건문
- ibatis(isEqual / isNotEqual + compareValue)
<isEqual property="search_key" compareValue="title"> 조건절 </isEqual> <isNotEqual property="search_key" compareValue="content"> 조건절 </isNotEqual>
- mybatis는 공백조건의 경우와 동일하므로 생략
위와같이 비교를 들 수 있을 것이다.
본인의 생각으로
ibatis는 일일이 태그를 조건문 갯수에 따라 추가를 해줘야 하는 번거로움이 있는 반면,
mybatis는 JSTL처럼 일반적인 방식으로 사용을 해줄수 있어 라인수도 줄고 동적쿼리 작성하는데 코드작성이 좀더 수월한거 같다.
※ 만약 하나 이상의 조건을 mybatis에서 줄경우
&& = and
|| = or
로 하여서 여러개의 property로 비교가 가능하다.
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
mybatis - INSERT 후 시퀀스값 SELECT하기(MySQL,MS-SQL,ORACLE) (0) | 2014.09.03 |
---|---|
ibatis vs mybatis LIKE절 검색하기 (0) | 2014.08.04 |
ibatis(iterate) vs mybatis(foreach) 비교 샘플 (0) | 2014.07.31 |
ibatis(mybatis) 쿼리 xml을 작성할때 반복문이 필요할 경우가 생긴다.
흔히 in 조건절을 구현할때 주로 사용한다
예를들어 쿼리가
SELECT id,title,content FROM table_name WHERE id in (1,2,3)
와 같은 쿼리로 예를 들도록 하겠다.
parameter 타입은 private ArrayList<Integer> idList 변수로 받아왔다고 가정하자
그렇다면 각각의 쿼리 xml에 들어갈 태그는 다음과 같다.
- ibatis(iterate)
SELECT id,title,content FROM table_name WHERE id in <iterate property="idList" open="(" close=")" conjunction=","> #idList[]# </iterate>
-mybatis(foreach)
SELECT id,title,content FROM table_name WHERE id in <foreach item="item" index="index" collection="idList" open="(" separator="," close=")"> #{item} </foreach>
위와같이 비교를 들 수 있을 것이다.
mybatis 태그들의 문법은 거의 jstl의 문법과 비슷하다고 볼수 있다.
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
mybatis - INSERT 후 시퀀스값 SELECT하기(MySQL,MS-SQL,ORACLE) (0) | 2014.09.03 |
---|---|
ibatis vs mybatis LIKE절 검색하기 (0) | 2014.08.04 |
ibatis vs mybatis 조건문 + mybatis 공백조건 비교시 안될경우 및 두개이상 조건주기 (0) | 2014.08.01 |