Upload
3-2
View
30
Download
10
Embed Size (px)
Citation preview
Spring Framework & My-Batis스프링 프레임워크 & 마이바티스 강의
탑크리에듀 교육센터
CONTENTS
1. 스프링 프레임워크 개요
2. Spring & DI
3. Spring AOP((Spring Asp
4. Spring JDBC
4.3 Spring JDBC 에서 DB 접근하는 방법
4.3.2 Spring JDBC 에서 DB 접근하는 방법 – NamedParameterJdbcTemplate
4.3.3 Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
4.3.4 Spring JDBC 에서 DB 접근하는 방법 – SimpleJdbcCall
4.3.5 Spring JDBC 에서 DB 접근하는 방법 – SqlUpdate
4.3.6 Spring JDBC 에서 DB 접근하는 방법 – StoredProcedure
4.3.7 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer
Chapter 4 Spring JDBC
~ 4.3.7
4. Spring JDBC
: 이름없는 ? 대신 이름을 부여해서 바인드 변수 처리가 가능하다 .
4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-2. Spring JDBC 에서 DB 접근하는 방법 – NamedParameterJdbcTem-plate
public class PersonDao { @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; @Override public void createPerson(Integer id, String firstname, String lastname) { String SQL = "INSERT INTO person (id, firstname, lastname) VALUES (:id, :firstname, :lastname)"; Map namedParameters = new HashMap(); namedParameters.put(“id", id); namedParameters.put(“firstname", firstname); namedParameters.put(“lastname", lastname); namedParameterJdbcTemplate.update(SQL, namedParameters); } }
4. Spring JDBC
: JdbcTemplate 의 모든 기능과 NamedParameterJdbcTemplate 의 기능을 합친 것으로 자바 5 의 auto boxing 과 varargs(String…args, 가변길이 매개변수 ) 기능을 포함하고 있다 .
4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-3. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
[JdbcTemplate Style]
public class PersonDao { private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } public Person findPerson(Integer id, String lastname) { String sql = "select id, firstname, lastname from PERSON where id = ? and lastname = ?"; RowMapper<person> mapper = new RowMapper<person>() { public Person mapRow(ResultSet rs, int rowNum) throws SQLException { Person person = new Person(); person.setId(rs.getLong("id")); person.setFirstName(rs.getString("firstname")); person.setLastName(rs.getString("lastname")); return person; } }; // SELECT 인 경우 Mapper 가 뒤에 오고 그 앞에 매개변수들을 객체배열에 담아 넘긴다 . // Person 타입으로 형 변환도 필요하다 . return (Person) jdbcTemplate.queryForObject(sql, new Object[] {id, lastname}, mapper); }
4. Spring JDBC
: JdbcTemplate 의 모든 기능과 NamedParameterJdbcTemplate 의 기능을 합친 것으로 자바 5 의 auto boxing 과 varargs(String…args, 가변길이 매개변수 ) 기능을 포함하고 있다 .
4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-3. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
[SimpleJdbcTemplate Style]
public class PersonDao { private SimpleJdbcTemplate simpleJdbcTemplate; public void setDataSource(DataSource dataSource) { this. simpleJdbcTemplate = new SimpleJdbcTemplate (dataSource); } public Person findPerson(Integer id, String lastname) { String sql = "select id, firstname, lastname from PERSON where id = ? and lastname = ?"; RowMapper<person> mapper = new RowMapper<person>() { public Person mapRow(ResultSet rs, int rowNum) throws SQLException { Person person = new Person(); person.setId(rs.getLong("id")); person.setFirstName(rs.getString("firstname")); person.setLastName(rs.getString("lastname")); return person; } }; // SELECT 인 경우 Mapper 가 쿼리문 다음에 오고 그 뒤에 가변길이 매개변수 형태로 넘기는 // 객체배열 형태로 받는다 . Person 타입으로 형 변환도 필요없다 . return simpleJdbcTemplate.queryForObject(sql, mapper, id, lastname); }
4. Spring JDBC
DataBase 에 SQL 로 만들어져 있는 저장함수 , 프로시저를 다루기 위한 클래스로 최소한의 구성으로 DB 함수 , Procedure 에 접근할 수 있다 .
4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
오라클 서버쪽 패키지 (Package) 및 함수 (Function)
create or replace package types as type currtype is ref cursor; end; / create or replace function getEmp(v_deptno in number) return types.currtype AS emp_cursor types.currtype; sql_string VARCHAR2(500); BEGIN sql_string := 'SELECT empno, ename, sal FROM EMP WHERE DEPTNO = :1’ ; OPEN emp_cursor FOR sql_string USING v_deptno; RETURN emp_cursor; CLOSE emp_cursor; END; /
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
New Project Spring Legacy Project
Project Name : springjdbcSimple Projects : Simple Spring Maven
[pom.xml 에 추가 ]
<dependences>
…
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.1.0.7.0</version>
</dependency>
</dependences>
<repositories>
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>https://maven.oracle.com</url>
</repository>
</repositories>
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
DTO 역할을 하는 Emp.javapackage edu.onj.function;public class Emp {private String empno;private String ename;private String sal;public Emp() {}public Emp(String empno, String ename, String sal) {this.empno = empno;this.ename = ename;this.sal = sal;}public void setEmpno(String empno) {this.empno = empno;} public void setEname(String ename) {this.ename = ename;}public void setSal(String sal) {this.sal = sal;}public String getEmpno() {return empno; public String getEname() {return ename;}public String getSal() {return sal;}}
DAO 서 비 스 를 위 한 인 터 페 이 스[EmpDao.java]
package edu.onj.function; import java.util.List;import javax.sql.DataSource;public interface EmpDao {public void setDataSource(DataSource ds);public int[] createEmpList(final List<Emp> emps);public List<Emp> listEmp(Integer empno);}
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
DAO 서비스를 위한 클래스 [EmpDao.java]package edu.onj.function; import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Types;import java.util.List;import java.util.Map;import javax.sql.DataSource;import oracle.jdbc.OracleTypes;import org.springframework.jdbc.core.BatchPreparedState-mentSetter;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.SqlOutParameter;import org.springframework.jdbc.core.SqlParameter;import org.springframework.jdbc.core.namedparam.MapSql-ParameterSource;import org.springframework.jdbc.core.namedparam.SqlPa-rameterSource;import org.springframework.jdbc.core.simple.SimpleJdbcCall;public class EmpDaoImpl implements EmpDao {private DataSource dataSource;private JdbcTemplate jdbcTemplate;public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;this.jdbcTemplate = new JdbcTemplate(dataSource);}public DataSource getDataSource() {return dataSource;} /*
* 여런건의 EMP 데이터를 BatchPreparedStatementSetter 를 이용하여 일괄 인서트*/@Overridepublic int[] createEmpList(final List<Emp> emps) {String SQL = "insert into emp(empno, ename, sal) values (?, ?, ?)";BatchPreparedStatementSetter setter = null;setter = new BatchPreparedStatementSetter() {@Overridepublic int getBatchSize() {return emps.size();}@Override public void setValues(PreparedStatement ps, int index) throws SQLException {Emp emp = emps.get(index);int parameterIndex = 1;ps.setString(parameterIndex++, emp.getEmpno());ps.setString(parameterIndex++, emp.getEname());ps.setString(parameterIndex++, emp.getSal());}};return jdbcTemplate.batchUpdate(SQL, setter);}
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
DAO 서비스를 위한 클래스 [EmpDao.java] /* 오라클 Stored Function 을 호출하여 10 번 부서 사원리스트 출력 (REF CURSOR) */@Overridepublic List<Emp> listEmp(Integer deptno) {SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(this.dataSource).withSchemaName("scott").withFunctionName("getEmp").declareParameters(new SqlOutParameter("emp_cursor", OracleTypes.CURSOR, new EmpMapper()),new SqlParameter("v_deptno", Types.INTEGER)).withoutProcedureColumnMetaDataAccess();SqlParameterSource params = new MapSqlParameterSource("v_deptno", deptno); //execute 메서드는 Map 형태러 리턴한다 .Map<String, Object> resultSet = simpleJdbcCall.execute(params);return (List<Emp>) resultSet.get("emp_cursor");}}
매퍼 클래스 [EmpMapper.java]package edu.onj.function; import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.jdbc.core.RowMapper;public class EmpMapper implements RowMapper<Emp> {@Overridepublic Emp mapRow(ResultSet rs, int rowNum) throws SQLException {Emp emp = new Emp();emp.setEmpno(rs.getString("empno"));emp.setEname(rs.getString("ename"));emp.setSal(rs.getString("sal"));return emp;}}
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
XML 설정 파일 [src/main/resources/jd-bc.xml]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- Initialization for data source --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value></property><property name="url">
<value>jdbc:oracle:thin:@192.168.0.27:1521:onj</value></property><property name="username">
<value>scott</value>
</property><property name="password">
<value>tiger</value></property>
</bean> <bean id="empDao" class=" edu.onj.function.Emp-DaoImpl"> <property name="dataSource" ref="dataSource" /> </bean> </beans>
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
클라이언트 main 함수 [JdbcClient.java]
package edu.onj.function;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.support.GenericXmlApplication-
Context;
public class JdbcClient {
public static void main(String[] args) {
GenericXmlApplicationContext ctx = new GenericXmlApplicationCon-
text();
ctx.load("jdbc.xml");
ctx.refresh();
EmpDaoImpl empDao = (EmpDaoImpl)ctx.getBean("empDao");
//1. EMP TABLE 에서 부서코드가 10 인 데이터 추출List<Emp> emps = empDao.listEmp(10);System.out.println("------------------ all select ------------------");for (Emp emp : emps) {System.out.println("empno-->" + emp.getEmpno());System.out.println("ename-->" + emp.getEname());System.out.println("sal -->" + emp.getSal());}emps.clear(); //2. BatchPreparedStatementSetter 를 이용하여 List 에 있는 것을 일괄 Insert emps.add(new Emp("9701", "1001 길동 ", "10010"));emps.add(new Emp("9702", "1002 길동 ", "10020"));emps.add(new Emp("9703", "1003 길동 ", "10030"));emps.add(new Emp("9704", "1004 길동 ", "10040"));emps.add(new Emp("9705", "1005 길동 ", "10050"));empDao.createEmpList(emps); //3.spring JDBC SimpleJdbcCall 을 이용한 오라클 함수 (ref cursor 리턴 ) 호출을 통한 10 번 부서 EMP 추출ArrayList<Emp> emps2 = (ArrayList<Emp>)empDao.listEmp(new Integer(10));for(Emp e: emps2) {System.out.println(e.getEmpno() + ":" + e.getEname() + ":" + e.getSal());}ctx.close();}}
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
위 예제의 listEmp() 메소드를 기존 자바 JDBC 의 CallableStatementCallback 을 이용한 방식으로 변경하면 다음과 같다 .
@Overridepublic List<Emp> listEmp2(final Integer deptno){
CallableStatementCallback<List<Emp>> cb = new CallableStatementCallback<List<Emp>>() {
@Overridepublic List<Emp> doInCallableStatement(CallableStatement cs)
throws SQLException, DataAccessException {cs.registerOutParameter(1, OracleTypes.CURSOR);cs.setInt(2, deptno);cs.execute();ResultSet rs = (ResultSet) cs.getObject(1);
List<Emp> emps = new ArrayList<Emp>();EmpMapper mapper = new EmpMapper();
for (int i = 0; rs.next(); i++) {emps.add(mapper.mapRow(rs, i));
}
return emps;}};
return jdbcTemplate.execute("{? = call getEmp(?)}", cb);}
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-5. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
재사용 가능한 SQL Update 구문을 생성하며 , 이를 위해 SqlUpdate 클래스를 상속받아서 구현해야 한다 . SqlUpdate 를 상속받은 하위 클래스의 생성자에서 SQL 쿼리 구문 (DML : insert, update, delete), 파라미터를 생성하고
compile() 메소드를 호출하여 컴파일 한다 . 마지막으로 update() 메소드를 호출하여 해당 DML 쿼리를 실행한다 .
public class PersonUpdate extends SqlUpdate { public PersonUpdate(final DataSource ds) { setDataSource(ds);//SqlUpdate 의 메소드 호출 setSql("update Person set firstname = ?, lastname = ? where id = ?"); //SqlUpdate 메소드호출 declareParameter(new SqlParameter(Types.VARCHAR)); //SqlUpdate 메소드호출 declareParameter(new SqlParameter(Types.VARCHAR)); declareParameter(new SqlParameter(Types.INTRGER)); compile(); //SqlUpdate 의 메소드 호출 }
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-5. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate
//update 구문 실행
public int run(final Person person) { Object[] params = new Object[] { person.getFirstName(), person.getLastName(), person.getId()}; return update(params); }}
public class PersonInsert extends SqlUpdate { public PersonInsert(final DataSource ds) { setDataSource(ds); setSql("insert into Person(id, firstname, lastname) values(?, ?, ?)"); declareParameter(new SqlParameter(Types.INTEGER)); declareParameter(new SqlParameter(Types.VARCHAR)); declareParameter(new SqlParameter(Types.VARCHAR)); compile(); } // insert 구문 실행 public int run(final Person person) { Object[] params = new Object[] { pserson.getId(), person.getFirstName(), person.getLastName()}; return update(params); }}
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-6. Spring JDBC 에서 DB 접근하는 방법 – StoredProcedure
Spring JDBC 의 StoredProcedure 를 상속받아서 서버쪽의 저장함수나 프러시저에 접근 가능하다 .
[Emp.java]package edu.onj.function2;public class Emp {private String empno;private String ename;private String sal;public Emp() {}public Emp(String empno, String ename, String sal) {this.empno = empno;this.ename = ename;this.sal = sal;}public void setEmpno(String empno) {this.empno = empno;} public void setEname(String ename) {this.ename = ename;}
[Emp.java] 이어서public void setEname(String ename) {this.ename = ename;}public void setSal(String sal) {this.sal = sal;}public String getEmpno() {return empno; public String getEname() {return ename;}public String getSal() {return sal;}}
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-6. Spring JDBC 에서 DB 접근하는 방법 – StoredProcedure
Spring JDBC 의 StoredProcedure 를 상속받아서 서버쪽의 저장함수나 프러시저에 접근 가능하다 .
[EmpDao.java]package edu.onj.function2; import java.util.List;import javax.sql.DataSource;public interface EmpDao {public void setDataSource(DataSource ds);public List<Emp> listEmp(Integer deptno);}
[EmpMapper.java]package edu.onj.function2; import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.jdbc.core.RowMap-per;public class EmpMapper implements RowMap-per<Emp> {@Overridepublic Emp mapRow(ResultSet rs, int rowNum) throws SQLException {Emp emp = new Emp();emp.setEmpno(rs.getInt("empno"));emp.setEname(rs.getString("ename"));emp.setSal(rs.getInt("sal"));return emp;}}
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-6. Spring JDBC 에서 DB 접근하는 방법 – StoredProcedure
Spring JDBC 의 StoredProcedure 를 상속받아서 서버쪽의 저장함수나 프러시저에 접근 가능하다 .
[EmpJDBCTemplate.java]package edu.onj.function2; import java.sql.Types;import java.util.*;import javax.sql.DataSource;import oracle.jdbc.OracleTypes;import org.springframework.jdbc.core.SqlOutParameter;import org.springframework.jdbc.core.SqlParameter;import org.springframework.jdbc.object.StoredProcedure;public class EmpJDBCTemplate extends StoredProcedure implements EmpDao {private DataSource dataSource;private static final String SQL = "getEmp";public EmpJDBCTemplate(DataSource dataSource) {super(dataSource, SQL);setFunction(true);declareParameter(new SqlOutParameter("emp_cursor", OracleType-s.CURSOR, newEmpMapper()));declareParameter(new SqlParameter("v_deptno", Types.INTEGER));} @Overridepublic List<Emp> listEmp(Integer deptno) {Map<String, Object> resultSet = execute(deptno);ArrayList<Emp> list = (ArrayList) resultSet.get("emp_cursor");return list;}}
[JdbcClient.java]package edu.onj.function2; import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import onj.edu.jdbc1.Customer;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlAppli-cationContext;public class JdbcClient {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("jdbc2.xml");EmpJDBCTemplate empJDBCTemplate =(EmpJDBCTemplate)ctx.getBean("empJDBCTemplate");ArrayList<Emp> list = new ArrayList<Emp>();list = (ArrayList<Emp>) empJDBCTemplate.listEmp(20);for (Emp emp:list){System.out.println("empno --> "+emp.getEmpno()+"ename --> "+emp.getEname()+" sal --> "+emp.getSal() );}}}
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-6. Spring JDBC 에서 DB 접근하는 방법 – StoredProcedure
[jdbc2.xml]<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" de-stroymethod="close"><property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property><property name="url"><value>jdbc:oracle:thin:@192.168.0.27:1521:onj</value></property><property name="username"><value>scott</value></property><property name="password"><value>tiger</value></property></bean> <bean id="empJDBCTemplate" class=" edu.onj.function2.EmpJDBCTemplate"><constructor-arg ref="dataSource"/></bean></beans>
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer
DataFieldMaxValueIncrementer 인터페이스는 DB 테이블의 칼럼값을 MAX VALUE 까지 자동증분 하기 위한 용도로 사용되는 스프링의 인터페이스 이다 . 오라클 DB 라면 시퀀스를 스프링에서 사용할 수 있게 해 준다 .
인터페이스의 구조는 다음과 같다 .
public interface DataFieldMaxValueIncrementer {public int nextIntValue() throws DataAccessException; public long nextLongValue() throws DataAccessException; public String nextStringValue() throws DataAccessExcep-tion;}
스프링배치에서는 기본적으로 , Oracle, DB2, Derby, Hsql, Mysql, Postgres, MS-SQL Server, Sybase 등의 주요 DB 에 대한 DataFieldMaxValueIncrementer 의 구현 클래스가 제공되고 있다 .
사용절차는 다음과 같다 .
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer
1. Spring 설정파일에서 사용할 incrementer 에 대해 정의DB2 는 SequenceMaxValueIncrementer, MySQL 은 MySQLMaxValueIncrementer, PostgreSQL 이라면 Post-greSQLSequenceMaxValueIncrementer, 오라클인 경우 OracleSequenceMaxValueIncrementer 를 사용한다 .
<bean id="incrementer" class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer"> <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="incrementerName"> <value>SEQ_SID</value> <!– 오라클에 만들어 놓은 시퀀스 이름 - </property></bean>
2. Insert SQL 문을 실행하는 부분에서 정의된 incrementer 사용
private DataFieldMaxValueIncrementer incrementer; public void setIncrementer(DataFieldMaxValueIncrementer incrementer) { this.incrementer = incrementer;}….String strQuery = "INSERT INTO BOARD VALUES ( ?, ?, ?, ?, ?, sysdate) ";int currentSid =new Integer(incrementer.nextIntValue());
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer
사용 예제1. [CustomerDao.java]
package onj.edu.jdbc1; import java.util.List; import javax.sql.DataSource; public interface CustomerDAO { public void setDataSource(DataSource ds); public void create(Integer id, String name, Integer age); public Customer getCustomer(Integer id); public List<Customer> listCustomer(); public void delete(Integer id); public void update(Integer id, Integer age); }
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer
사용 예제2. [CustomerJDBCTemplate.java]
package onj.edu.jdbc1; import java.util.List;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer; public class CustomerJDBCTemplate implements CustomerDAO {
private DataSource dataSource;private JdbcTemplate jdbcTemplate;private DataFieldMaxValueIncrementer incrementer;
public void setIncrementer(DataFieldMaxValueIncrementer incrementer) {
this.incrementer = incrementer;}
public void setDataSource(DataSource ds) {
this.dataSource = ds;this.jdbcTemplate = new JdbcTemplate(ds);
}
public void create(Integer id, String name, Integer age) {String SQL = "insert into customer(id, name, age) values (?, ?, ?)";jdbcTemplate.update(SQL, new Integer(incrementer.nextIntValue()), name, age);System.out.println("<<<Customer insert ok ::: " + name + "," + age);
}
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer
사용 예제2. [CustomerJDBCTemplate.java]
public Customer getCustomer(Integer id) {String SQL = "select * from customer where id = ?";Customer customer = jdbcTemplate.queryForObject(SQL, new Object[] { id }, new Cus-
tomerMapper());return customer;
}
public List<Customer> listCustomer() {String SQL = "select * from customer";List<Customer> customer = jdbcTemplate.query(SQL, new CustomerMapper());return customer;
}
public void delete(Integer id) {String SQL = "delete from customer where id = ?";jdbcTemplate.update(SQL, id);System.out.println("<<< customer delete ok ::: id = " + id);
}
public void update(Integer id, Integer age) {String SQL = "update customer set age = ? where id = ?";jdbcTemplate.update(SQL, age, id);System.out.println("<<< customer update ok ::: id = " + id);
} }
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer
사용 예제3. [CustomerMapper.java]
package onj.edu.jdbc1;
import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.jdbc.core.RowMapper; public class CustomerMapper implements RowMapper<Customer>{ @Override public Customer mapRow(ResultSet rs, int arg1) throws SQLException { Customer customer = new Customer(); customer.setId(rs.getInt("id")); customer.setName(rs.getString("name")); customer.setAge(rs.getInt("age")); return customer; } }
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer
사용 예제4. [jdbc3.xml]
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframe-work.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:util="http://
www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframe-
work.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/
schema/aop/spring-aop-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/
schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/
schema/jdbc/spring-jdbc-4.2.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/
schema/util/spring-util-4.2.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value></property><property name="url">
<value>jdbc:oracle:thin:@192.168.0.27:1521:onj</value></property><property name="username">
<value>scott</value></property>
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer
사용 예제4. [jdbc3.xml]
<property name="password">
<value>tiger</value></property>
</bean><bean id="customerJDBCTemplate" class="onj.edu.jdbc1.CustomerJDBCTemplate">
<property name="dataSource" ref='dataSource'></property><property name="incrementer" ref = "incrementer"></property>
</bean><bean id="incrementer"
class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer"><property name="dataSource">
<ref bean="dataSource" /></property><property name="incrementerName">
<value>SEQ_SID</value> <!-- 오라클에 만들어 놓은 시퀀스 이름 --></property>
</bean></beans>
4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer
사용 예제5. [JdbcClient.java]
package onj.edu.jdbc1;
import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class JdbcClient { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("jdbc3.xml");
CustomerJDBCTemplate jdbcTemplate = (CustomerJDBCTemplate)ctx.getBean("customerJDBCTemplate");
jdbcTemplate.create(4, "4 길동 ", 4); jdbcTemplate.create(5, "5 길동 ", 5); jdbcTemplate.create(6, "6 길동 ", 6);
List <Customer> customers = jdbcTemplate.listCustomer(); System.out.println("------------------ all select ------------------"); for(Customer customer:customers){ System.out.println("id ----> "+customer.getId()); System.out.println("name ----> "+customer.getName()); System.out.println("age ----> "+customer.getAge()); } jdbcTemplate.update(4, 99);
Customer customer = jdbcTemplate.getCustomer(4); System.out.println("--------- 변경된 4 번 데이터 -------------"); System.out.println("id ----> "+customer.getId()); System.out.println("name ----> "+customer.getName()); System.out.println("age ----> "+customer.getAge());
+ 이어서jdbcTemplate.delete(5); customers = jdbcTemplate.listCustomer(); System.out.println("--------- 5 번 삭제 후 ----------"); for(Customer customer1:customers){ System.out.println("id ----> "+customer1.getId()); System.out.println("name ----> "+customer1.getName()); System.out.println("age ----> "+customer1.getAge()); } }
Any Questions ?
THANK YOU FOR YOUR ATTENTION
무료국비지원교육 / 구로자바학원 _ 탑크리에듀 교육센터 http://www.-topcredu.co.kr