블로그 이미지
Max.

calendar

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

Notice

2008.08.28 11:58 이전글(~2009)
이전 글에서 SpringJDBC 관련 기능들을 설명했는데, 최종적으로 어떤 방법으로 구현해야 할지 고민하게 된다. 일반적으로 가장 편리하다고 생각되는 SimpleJdbcTemplate를 이용한 예제가 좋을듯 하다. 이유는 JdbcTemplate 와 NamedParameterJdbcTemplate 를 포함하고 있기 때문에 가장 자주 쓰이게 된다.

아래는 내가 아는 가장 적합한(Best) SpringJDBC 예제코드를 화면 캡쳐한 것이다.

1. SELECT
사용자 삽입 이미지

2. INSERT(usingGeneratedKeyColumns()이 아닌 시퀀스로 KEY증가하는 경우)
사용자 삽입 이미지

3. BATCH UPDATE
사용자 삽입 이미지

4. SpringJDBC 기능 테스트
사용자 삽입 이미지

[참조]
- Spring2.5 Reference
- forum.springframework.org
- OSCON Simple JDBC with Spring2.5 - Thomas Risberg

신고

'이전글(~2009)' 카테고리의 다른 글

qooxdoo 0.8 released  (0) 2008.09.02
Open Flash Chart GWT(OFCGWT) Widget Library  (0) 2008.09.02
[SpringJDBC] SimpleJdbcTemplate 예제 코드  (0) 2008.08.28
진짜목적을 달성하기 위해서  (2) 2008.08.27
[서적] 부의 역사  (2) 2008.08.27
[SpringJDBC] SimpleJdbcCall  (0) 2008.08.26
posted by Max.
2008.08.26 22:06 이전글(~2009)
SimpleJdbcCall클래스는 스토어드프로시져나 메타데이터를 이용한 조회를 단순화 시켜준다.
다음과 같은 프로시져가 선언되어 있다고 하자.
CREATE PROCEDURE read_actor (
IN in_id INTEGER,
OUT out_first_name VARCHAR(100),
OUT out_last_name VARCHAR(100),
OUT out_birth_date DATE)
BEGIN
SELECT first_name, last_name, birth_date
INTO out_first_name, out_last_name, out_birth_date
FROM t_actor where id = in_id;
END;

이 프로시져를 SimpleJdbcCall를 이용해서 조회하는 예제는 아래와 같다. SimpleJdbcInsert와 같이 초기화시 withProcedureName()메서드를 통해서 프로시져 메다데이터를 읽어 온다. 결과값을 Map으로 받아서 직접 도메인 모델 객체에 set 하고 있다. 이것은 SimpleJdbcCall이 직접 도메인모델 객체에 매핑할수 없음을 말한다.

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcTemplate simpleJdbcTemplate;
  private SimpleJdbcCall procReadActor;
  public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    this.procReadActor =
    new SimpleJdbcCall(dataSource)
    .withProcedureName("read_actor");

  }
  public Actor readActor(Long id) {
    SqlParameterSource in = new MapSqlParameterSource()
    .addValue("in_id", id);
    Map out = procReadActor.execute(in);
    Actor actor = new Actor();
    actor.setId(id);
    actor.setFirstName((String) out.get("out_first_name"));
    actor.setLastName((String) out.get("out_last_name"));
    actor.setBirthDate((Date) out.get("out_birth_date"));
    return actor;
  }
  // ... additional methods
}

주의 할것은 프로시져 변수명화 out.get()파라메터명이 일치해야 하는것이다. DB 밴더에 따라서 대소문자가 구별될수 있다.

위에서 SimpleJdbcCall은 도메인모델 객체를 리턴하지 않는다고 언급하였는데, 외부 클래스를 이용하여 도메인모델 객체를 리턴할수 있다. 바로 CaseInsensitiveMap를 이용하는 것인데 이것은 Jakarta Commons project에서 Spring이 차용한것이다. 이용하는 방법은 setResultsMapCaseInsensitive() 메서드를  'ture'로 설정하고 사용하면 된다. (또한 commons-collections.jar를 classpath로 잡아야 한다.)

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcCall procReadActor;
  public void setDataSource(DataSource dataSource) {
     JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
     jdbcTemplate.setResultsMapCaseInsensitive(true);
     this.procReadActor =
     new SimpleJdbcCall(jdbcTemplate)
     .withProcedureName("read_actor");
  }
  // ... additional methods
}


또한 파라메터와 형식을 직접 설정할수도 있다.

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcCall procReadActor;
  public void setDataSource(DataSource dataSource) {
     JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
     jdbcTemplate.setResultsMapCaseInsensitive(true);
     this.procReadActor =
     new SimpleJdbcCall(jdbcTemplate)
     .withProcedureName("read_actor")
     .withoutProcedureColumnMetaDataAccess()
     .useInParameterNames("in_id")
     .declareParameters(
         new SqlParameter("in_id", Types.NUMERIC),
         new SqlOutParameter("out_first_name", Types.VARCHAR),
         new SqlOutParameter("out_last_name", Types.VARCHAR),
         new SqlOutParameter("out_birth_date", Types.DATE)
     ); 
  }
  // ... additional methods
}


지원하는 타입은 거의 모든 RDMS는 지원한다.
(Derby, DB2, MySQL, Microsoft SQL Server, Oracle, Sybase)

스토어드평션을 호출할때는 withFunctionName로 설정하고, executeFunction로 호출하면 된다.

CREATE FUNCTION get_actor_name (in_id INTEGER)
RETURNS VARCHAR(200) READS SQL DATA
BEGIN
DECLARE out_name VARCHAR(200);
SELECT concat(first_name, ' ', last_name)
INTO out_name
FROM t_actor where id = in_id;
RETURN out_name;
END;

소스는 아래와 같다.

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcTemplate simpleJdbcTemplate;
  private SimpleJdbcCall funcGetActorName;

  public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.setResultsMapCaseInsensitive(true);
    this.funcGetActorName =
    new SimpleJdbcCall(jdbcTemplate)
    .withFunctionName("get_actor_name");
  }

  public String getActorName(Long id) {
    SqlParameterSource in = new MapSqlParameterSource()
    .addValue("in_id", id);
    String name = funcGetActorName.executeFunction(String.class, in);
    return name;
  }
  // ... additional methods
}

프로시져를 이용해서 ResultSet를 리턴하고 싶다면 returningResultSet()메서드에 RowMapper로 도메인모델 객체를 넘겨주고 Map으로 받을수 있다.

CREATE PROCEDURE read_all_actors()
BEGIN
SELECT a.id, a.first_name, a.last_name, a.birth_date FROM t_actor a;
END;

만약 결과값이 없으면 어떠 파라메터값도 가지지 않는다.

public class JdbcActorDao implements ActorDao {
private SimpleJdbcTemplate simpleJdbcTemplate;
private SimpleJdbcCall procReadAllActors;

  public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.setResultsMapCaseInsensitive(true);
    this.procReadAllActors =
    new SimpleJdbcCall(jdbcTemplate)
    .withProcedureName("read_all_actors")
    .returningResultSet("actors",
    ParameterizedBeanPropertyRowMapper.newInstance(Actor.class));

  }

  public List getActorsList() {
    Map m = procReadAllActors.execute(new HashMap<String, Object>(0));
    return (List) m.get("actors");

  }
  // ... additional methods
}

Map의 파라메터가 callee와 caller가  "actors"로 동일하다.

이후 언급되는 것은 고급기법으로 여기서는 생략하다.
11.6 Modeling JDBC operations as Java objects
11.7 Common issues with parameter and data value handling(BLOB,CLOB)
나중에 기회가 되면 실예제로 설명한다.


이상 11장 Data access using JDBC 개념적인 것은 끝났고, Demo Project를 통해서 다루기로 한다. (다음에 계속...)

'요즘은 거의 안쓰는 SpringJDBC라 그런지 별로 재미가 없다....ㅡㅡ;'
신고

'이전글(~2009)' 카테고리의 다른 글

진짜목적을 달성하기 위해서  (2) 2008.08.27
[서적] 부의 역사  (2) 2008.08.27
[SpringJDBC] SimpleJdbcCall  (0) 2008.08.26
[SpringJDBC] SimpleJdbcInsert  (0) 2008.08.26
[SpringJDBC] SimpleJdbcTemplate  (0) 2008.08.26
[SpringJDBC] Batch  (0) 2008.08.26
posted by Max.
2008.08.26 22:05 이전글(~2009)
SimpleJdbcInsert 와 SimpleJdbcCall는 메타데이타를 이용해서 해당 작업을 단순화시킨 클래스이다. 먼저 SimpleJdbcInsert 를 보자.

SimpleJdbcInsert 는 먼저 클래스가 초기화 될때 withTableName 메서드를 이용하여 테이블명을 지정하고 입력할 데이터를 Map으로 매핑하면 된다.

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcTemplate simpleJdbcTemplate;
  private SimpleJdbcInsert insertActor;
 
public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    this.insertActor = new SimpleJdbcInsert(dataSource).withTableName("t_actor");
  }

  public void add(Actor actor) {
    Map<String, Object> parameters = new HashMap<String, Object>(3);
    parameters.put("id", actor.getId());
    parameters.put("first_name", actor.getFirstName());
    parameters.put("last_name", actor.getLastName());
    insertActor.execute(parameters);
  }
  // ... additional methods
}


또한 자동증가값 필드가 필요하다면 usingGeneratedKeyColumns()메서드를 이용하면 된다.

public class JdbcActorDao implements ActorDao {
private SimpleJdbcTemplate simpleJdbcTemplate;
private SimpleJdbcInsert insertActor;

    public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    this.insertActor =
        new SimpleJdbcInsert(dataSource)
        .withTableName("t_actor")
        .usingGeneratedKeyColumns("id");
    }

    public void add(Actor actor) {
    Map<String, Object> parameters = new HashMap<String, Object>(2);
    parameters.put("first_name", actor.getFirstName());
    parameters.put("last_name", actor.getLastName());
    Number newId = insertActor.executeAndReturnKey(parameters);
    actor.setId(newId.longValue());
    }
    // ... additional methods
}


만약 특별한 필드명으로 바꾸고 싶다면, usingColumns()를 이용해서 바꿀수도 있다.

this.insertActor =
new SimpleJdbcInsert(dataSource)
.withTableName("t_actor")
.usingColumns("first_name", "last_name")
.usingGeneratedKeyColumns("id");

SimpleJdbcInsert 역시 Map 대신 도메인 모델 객체를 파라메터로 넘길수 있다.
...
public void add(Actor actor) {
  SqlParameterSource parameters = new BeanPropertySqlParameterSource(actor);
  Number newId = insertActor.executeAndReturnKey(parameters);
  actor.setId(newId.longValue());
}
...


이 경우 도메인 모델 객체가 은닉화되어 어떻게 매핑되는지 알수 없다. 그래서 더욱 편리한 방법을 또 제공하고 있다.
...
public void add(Actor actor) {
   SqlParameterSource parameters = new MapSqlParameterSource()
    .addValue("first_name", actor.getFirstName())
    .addValue("last_name", actor.getLastName());
   Number newId = insertActor.executeAndReturnKey(parameters);
   actor.setId(newId.longValue());
}
...

이런 방법들은 JdbcTemplate 시리즈가 거의 비슷하게 적용되고 있다.
신고

'이전글(~2009)' 카테고리의 다른 글

[서적] 부의 역사  (2) 2008.08.27
[SpringJDBC] SimpleJdbcCall  (0) 2008.08.26
[SpringJDBC] SimpleJdbcInsert  (0) 2008.08.26
[SpringJDBC] SimpleJdbcTemplate  (0) 2008.08.26
[SpringJDBC] Batch  (0) 2008.08.26
[SpringJDBC] NamedParameterJdbcTemplate  (0) 2008.08.26
posted by Max.
2008.08.26 22:04 이전글(~2009)

SimpleJdbcTemplate은 java5 이상 버전에서만 사용할수 있다. JdbcTemplate를 래핑하고 java5의 특징(varargs,autoboxing)을 살려서 구현할수 있다.
JdbcTemplate로 구현할때와 SimpleJdbcTemplate로 구현할때의 클래스를 비교해 보자.

// classic JdbcTemplate-style...
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
 this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public Actor findActor(long id) {
 String sql = "select id, first_name, last_name from T_ACTOR where id = ?";
 RowMapper mapper = new RowMapper() {
  public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
  Actor actor = new Actor();
  actor.setId(rs.getLong("id"));
  actor.setFirstName(rs.getString("first_name"));
  actor.setLastName(rs.getString("last_name"));
  return actor;
 }

};
// notice the cast, the wrapping up of the 'id' argument
// in an array, and the boxing of the 'id' argument as a reference type
return (Actor) jdbcTemplate.queryForObject(sql, mapper, new Object[] {Long.valueOf(id)});
}

 SimpleJdbcTemplate를 이용하면 아래와 같다.

// SimpleJdbcTemplate-style...
private SimpleJdbcTemplate simpleJdbcTemplate;
public void setDataSource(DataSource dataSource) {
 this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
}
public Actor findActor(long id) {
 String sql = "select id, first_name, last_name from T_ACTOR where id = ?";
 ParameterizedRowMapper<Actor> mapper = new ParameterizedRowMapper<Actor>() {
  // notice the return type with respect to Java 5 covariant return types
  public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
   Actor actor = new Actor();
   actor.setId(rs.getLong("id"));
   actor.setFirstName(rs.getString("first_name"));
   actor.setLastName(rs.getString("last_name"));
   return actor;
  }
 };
 return this.simpleJdbcTemplate.queryForObject(sql, mapper, id);
}


ParameterizedBeanPropertyRowMapper를 이용하여 좀더 단순화 하여 class로 매핑시킬수도 있다.

// SimpleJdbcTemplate-style...
private SimpleJdbcTemplate simpleJdbcTemplate;
public void setDataSource(DataSource dataSource) {
 this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
}
public Actor findActor(long id) {
 String sql = "select id, first_name, last_name from T_ACTOR where id = ?";
 return this.simpleJdbcTemplate.queryForObject(sql,  ParameterizedBeanPropertyRowMapper.newInstance(Actor.class), id);
}

만약 쿼리 결과값이 기본객체에 해당한다면 다음과 같을 것이다.

// ParameterizedBeanPropertyRowMapper로 casting할 필요가 없다.
 return this.simpleJdbcTemplate.queryForObject(sql, String.class, id);

이 역시 Best 방법에 대해서 좀더 생각해 봐야 한다. 이후에 다시 언급하기로 한다.
신고

'이전글(~2009)' 카테고리의 다른 글

[SpringJDBC] SimpleJdbcCall  (0) 2008.08.26
[SpringJDBC] SimpleJdbcInsert  (0) 2008.08.26
[SpringJDBC] SimpleJdbcTemplate  (0) 2008.08.26
[SpringJDBC] Batch  (0) 2008.08.26
[SpringJDBC] NamedParameterJdbcTemplate  (0) 2008.08.26
[SpringJDBC] JdbcTemplate  (0) 2008.08.26
posted by Max.
2008.08.26 22:03 이전글(~2009)

SimpleJdbcTemplate를 이용해서 일괄처리를 할수 있는 메서드를 제공하는데 그것이 batchUpdate()메서드이다. 여기서 일괄처리는 여러개의 row를 insert,update,delete하는것을 말한다. 간단히 다음과 같은 예제를 통해서 이해할수 있다.

public class JdbcActorDao implements ActorDao {
  private SimpleJdbcTemplate simpleJdbcTemplate;
  public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
  }
  public int[] batchUpdate(final List<Actor> actors) {
    SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(actors.toArray());
    int[] updateCounts = simpleJdbcTemplate.batchUpdate(
    "update t_actor set first_name = :firstName, last_name = :lastName where id = :id",batch);
    return updateCounts;
}
// ... additional methods
}

SqlParameterSourceUtils.createBatch에 각기 다른 도메인 객체 List를 batch 변수에 저장하고 batchUpdate로 한꺼번에 업데이트하는 예제이다. 물론 아래와 같이 "?"를 이용해서 구현할수도 있다.

public class JdbcActorDao implements ActorDao {
private SimpleJdbcTemplate simpleJdbcTemplate;
public void setDataSource(DataSource dataSource) {
  this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
}
public int[] batchUpdate(final List<Actor> actors) {
  List<Object[]> batch = new ArrayList<Object[]>();
  for (Actor actor : actors) {
  Object[] values = new Object[] {
    actor.getFirstName(),
    actor.getLastName(),
    actor.getId()};
    batch.add(values);
  }
  int[] updateCounts = simpleJdbcTemplate.batchUpdate(
  "update t_actor set first_name = ?, last_name = ? where id = ?",batch);
  return updateCounts;
}

이것은 보통

while (iter.hasNext()) {
    jdbcTemplate.update(....);
}

형식일때 자원을 낭비하지 말고, 효과적으로 사용하라고 만들어 놓은것이다.

신고

'이전글(~2009)' 카테고리의 다른 글

[SpringJDBC] SimpleJdbcInsert  (0) 2008.08.26
[SpringJDBC] SimpleJdbcTemplate  (0) 2008.08.26
[SpringJDBC] Batch  (0) 2008.08.26
[SpringJDBC] NamedParameterJdbcTemplate  (0) 2008.08.26
[SpringJDBC] JdbcTemplate  (0) 2008.08.26
[SpringJDBC] 개요  (0) 2008.08.26
posted by Max.
2008.08.26 22:02 이전글(~2009)

Statement 쿼리에 매핑할 파라메터는 보통 '?'를 인자로 하는데 이는 직관적이지 못해서 의미있는 매핑을 위해 이름을 사용할수 있게한 JdbcTemplate 래퍼 클래스이다.

public int countOfActorsByFirstName(String firstName) {
    String sql = "select count(0) from T_ACTOR where first_name = :first_name";
    SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);
    return namedParameterJdbcTemplate.queryForInt(sql, namedParameters);
}

예제에서 처럼 쿼리문 변수(sql)에 간단히 ':변수명' 형식으로 정의한후 MapSqlParameterSource로 해당 변수를 매핑하여 쿼리를 실행한다. 여기서 SqlParameterSource  대신 Map을 이용할수도 있다.

Map namedParameters = Collections.singletonMap("first_name", firstName);

또한 Map 대신에 Bean 객체를 이용할수도 있다.

public int countOfActorsByFirstName(String firstName) {
    String sql = "select count(0) from T_ACTOR where first_name = :first_name";
    Actor exampleActor = new Actor(firstName);
    SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(exampleActor);
    return this.namedParameterJdbcTemplate.queryForInt(sql, namedParameters);
}

기억해 둘것은 NamedParameterJdbcTemplate 클래스는 JdbcTemplate클래스를 완전이 감싸고 있기 때문에 NamedParameterJdbcTemplate에서 언제든지 JdbcTemplate의 기능을 사용할수 있다.

신고

'이전글(~2009)' 카테고리의 다른 글

[SpringJDBC] SimpleJdbcTemplate  (0) 2008.08.26
[SpringJDBC] Batch  (0) 2008.08.26
[SpringJDBC] NamedParameterJdbcTemplate  (0) 2008.08.26
[SpringJDBC] JdbcTemplate  (0) 2008.08.26
[SpringJDBC] 개요  (0) 2008.08.26
가고싶은 일주일간의 독서여행  (2) 2008.08.26
posted by Max.
2008.08.26 22:01 이전글(~2009)
JdbcTemplate 클래스는 SpringJDBC 패키지에서 가장 기본이되는 클래스로 SQL를 질의하거나, update, 스토어드프로시져 콜, Resultset 을 실행한다. 이 클래스는 단순히 콜백 인터페이스만 구현하면 사용할수 있는데 보통 DAO의 구현체에서 사용된다.

이 클래스를 사용하기 위해서는 Datasource를 Spring IoC로 참조하고 해당 DAO 구현체에서 확장하거나 참조로 사용할수 있다.

1. SELECT 쿼리 예제
// 숫자형을 리턴할때
int countOfActorsNamedJoe = this.jdbcTemplate.queryForInt(
"select count(0) from t_actors where first_name = ?", new Object[]{"Joe"});

// 도메인 객체와 매핑할때
public Collection findAllActors() {
return this.jdbcTemplate.query( "select first_name, surname from t_actor", new ActorMapper());
}
private static final class ActorMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Actor actor = new Actor();
actor.setFirstName(rs.getString("first_name"));
actor.setSurname(rs.getString("surname"));
return actor;
}
}

2. INSERT, UPDATE, DELETE 쿼리 예제
this.jdbcTemplate.update(
"insert into t_actor (first_name, surname) values (?, ?)",
new Object[] {"Leonor", "Watling"});

SQL문만 다를뿐 모두 update 메서드를 사용하면 된다.
또한 간단한 스토어드프로시져도 update메서드를 이용할수 있다.
this.jdbcTemplate.update(
"call SUPPORT.REFRESH_ACTORS_SUMMARY(?)",
new Object[]{Long.valueOf(unionId)});


3.기타
그밖에 DDL 같은 특수한 쿼리를 실행할때는 execute()메서드를 사용하기도 한다.
this.jdbcTemplate.execute("create table mytable (id integer, name varchar(100))");

JdbcTemplate를 사용하기 위해서 위와 같은 기본기능이 있고, 사용하기 위한 Spring 환경 설정은 다음과 같다.

환경설정에서...
<bean id="corporateEventDao" class="com.example.JdbcCorporateEventDao">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
Class에서...
public class JdbcCorporateEventDao implements CorporateEventDao {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// JDBC-backed implementations of the methods on the CorporateEventDao follow...
}


기억할것은 Spring은 다양한 방법을 제공하고 또 만들수 있다. 따라서 이것은 Best가 아닌 선택이라는것을 앞으로 다른 JDBC 관련 클래스를 보면서 알수 있다.
(계속...)
신고

'이전글(~2009)' 카테고리의 다른 글

[SpringJDBC] Batch  (0) 2008.08.26
[SpringJDBC] NamedParameterJdbcTemplate  (0) 2008.08.26
[SpringJDBC] JdbcTemplate  (0) 2008.08.26
[SpringJDBC] 개요  (0) 2008.08.26
가고싶은 일주일간의 독서여행  (2) 2008.08.26
책을 사서(buy) 봐야 하는 이유  (0) 2008.08.25
posted by Max.
2008.08.26 22:00 이전글(~2009)

소개
스프링 2.5 에서는 JDBC 데이터 접근에 대한 편리한 클래스를 제공하고 있는데 그 종류와 특징은 아래와 같다.

  • JdbcTemplate 클래스는 가장 기본이 되는 클래스로 스프링 초기부터 제공하는 클래스이다.
  • NamedParameterJdbcTemplate 클래스는 JdbcTemplate클래스를 완전히 포함한 클래스로 클래스명에서 눈치챌수 있듯이 "?" 대신 "이름"으로 파라메터를 지정할수 있다.
  • SimpleJdbcTemplate 클래스는 위의 두개의 클래스 기능을 포함할 뿐아니라, java5의 특징까지 포함한 편리한 클래스이다.
  • SimpleJdbcInsert 와 SimpleJdbcCall 클래스는 질의를 좀더 단순화 하기 위해서 새로 추가된 극도(?)로 편리한 클래스이다.
  • 이밖에 MappingSqlQuery, SqlUpdate, StoredProcedure가 있다.

패키지 구조

사용자 삽입 이미지

위 그림은 Spring CVS jdbc 패키지 구조이며, 여러 폴더(패키지)가 있지만 실제 클래스가 있는 폴더는 core, datasource, object, support 만 있다. core 폴더는 Spring JDBC에서 가장 많이 쓰는 대부분의 클래스들이 포함되어 있는 패키지로 잘 알려진 JdbcDaoSupport나 JdbcTemplate등도 여기에 속해 있다. datasource폴더는 데이터자원 관리(획득,운용,소멸)를 쉽게 해주는 클래스와 JEE 컨테이너 밖에서 테스트가 가능하거나 JNDI로 자원획득도 가능하게 여러가지 유틸클래스를 제공한다.  object폴더는 재사용가능한 객체, 프로시져, 질의 등의 RDMS와 관련된 클래스를 제공한다.(JDO를 모델로했다.) 마지막으로 support폴더는 예외처리와 외부지원관련 유틸클래스를 제공하고 있다.



신고
posted by Max.
prev 1 next

티스토리 툴바