MSSQL jdbcType javaType 매핑 정보

myBatis 로 개발 시 간혹 입출력 변수의 javaType 이나 jdbcType을 명시해 줘야 할 때가 있다.
이럴 때 참고하기위해 기록 해 둠.
참고로, myBatis의 jdbcType enum 정의는 http://www.mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/JdbcType.html 에서 확인 가능.

https://msdn.microsoft.com/ko-kr/library/ms378878(v=sql.110).aspx
SQL Server 형식 JDBC 형식(java.sql.Types) Java 언어 형식
bigint BIGINT long
binary BINARY byte[]
bit BIT boolean
char CHAR String
date DATE java.sql.Date
datetime TIMESTAMP java.sql.Timestamp
datetime2 TIMESTAMP java.sql.Timestamp
datetimeoffset(2) microsoft.sql.Types.DATETIMEOFFSET microsoft.sql.DateTimeOffset
decimal DECIMAL java.math.BigDecimal
float DOUBLE double
image LONGVARBINARY byte[]
int INTEGER int
money DECIMAL java.math.BigDecimal
nchar CHAR

NCHAR(Java SE 6.0)
String
ntext LONGVARCHAR

LONGNVARCHAR(Java SE 6.0)
String
numeric NUMERIC java.math.BigDecimal
nvarchar VARCHAR

NVARCHAR(Java SE 6.0)
String
nvarchar(max) VARCHAR

NVARCHAR(Java SE 6.0)
String
real REAL float
smalldatetime TIMESTAMP java.sql.Timestamp
smallint SMALLINT short
smallmoney DECIMAL java.math.BigDecimal
text LONGVARCHAR String
time TIME(1) java.sql.Time(1)
timestamp BINARY byte[]
tinyint TINYINT short
udt VARBINARY byte[]
uniqueidentifier CHAR String
varbinary VARBINARY byte[]
varbinary(max) VARBINARY byte[]
     
varchar VARCHAR String
varchar(max) VARCHAR String
xml LONGVARCHAR

LONGNVARCHAR(Java SE 6.0)
String

SQLXML
2016/07/25 09:26 2016/07/25 09:26
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

MSSQL Procedure 변경이력 확인

SELECT * 
FROM sys.sql_modules sm 
inner join sys.all_objects ao 
on sm.object_id = ao.object_id 
order by modify_date desc
 
2016/03/23 14:57 2016/03/23 14:57
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

MSSQL 연결 문자열을 row로 변환


function으로..
CREATE FUNCTION [dbo].[SplitToRows]
    (
        @List NVARCHAR(MAX),
        @delim VARCHAR(255)
    )
    RETURNS TABLE
    AS
        RETURN ( SELECT [Value] FROM 
          (
            SELECT 
              [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
              CHARINDEX(@delim, @List + @delim, [Number]) - [Number])))
            FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
              FROM sys.all_objects) AS x
              WHERE Number <= LEN(@List)
              AND SUBSTRING(@delim + @List, [Number], LEN(@delim)) = @delim
          ) AS y
        );


임시 테이블 방법으로...
DECLARE @to_convert_str nvarchar(2000)
DECLARE @delim varchar(1)
set @to_convert_str = '가나다,라마바,사아자';
set @delim = ','

;WITH converte_to_rows AS (
SELECT 
  [converted_row] = LTRIM(RTRIM(SUBSTRING(@to_convert_str, [Number],
  CHARINDEX(@delim, @to_convert_str + ',', [Number]) - [Number])))
FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
  FROM sys.all_objects) AS x
  WHERE Number <= LEN(@to_convert_str)
  AND SUBSTRING( ',' + @to_convert_str, [Number], LEN( @delim)) =  @delim
) 

SELECT * FROM converte_to_rows
2014/03/28 10:09 2014/03/28 10:09
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Hibernate의 generated query와 MSSQL의 nolock 힌트에 대한 고찰

하이버네이트와 같은 OR매핑 도구를 이용하게되면 개발자가 SQL 를 작성할 필요가 없어지고 ( 물론, createSQLQuery() 메소드를 통해 native query를 작성할 수 있지만 이번글의 주제와는 조금 다른 이야기이니 제쳐두자. ) OR매퍼에서 생성된 쿼리가 실행되는데 MSSQL과 hibernate를 이용할때는 한 가지 특수한 상황에 맞딱드리게 된다.

바로 select lock.
MSSQL, Sybase, DB2는 여타 DBMS와는 달리 select 쿼리에도 row level lock ( 트랜젝션이 몰리면 이 lock도 에스컬레이션해서 row -> page -> table lock으로 범위가 확대 )을 거는데 일반적인 web application을 개발하는데 select lolock은 DB성능을 떨어트리는 원인이되기때문에 대게 select 쿼리에 각 테이블에 with(nolock) 힌트를 줘서 락을 걸지 않도록 처리한다.

이제 Hibernate로 돌아와서, hibernate에 의해  generate된 쿼리에는 with(nolock) 옵션이 기본 적용이 되지 않는다.  MSSQL에서 그냥 이용해도 하이버네이트 캐시시스템의 덕으로 문제가 발생하지 않을 수도 있지만 쿼리 실행 시 부하를 줄일 수 있는 방안이 있다면 적용하지 않을 이유가 없다.

이와 같은 내용은 검색 엔진에 hibernate mssql nolock 등의 키워드로 찾아보면 많은 결과를 확인할 수 있다. 그 중에 https://forum.hibernate.org/viewtopic.php?f=1&t=934158 의 쓰레드를 통해 확인한 방법은 다음과 같다.

session.connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);


물론, MSSQL의 READ COMMITTED 격리수준 등 더 깊이있는 주제들도 있지만 내가 DB Geek도 아니고... 프로그래머 입장에서 요 정도까지만..
2012/06/12 18:27 2012/06/12 18:27
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

MSSQL SP내의 특정 테이블 이름 , 문자열 검색


테이블 검색
Select object_name(id) From syscomments Where text like '%tournament_ranking%'
Group by object_name(id)
Order by object_name(id)

문자열 검색
select * from sys.all_objects as o  with(nolock)
inner join sys.sql_modules as a with(nolock) on o.object_id = a.object_id
where a.definition like '%ts_keyword%'
order by o.name asc
2010/12/10 19:23 2010/12/10 19:23
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

MSSQL jdbc 드라이버 sqljdbc.jar 와 sqljdbc4.jar 의 차이점

2009/12/08 17:29

서비 JAVA ,


sqljdbc.jar

sqljdbc.jar 클래스 라이브러리는 JDBC 3.0을 지원합니다.
sqljdbc.jar 클래스 라이브러리에는 JRE(Java Runtime Environment) 버전 5.0이 필요합니다.
JRE 6.0에서 sqljdbc.jar을 사용하면 데이터베이스에 연결할 때 예외가 발생합니다.

참고: JDBC 드라이버 버전 2.0은 JRE 1.4를 지원하지 않습니다. JDBC 드라이버 버전 2.0을
        사용하려면 JRE 1.4를 JRE 5.0 이상으로 업그레이드해야 합니다.
        응용 프로그램이 JDK 5.0 이상과 호환되지 않아 다시 컴파일해야 하는 경우도 있습니다.  



sqljdbc4.jar

sqljdbc4.jar 클래스 라이브러리는 JDBC 4.0을 지원합니다.
이 라이브러리에는 sqljdbc.jar의 모든 기능과 함께 새로운 JDBC 4.0 메서드가 포함되어 있습니다.
sqljdbc4.jar 클래스 라이브러리에는 JRE(Java Runtime Environment) 버전 6.0 이상이 필요합니다.
JRE 1.4 또는 5.0에서 sqljdbc4.jar을 사용하면 예외가 발생합니다.

참고: 응용 프로그램을 JRE 6.0에서 실행해야 하는 경우에는 JDBC 4.0 기능을 사용하지 않더라도
        sqljdbc4.jar을 사용하십시오. 

http://msdn.microsoft.com/ko-kr/library/ms378422.aspx(새 창으로 열기)

2009/12/08 17:29 2009/12/08 17:29
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다