스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis) 4-3. Spring JDBC에서 DB 접근하는 방법  JdbcTemplate : 젂형적인 Spring JDBC 접근법으로 SQL을 실행하며 자주 사용된다.  NamedParameterJdbcTemplate : 젂형적인 JDBC의 ?(Placeholder) 대신에 이름있는 바인딩 파 라미터를 제공하기 위한 것이다.  SimpleJdbcTemplate : JdbcTemplate + NamedParameterJdbcTemplate  SimpleJdbcInsert : 최소한의 구성으로 Insert가 가능하도록 지원하며 DataSource를 가짂 클래 스를 인스턴스한 직후 withTableName 메소드를 불러 테이블 이름을 지정해야 한다.  SimpleJdbcCall : 최소한의 설정으로 데이터베이스 내에 저장된 저장 프로시저, 함수 등을 호 출하도록 지원한다.  SqlUpdate : 재사용 가능한 SQL DML(insert, update, dalete) 구문을 생성한다.  StoredProcedure : RDB의 저장 프로시저에 대한 추상 수퍼 클래스, 다양한 execute 메소드를 제공한다. 4-3-1. Spring JDBC에서 DB 접근하는 방법 – jdbcTemplate  모든 형태의 SQL 구문을 실행해서 원하는 결과 타입을 반홖한다.  스프링의 모든 데이터 접근 프레임워크는 템플릿 클래스를 포함하는데 이 경우 템플릿 클래 스는 JdbcTemplate 클래스이다.  JdbcTemplate 클래스가 작업하기 위해 필요한 것은 DataSource 이며 스프링의 모든 DAO 템 플릿 클래스는 스레드에 안젂하기 때문에 애플리케이션 내의 각각의 DataSource에 대해서 하나의 JdbcTemplate 인스턴스만을 필요로 한다. public class StudentDao { private JdbcTemplate jdbcTemplate; public void setJdbcTeamplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; }//: }///~
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean> <bean id=“studentDao" class="oraclejava.training.jdbc.StudentDao"> <property name="jdbcTemplate"> <ref bean="jdbcTemplate"/> </property> </bean> <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> 4-3-1-1. Maven, Gradle에서 오라클 설정  그래들 설정 1. 메이븐 로컬 레포지터리에 오라클 JDBC Driver 설치를 위한 메이븐을 설치하자. https://maven.apache.org/download.cgi 에서 binary zip 파일을 다운받자. (apache-maven- 3.3.3-bin.zip) 2. 적당히 압축을 풀자. (cjava 아래) 압축을 출고 bin 폴더를 홖경변수에서 path에 추가하자. (C:java3apache-maven- 3.3.3bin) 3. Oracle JDBC Driver를 다운받자. http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html (오라클 11g용 ojdbc6.jar)
4. 다운받은 폴더에서 CMD로 도스창을 띄운 후 아래 명령을 실행하여 로컬 메이븐 레포지터 리에 저장하자. mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.4 - Dpackaging=jar -Dfile=ojdbc6.jar -DgeneratePom=true 5. build.grdle을 작성 apply plugin : 'java' apply plugin : 'application' mainClassName = "onj.edu.jdbc.JdbcClient" dependencies { compile 'org.springframework:spring-context:4.2.4.RELEASE' compile 'org.springframework:spring-jdbc:4.2.4.RELEASE' runtime 'commons-dbcp:commons-dbcp:1.2.2' runtime 'com.oracle:ojdbc6:11.2.0.4' } repositories { mavenCentral() mavenLocal() }  메이븐 설정 <dependencies> …… <!-- DBCP --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.2.2</version> </dependency> <!-- ORACLE --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.1.0.7.0</version> </dependency> ……
</dependencies> <repositories> <repository> <id>oracle</id> <name>ORACLE JDBCRepository</name> <url>http://maven.jahia.org/maven2</url> </repository> </repositories> 4-3-1-2. 마리아DB 및 HeidiSQL 설치 1. https//download.mariadb.org에 접속 후 “Download 10.1.10 Stable Now!”를 클릭 2. 자신의 홖경에 맞는 파일을 다운로드 한다.
3. 적당한 경로에 압축을 풀고 bin 폴더로 가서 인스톨 하자.(관리자 권한으로 CMD 실행할 것, datadir : DB설치경로, service : 서비스이름, password : root 비밀번호) 압축푼경로bin>mysql_install_db --datadir=DB설치경로 --service=MySQL --password=1111 Running bootstrap 2016-05-02 9:45:28 7540 [Note] D:dev-ecommercemariadb-10.1.10-winx64binmysq ld.exe (mysqld 10.1.10-MariaDB) starting as process 7568 ... Removing default user Setting root password Creating my.ini file Registering service 'MySQL' Creation of the database was successfull 4. 원도우 서비스에 보면 MySQL 이라는 서비스가 떠 있을 것이다.
5. 한글 사용을 위해 DB설치경로 아래 my.ini 파일을 열어 수정하자. [mysqld] datadir= DB설치경로 [client] default-character-set = utf8 [mysqld] init_connect = SET collation_connection = utf8_general_ci init_connect = SET NAMES utf8 character-set-server = utf8 collation-server = utf8_general_ci [mysqldump] default-character-set = utf8 [mysql] default-character-set = utf8 6. MySQL 서비스 시작 압축푼경로bin>sc start MySQL 7. DB에 접속해서 데이터 등을 확인하기 위해 클라이언트도 설치하자. http://www.heidisql.com/download.php에 접속하여 HeidiSQL을 설치하자.
설치파일을 실행하면 HeidiSQL이 설치되며 실행한 후 신규 버튼을 클릭 후 root비번(“1111”)을 입 력하면 접속된다. 4-3-1-3. 간단한 Spring JDBC jdbcTemplate 예제  마리아DB에서 EMP 테이블의 데이터를 Spring JDBC의 JdbcTemplate을 이용하여 화 면에 출력하는 갂단한 예제를 작성해 보자.
STS에서 File -> New -> Project -> Spring Legacy Project Project name : jdbc1 Simple Spring Maven 선택 Finish 클릭 [마리아DB 및 데이터소스 사용을 위해 pom.xml에 다음 의존성을 추가] <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring-framework.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> <scope>runtime</scope> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> [HeidiSQL에서 jdbc1 이라는 데이터베이스와 EMP 테이블 및 데이터를 생성하자.]
create table emp ( empno int(4) not null auto_increment, ename varchar(50), sal int(4), primary key (empno) ) ENGINE=InnoDB; insert into emp(ename, sal) values ('1길동', 1000); insert into emp(ename, sal) values ('2길동', 2000); insert into emp(ename, sal) values ('3길동', 3000); [EmpDao.java] package jdbc; import java.util.List; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate;
public class EmpDao { private DataSource dataSource; private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; this.jdbcTemplate = new JdbcTemplate(dataSource); } List getNames() { String sql = "select * from emp"; return jdbcTemplate.queryForList(sql); } } [src/main/resources/app-jdbc.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.xsd"> <bean id="EmpDao" class="jdbc.EmpDao"> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost/jdbc1</value> </property> <property name="username"> <value>root</value>
</property> <property name="password"> <value>1111</value> </property> </bean> </beans> [JdbcClient.java] package jdbc; import org.springframework.context.support.GenericXmlApplicationContext; import org.springframework.core.io.FileSystemResource; public class JdbcClient { public static void main(String[] args) { GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); ctx.load("app-jdbc.xml"); ctx.refresh(); EmpDao e = (EmpDao)ctx.getBean("EmpDao"); System.out.println(e.getNames()); ctx.close(); } } 4-3-1-4. Spring JDBC 내부 콜백(PreparedStatementCreator, PreparedStatementSetter)  PreparedStatementCreator //이 인터페이스는 다음과 같은 하나의 메소드를 제공한다. public PreparedStatement createPreparedStatement(Connection con) throws SQLException; //JdbcTemplate이 아래 클래스를 호출할 때 실행된 SQL로그를 남긴다.
//SqlProvider는 getSql() 이라는 메소드를 제공, SQL문자열을 JdbcTemplate에서 사용가능하도록 제공한다. public class InsertPersonStatementCreator implements PreparedStatementCreator, SqlProvider { private String sql = “INSERT INTO ( id, firstname, lastname) VALUES ( ? , ? ?)”; public PreparedStatement createPreparedStatement(Connection con) .. return con.preparedStatement(sql); }//: public String getSql() { return sql; } }  PreparedStatementSetter //이 인터페이스는 SQL 파라미터를 Setting하는 메소드를 제공한다. void setValues(PreparedStatement ps) throws SQLException; private Person person; public void setVales(PreparedStatement ps) throws SQLException { ps.setInt (1, person.getId().intValue()); ps.setString (2, person.getFirstName()); ps.setString (3, person.getLastName()); } … 4-3-1-5. jdbcTemplate의 execute 메소드  대개 SQL문자열로 부터 PreparedStatement를 생성하고 파라미터를 바인딩 하는 작업을 많이 하므로 JdbcTemplate은 execute 메소드를 제공한다.  주로 DDL 처리용으로 아래와 같은 경우 백그라운드에서 JdbcTemplate이 PreparedStatement 와 PreparedStatementSetter를 생성 시킨다. public int insertPerson(Person person) { String sql = “insert into person (id, firstname, lastname) values (?,?,?)”; Object[] params = new Object[] { person.getId(), person.getFirstName(),
person.getLastName() }; return jdbcTemplate.execute(sql, params); }

(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)

  • 1.
    스프링프레임워크 & 마이바티스 (SpringFramework, MyBatis) 4-3. Spring JDBC에서 DB 접근하는 방법  JdbcTemplate : 젂형적인 Spring JDBC 접근법으로 SQL을 실행하며 자주 사용된다.  NamedParameterJdbcTemplate : 젂형적인 JDBC의 ?(Placeholder) 대신에 이름있는 바인딩 파 라미터를 제공하기 위한 것이다.  SimpleJdbcTemplate : JdbcTemplate + NamedParameterJdbcTemplate  SimpleJdbcInsert : 최소한의 구성으로 Insert가 가능하도록 지원하며 DataSource를 가짂 클래 스를 인스턴스한 직후 withTableName 메소드를 불러 테이블 이름을 지정해야 한다.  SimpleJdbcCall : 최소한의 설정으로 데이터베이스 내에 저장된 저장 프로시저, 함수 등을 호 출하도록 지원한다.  SqlUpdate : 재사용 가능한 SQL DML(insert, update, dalete) 구문을 생성한다.  StoredProcedure : RDB의 저장 프로시저에 대한 추상 수퍼 클래스, 다양한 execute 메소드를 제공한다. 4-3-1. Spring JDBC에서 DB 접근하는 방법 – jdbcTemplate  모든 형태의 SQL 구문을 실행해서 원하는 결과 타입을 반홖한다.  스프링의 모든 데이터 접근 프레임워크는 템플릿 클래스를 포함하는데 이 경우 템플릿 클래 스는 JdbcTemplate 클래스이다.  JdbcTemplate 클래스가 작업하기 위해 필요한 것은 DataSource 이며 스프링의 모든 DAO 템 플릿 클래스는 스레드에 안젂하기 때문에 애플리케이션 내의 각각의 DataSource에 대해서 하나의 JdbcTemplate 인스턴스만을 필요로 한다. public class StudentDao { private JdbcTemplate jdbcTemplate; public void setJdbcTeamplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; }//: }///~
  • 2.
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <propertyname="dataSource"> <ref bean="dataSource"/> </property> </bean> <bean id=“studentDao" class="oraclejava.training.jdbc.StudentDao"> <property name="jdbcTemplate"> <ref bean="jdbcTemplate"/> </property> </bean> <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> 4-3-1-1. Maven, Gradle에서 오라클 설정  그래들 설정 1. 메이븐 로컬 레포지터리에 오라클 JDBC Driver 설치를 위한 메이븐을 설치하자. https://maven.apache.org/download.cgi 에서 binary zip 파일을 다운받자. (apache-maven- 3.3.3-bin.zip) 2. 적당히 압축을 풀자. (cjava 아래) 압축을 출고 bin 폴더를 홖경변수에서 path에 추가하자. (C:java3apache-maven- 3.3.3bin) 3. Oracle JDBC Driver를 다운받자. http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html (오라클 11g용 ojdbc6.jar)
  • 3.
    4. 다운받은 폴더에서CMD로 도스창을 띄운 후 아래 명령을 실행하여 로컬 메이븐 레포지터 리에 저장하자. mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.4 - Dpackaging=jar -Dfile=ojdbc6.jar -DgeneratePom=true 5. build.grdle을 작성 apply plugin : 'java' apply plugin : 'application' mainClassName = "onj.edu.jdbc.JdbcClient" dependencies { compile 'org.springframework:spring-context:4.2.4.RELEASE' compile 'org.springframework:spring-jdbc:4.2.4.RELEASE' runtime 'commons-dbcp:commons-dbcp:1.2.2' runtime 'com.oracle:ojdbc6:11.2.0.4' } repositories { mavenCentral() mavenLocal() }  메이븐 설정 <dependencies> …… <!-- DBCP --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.2.2</version> </dependency> <!-- ORACLE --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.1.0.7.0</version> </dependency> ……
  • 4.
    </dependencies> <repositories> <repository> <id>oracle</id> <name>ORACLE JDBCRepository</name> <url>http://maven.jahia.org/maven2</url> </repository> </repositories> 4-3-1-2. 마리아DB및 HeidiSQL 설치 1. https//download.mariadb.org에 접속 후 “Download 10.1.10 Stable Now!”를 클릭 2. 자신의 홖경에 맞는 파일을 다운로드 한다.
  • 5.
    3. 적당한 경로에압축을 풀고 bin 폴더로 가서 인스톨 하자.(관리자 권한으로 CMD 실행할 것, datadir : DB설치경로, service : 서비스이름, password : root 비밀번호) 압축푼경로bin>mysql_install_db --datadir=DB설치경로 --service=MySQL --password=1111 Running bootstrap 2016-05-02 9:45:28 7540 [Note] D:dev-ecommercemariadb-10.1.10-winx64binmysq ld.exe (mysqld 10.1.10-MariaDB) starting as process 7568 ... Removing default user Setting root password Creating my.ini file Registering service 'MySQL' Creation of the database was successfull 4. 원도우 서비스에 보면 MySQL 이라는 서비스가 떠 있을 것이다.
  • 6.
    5. 한글 사용을위해 DB설치경로 아래 my.ini 파일을 열어 수정하자. [mysqld] datadir= DB설치경로 [client] default-character-set = utf8 [mysqld] init_connect = SET collation_connection = utf8_general_ci init_connect = SET NAMES utf8 character-set-server = utf8 collation-server = utf8_general_ci [mysqldump] default-character-set = utf8 [mysql] default-character-set = utf8 6. MySQL 서비스 시작 압축푼경로bin>sc start MySQL 7. DB에 접속해서 데이터 등을 확인하기 위해 클라이언트도 설치하자. http://www.heidisql.com/download.php에 접속하여 HeidiSQL을 설치하자.
  • 7.
    설치파일을 실행하면 HeidiSQL이설치되며 실행한 후 신규 버튼을 클릭 후 root비번(“1111”)을 입 력하면 접속된다. 4-3-1-3. 간단한 Spring JDBC jdbcTemplate 예제  마리아DB에서 EMP 테이블의 데이터를 Spring JDBC의 JdbcTemplate을 이용하여 화 면에 출력하는 갂단한 예제를 작성해 보자.
  • 8.
    STS에서 File -> New-> Project -> Spring Legacy Project Project name : jdbc1 Simple Spring Maven 선택 Finish 클릭 [마리아DB 및 데이터소스 사용을 위해 pom.xml에 다음 의존성을 추가] <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring-framework.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> <scope>runtime</scope> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> [HeidiSQL에서 jdbc1 이라는 데이터베이스와 EMP 테이블 및 데이터를 생성하자.]
  • 9.
    create table emp ( empnoint(4) not null auto_increment, ename varchar(50), sal int(4), primary key (empno) ) ENGINE=InnoDB; insert into emp(ename, sal) values ('1길동', 1000); insert into emp(ename, sal) values ('2길동', 2000); insert into emp(ename, sal) values ('3길동', 3000); [EmpDao.java] package jdbc; import java.util.List; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate;
  • 10.
    public class EmpDao{ private DataSource dataSource; private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; this.jdbcTemplate = new JdbcTemplate(dataSource); } List getNames() { String sql = "select * from emp"; return jdbcTemplate.queryForList(sql); } } [src/main/resources/app-jdbc.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.xsd"> <bean id="EmpDao" class="jdbc.EmpDao"> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost/jdbc1</value> </property> <property name="username"> <value>root</value>
  • 11.
    </property> <property name="password"> <value>1111</value> </property> </bean> </beans> [JdbcClient.java] package jdbc; importorg.springframework.context.support.GenericXmlApplicationContext; import org.springframework.core.io.FileSystemResource; public class JdbcClient { public static void main(String[] args) { GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); ctx.load("app-jdbc.xml"); ctx.refresh(); EmpDao e = (EmpDao)ctx.getBean("EmpDao"); System.out.println(e.getNames()); ctx.close(); } } 4-3-1-4. Spring JDBC 내부 콜백(PreparedStatementCreator, PreparedStatementSetter)  PreparedStatementCreator //이 인터페이스는 다음과 같은 하나의 메소드를 제공한다. public PreparedStatement createPreparedStatement(Connection con) throws SQLException; //JdbcTemplate이 아래 클래스를 호출할 때 실행된 SQL로그를 남긴다.
  • 12.
    //SqlProvider는 getSql() 이라는메소드를 제공, SQL문자열을 JdbcTemplate에서 사용가능하도록 제공한다. public class InsertPersonStatementCreator implements PreparedStatementCreator, SqlProvider { private String sql = “INSERT INTO ( id, firstname, lastname) VALUES ( ? , ? ?)”; public PreparedStatement createPreparedStatement(Connection con) .. return con.preparedStatement(sql); }//: public String getSql() { return sql; } }  PreparedStatementSetter //이 인터페이스는 SQL 파라미터를 Setting하는 메소드를 제공한다. void setValues(PreparedStatement ps) throws SQLException; private Person person; public void setVales(PreparedStatement ps) throws SQLException { ps.setInt (1, person.getId().intValue()); ps.setString (2, person.getFirstName()); ps.setString (3, person.getLastName()); } … 4-3-1-5. jdbcTemplate의 execute 메소드  대개 SQL문자열로 부터 PreparedStatement를 생성하고 파라미터를 바인딩 하는 작업을 많이 하므로 JdbcTemplate은 execute 메소드를 제공한다.  주로 DDL 처리용으로 아래와 같은 경우 백그라운드에서 JdbcTemplate이 PreparedStatement 와 PreparedStatementSetter를 생성 시킨다. public int insertPerson(Person person) { String sql = “insert into person (id, firstname, lastname) values (?,?,?)”; Object[] params = new Object[] { person.getId(), person.getFirstName(),
  • 13.