728x90

-개발환경-

IDE : Eclipse 2018-12 (4.10.0)
Spring Tool Suite : 3.9.7.RELEASE
WAS : Pivotal tc Server Developer Edition v4.0 (피보탈 톰캣 서버)
DB : Oracle 11g

-설정-

-STS 브라우저 테스트환경 설정해주기-

WINDOW => Web Browser => Chrome 선택해서 테스트 환경을 크롬으로 잡아주기

-한글깨짐방지 태그 추가해주기-
web.xml 파일에서 아래 태그들 추가.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.CharacterEncodingFilter     
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>   
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>  
        <param-value>true</param-value>
    </init-param>
</filter>    
 
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>                 
</filter-mapping>
cs

 

DBCP Template을 위해 pom.xml 에서 다음을 설정해준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- 오라클 드라이버 외부 저장소 설정 -->
<repositories>
    <repository>
        <id>oracle</id>
        <name>ORACLE JDBC Repository</name>
        <url>http://maven.jahia.org/maven2</url>
    </repository>
</repositories>
<!-- oracle -->
<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>12.1.0.1</version>
</dependency>
<!-- spring dbcp -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>
cs

 

DBCP Template을 위해 servlet-context.xml 에서 다음을 설정해준다.

1
2
3
4
5
6
7
8
9
10
11
<!--servlet-context.xml에 dbcp template을 사용하기 위한 bean을 추가한다.-->
<beans:bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <beans:property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <beans:property name="username" value="koreait"/>
    <beans:property name="password" value="0000"/>
</beans:bean>
    
<beans:bean name="template" class="org.springframework.jdbc.core.JdbcTemplate">
    <beans:property name="dataSource" ref="dataSource"/>
</beans:bean>
cs

 

-HomeController.java-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Controller
public class HomeController {
    
    private JdbcTemplate template;
 
    public JdbcTemplate getTemplate() {
        return template;
    }
    @Autowired
    public void setTemplate(JdbcTemplate template) {
        this.template = template;
        Constant.template = template;
    }
 
    ~~~
cs

 

사전에 , servlet-context.xml 파일에서 JdbcTemplate 타입의 bean을 생성한다.
 프로젝트가 시작될 때  JdbcTemplate 클래스의 bean을  JdbcTemplate 타입 변수에 넣어주도록 만든다.

9 :  JdbcTemplate 클래스 객체의 setter 메소드가 프로젝트가 시작될때 자동으로 실행되게 하기 위해서 @Autowired 어노테이션을 붙여준다.
@Autowired 어노테이션이 붙어있는 메소드의 인수로 스프링이 servlet-context.xml 파일에서 생성한 JdbcTemplate 클래스의 bean을 자동으로 넣어준다.

12 :  컨트롤러 이외의 클래스에서 JdbcTemplate을 사용할수 있게 하기 위해서
       적당한 이름의 패키지에 적당한 이름으로 클래스를 만들고 선언한 정적 변수에 servlet-context.xml 파일에서 생성된 JdbcTemplate 클래스의 bean을 넣어준다.   

 

-Constant.java-

1
2
3
4
5
public class Constant {
    //다른 클래스에서 접근해서 사용해야 하기때문에 ,public static 으로 선언
    public static JdbcTemplate template;
}
 
cs

 

-MvcboardDAO.java-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MvcboardDAO {
 
    private JdbcTemplate template;
 
    public MvcboardDAO() {
        template = Constant.template;
    }
 
    public void insert(final MvcboardVO mvcboardVO) {
        String sql = "insert into mvcboard (idx,name,subject,content, ref , lev , seq) "
                + "values (mvcboard_idx_seq.nextval,?,?,?,mvcboard_idx_seq.currval,0,0)";
 
        template.update(sql,new PreparedStatementSetter() { 
            @Override
            public void setValues(PreparedStatement ps) throws SQLException {
                ps.setString(1, mvcboardVO.getName());
                ps.setString(2, mvcboardVO.getSubject());
                ps.setString(3, mvcboardVO.getContent());
            }
        });
    }
 
cs

 

3 : DAO 클래스에서 jdbc template 을 사용하기 위해서 JdbcTemplate 클래스 타입의 객체변수를 생성한다.

5~7 : 생성자에서 template을 초기화한다.

9 : 테이블내용이 변경되는 SQL 명령을 수행하려할때, 
메소드의 인수로 넘어오는 데이터는 중간에 값이 변경되면 안되기 때문에 fianl로 지정하도록 되어있다.

13 : 메소드의 인자로 ? 를 채울 익명객체가 들어간다.

15 :  오버라이드된 setValues메소드 에서 ? 를 채운다.

template.update(sql); => executeUpdate(sql)와 같은기능 
template.query(~);//테이블의 내용이 갱신되지 않는 sql 명령을 실행한다. => 실행결과가 여러건 일 경우 사용한다.
template.queryForObject(~);//테이블의 내용이 갱신되지 않는 sql 명령을 실행한다. =>실행결과가 1건일 경우.
template.queryForList(~);//테이블의 내용이 갱신되지 않는 sql 명령을 실행한다. =>  여러개 꺼내옴
template.queryForInt(~);// ( 비추천)테이블의 내용이 갱신되지 않는 sql 명령을 실행한다. =>  실행 결과가 정수 1건일 경우 사용한다.

 

 

다른 sql 문을 이용하는 경우를 보자..

 

1
2
String sql = "select count(*) from mvcboard";
return template.queryForObject(sql, Integer.class);
cs
1
2
3
4
5
6
String sql = "select * from ("+
        "select rownum rnum, AA.* from ("+
        "select * from mvcboard order by ref desc,seq asc"+
        ") AA where rownum <="+ hmap.get("endNo")+
        ") where rnum >="+hmap.get("startNo");
return (ArrayList<MvcboardVO>) template.query(sql, new BeanPropertyRowMapper(MvcboardVO.class));
cs

 

1~5 : dbcp template 을 사용하는 경우 select sql 명령에만 "?" 를 사용할 수 없다. => "?" 자리에 데이터가 저장된 변수를 사용한다.

8 : select sql 명령 실행 결과를 BeanPropertyRowMapper 클래스 생성자의 인수로
 MvcboardVO 클래스를 넘겨서 sql 명령 실행 결과를
저장시켜 리턴한다 .
 => List 타입으로 결과가 리턴되기 때문에 메소드의 리턴타입으로  형변환이 필요하다.
테이블의 필드 이름과 MvcboardVO클래스의 멤버 변수 이름이 반드시 같아야 정상적으로 실행된다.

 

-구성도-

-요약-

-마침글-

 

인용

 

+ Recent posts