Spring에서 db연결을 정리해보고자 한다.
순서대로 예제를 통해 정리하고자 한다.
테이블 생성
우선 db에 사용할 테이블을 생성해준다
=>create table student(
id int not null,
name varchar(20) not null,
age int not null,
primary key(id));
생성 후
desc student 로 확인
pom.xml 확인
pom.xml에 이상이 없는지 확인한다.
특히 jdbc에 관련된 부분이나 오라클 등 관련된 부분 이상없는지 채크한다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.samples</groupId>
<artifactId>SpringTest3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<!-- Generic properties -->
<java.version>1.6</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Spring -->
<spring-framework.version>3.2.3.RELEASE</spring-framework.version>
<!-- Hibernate / JPA -->
<hibernate.version>4.2.1.Final</hibernate.version>
<!-- Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
<!-- Test -->
<junit.version>4.11</junit.version>
</properties>
<!-- 오라클의 다운로드 받을 수 있는 Repository -->
<repositories>
<repository>
<id>oracle</id>
<name>oracle jdbc respository</name>
<url>http://maven.jahia.org/maven2</url>
</repository>
</repositories>
<dependencies>
<!-- Spring and Transactions -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- jdbc에 관련된 외부패키지 (68번줄까지)-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- dbcp(ConnectionPool) or mysql -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>12.1.0.1</version>
</dependency>
</dependencies>
</project>
DTO 생성 => 여기서는 Student.java
jsp의 DTO를 spring에서도 생성한다.
package studentdb;
//String,int->Integer(래퍼클래스)=>DTO or VO이름으로 작성이 가능
public class Student {
private Integer id;//학생번호 //int id를 Integer로 써도 된다.
private Integer age;//나이
private String name;//이름
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
DAO 생성=>여기서는 StudentDAO(인터페이스로 생성)
DAO가 꼭 java가 아닐수있다
인터페이스로도 가능하며 여기서는 인터페이스로 해볼려한다.
다음과 같은 순서로 작성한다.
1. DB연결을 시켜주는 메서드 필요(초기화)
2. insert-> create(Student st);
3. 학생정보-> pk로 검색
4. 학생들 전체 select * from student;
5. 학생정보 삭제
6. 6.학생정보를 수정->update
package studentdb;
//import java.sql.*//Connection.pstmt.stmt.rs
import javax.sql.DataSource;//DB연결할때 필요(JNDI방법 사용시)
import java.util.List;//select할때
//DB연동의 초기화=>Student에 접속->DataSource객체->DB연동 O
public interface StudentDAO {
//1.DB연결을 시켜주는 메서드 필요(초기화)DataSource객체->DB연동 O
public void setDs(DataSource ds);
//2.insert-> create(Student st);
public void create(Integer id,String name,Integer age);
//3.학생정보-> pk로 검색 select * from student where id=1
public Student getStudent(Integer id);//~(int id);
//4.학생들 전체 select * from student;
public List<Student> listStudents();
//5.학생정보 삭제 delete from student where id=2;
public void delete(Integer id);
// update(Student st)
//6.학생정보를 수정->update테이블명 set 필드명=값,,,where 조건식
public void update(Integer id,Integer age);//(int,int)
}
Bean.xml 생성
Bean.xml을 통해
1. DB연결을하고 (driver,url,username,password 설정)
2. 연결시켜서 가져올 빈즈객체를 만든다.
<!--1.DB연결(dataSource) p220~221
driver,url,username,password -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="username" value="scott" />
<property name="password" value="tiger" />
</bean>
<!--2.DB연결시켜서 가져올 수 있는 빈즈객체 --> <!-- ds에 위에 만든 dataSource를 넣는다 -->
<bean id="studentJDBCTemplate" class="studentdb.StudentJDBCTemplate">
<property name="ds" ref="dataSource" />
</bean>
StudentJDBCTemplate 작성
DB접속해서 crud할 수 있는 클래스
예제 내용과 주석 메모를 통해 정리하고자 한다.
package studentdb;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
//DB접속해서 crud할 수 있는 클래스
public class StudentJDBCTemplate implements StudentDAO {
private DataSource ds;//DB접속->Bean.xml에서 가져옴
//접속 후 sql실행=>pstmt와 비슷한 역할
private JdbcTemplate jt; // pstmt
//query()(select),(insert,update,delete)->update() //=> select는 query,나머지 3개는 update
@Override
public void setDs(DataSource ds) {
// TODO Auto-generated method stub
this.ds=ds;
System.out.println("ds=>"+ds);//null->DB설정값 오타 확인
this.jt=new JdbcTemplate(ds);//JdbcTemplate(DB정보객체)
System.out.println("setDS() call(jt->)"+jt);
}
@Override
public void create(Integer id, String name, Integer age) {
// TODO Auto-generated method stub
//형식 jdbcTemplate객체명.update(1.실행시킬sql구문,2.입력받을 값)
String sql="insert into student values(?,?,?)";
jt.update(sql,id,name,age);
System.out.println("create id=>"+id+",name=>"+name+",age=>"+age);
}
//-------------select구문은 따로 RowMapper클래스를 이용해서 호출------------------------
@Override
public Student getStudent(Integer id) {
// TODO Auto-generated method stub
String sql="select * from student where id=?";
/*형식) 반환값=jdbcTemplate객체명.queryForObject
(1.실행시킬 sql구문,매개변수(배열표시),RowMapper객체지정)
*/
StudentRowMapper sm=new StudentRowMapper();
Student st=jt.queryForObject(sql,new Object[] {id},
new StudentRowMapper());
return st;
}
@Override
public List<Student> listStudents() {
// TODO Auto-generated method stub
String sql="select * from student"; //매개변수가 없어서 where 빼버린다
/*형식) 반환값=jdbcTemplate객체명.query // 매개변수가 없으면 query로 바꾼다 (queryForObject에서 query로)
(1.실행시킬 sql구문,RowMapper객체지정) // 매개변수 지운다
*/
//StudentRowMapper sm=new StudentRowMapper();
List<Student> sts=jt.query(sql,new StudentRowMapper());
return sts;
}
//--------------------------------------------------
@Override
public void delete(Integer id) {
String sql="delete from student where id=?";
jt.update(sql,id);
System.out.println("delete id=>"+id);
}
@Override
public void update(Integer id, Integer age) {
String sql="update student set age=? where id=?";
//pstmt.setInt(1,age),pstmt.setInt(2,id)와 같다
jt.update(sql,age,id);
System.out.println("update id=>"+id+",age=>"+age);
}
}
StudentRowMapper.java 생성
위에 내용중에 select구문을 실행하기 위해 작성
RowMapper인터페이스->select구문을 실행(mapRow()호츨->DTO에 담아서 결과를 리턴)
package studentdb;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
//RowMapper인터페이스->select구문을 실행(mapRow()호츨->DTO에 담아서 결과를 리턴)
public class StudentRowMapper implements RowMapper<Student> {
//callBack메서드=>내부적으로 자동적으로 호출해주는 메서드
//1.mapRow(1.ResultSet객체를 반환 2.검색된 레코드갯수=>갯수만큼 for돌려서반환)
@Override //jsp의 ResultSet
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
// TODO Auto-generated method stub
System.out.println("mapRow() call(rowNum)=>"+rowNum);
//while(rs.next()){담아주는 구문} <=jsp에선
Student st=new Student();//DTO객체생성=>검색된갯수만큼 담기
st.setId(rs.getInt("id"));
st.setName(rs.getString("name"));
st.setAge(rs.getInt("age"));
return st;//query()의 반환값으로 전달받을 수 있다.
}
}
MainApp.java 생성(실행시키는 페이지)
다음과 같은 순으로 작성하고자 한다.
package studentdb;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.xml파일을 메모리에 로딩
ApplicationContext context=
new ClassPathXmlApplicationContext("/studentdb/Bean.xml");
//2.xml->getBean(id 또는 name값) =>studentJDBCTemplate를 불러오면 연결가능 (이건 바로위에 db연동하는것을 포함한것이기떄문)
StudentJDBCTemplate st=(StudentJDBCTemplate)
context.getBean("studentJDBCTemplate");
System.out.println("st=>"+st);
st.create(1,"홍길동",23); //pk가 충돌->무결성 제약조건
st.create(2,"테스트",34); //34->37
st.create(3,"박영진",45);
st.create(4,"임시",22); //id가 4번인 데이터
st.create(5,"테스트2",32);
System.out.println("전체 레코드 검색중...");
List<Student> sts=st.listStudents();//RowMapper에서(5번호출)
for(Student re:sts) {//for(객체자료형 객체명:컬렉션객체명)
System.out.println("id=>"+re.getId());//=> el문으로바꾸면 ${re.id}
System.out.println("name=>"+re.getName());
System.out.println("age=>"+re.getAge());
}
//수정
st.update(2,37); //id가 2번인 데이터를 찾아서 나이를 37로 변경
//삭제
System.out.println("삭제시킬 Record 번호는 4번");
st.delete(4);//내부적으로 update()호출 =>(insert,update,delete는 전부 update를 호출)
//5번인 데이터를 검색하기
Student re=st.getStudent(5);//select * from student where id=5
System.out.println("id=>"+re.getId());//=> el문으로바꾸면 ${re.id}
System.out.println("name=>"+re.getName());
System.out.println("age=>"+re.getAge());
}
}
사실 요즘은 이 방법보단 마이바티스를 자주쓴다.
그래도 기본이 튼튼해야하니 정리한다.
2022-08-22