스프링프레임워크 & 마이바티스
(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. 적당히 압축을 풀자. (c\java\ 아래)
압축을 출고 bin 폴더를 홖경변수에서 path에 추가하자. (C:\java3\apache-maven-
3.3.3\bin)
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-ecommerce\mariadb-10.1.10-winx64\bin\mysq
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);
}