본문 바로가기

스프링 Spring

Spring JDBC 21. 03. 31.

스프링 프레임워크에서 datasource) 얻는 방법 - DBCP 이용

commons DBCP.jar, commons-pool.jar 필요! (메이븐에서 링크 가져오자.)
+ 오라클 경로에서 ojdbc6.jar도 라이브러리에 추가
Spring Jdbc도 메이븐에서 가져오고, pom.xml에서 version을 ${spring-framework.verson}으로 해주기. 

 

package site.levinni.jdbc1;

 

Student.java

package site.levinni.jdbc1;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
	private Integer studno;
	private String name;
	private Integer deptno;
	private Integer profno;
}
null값이 올 수 있기 때문에(studno는 pk라 not null이지만) int 타입대신 Integer 사용! ->참조자료형 사용
int로 하면 null 대신 0이 들어감.

 

 

StudentDao.java

package site.levinni.jdbc1;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import lombok.Setter;

@Setter
public class StudentDao {
	//CRUD
	private JdbcTemplate template;
	
	public Student findBy(int studno) {
		return template.queryForObject(
				"SELECT STUDNO, NAME, DEPTNO, PROFNO FROM STUDENT WHERE STUDNO = ?", 
				new Object[] {studno}, new RowMapper<Student>(){

					@Override
					public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
						// TODO Auto-generated method stub
						Student student = new Student();
						student.setStudno(rs.getInt(1));
						student.setName(rs.getString(2));
						student.setDeptno(rs.getInt(3));
						student.setProfno(rs.getInt(4));
						return student;
					}
					
				});
	}
	public List<Map<String, Object>> list() {
		return template.queryForList("SELECT * FROM STUDENT");
	}

	public List<Student> list2(){
		return template.query(
				"SELECT STUDNO, NAME, DEPTNO, PROFNO FROM STUDENT", 
				new RowMapper<Student>(){

					@Override
					public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
						// TODO Auto-generated method stub
						Student student = new Student();
						student.setStudno(rs.getInt(1));
						student.setName(rs.getString(2));
						student.setDeptno(rs.getInt(3));
						student.setProfno(rs.getInt(4));
						return student;
					}
					
				});
//		return template.queryForList("SELECT STUDNO, NAME, DEPTNO, PROFNO FROM STUDENT", Student.class);
	}
	public int Write(Student student) {
		return template.update("INSERT INTO STUDENT(STUDNO, NAME, DEPTNO, PROFNO) VALUES (?,?,?,?)",
				student.getStudno(), student.getName(), student.getDeptno(), student.getProfno());
	}
	
	public String getTimeNow() {
		return template.queryForObject("SELECT SYSDATE FROM DUAL", String.class);
	}
	
}
단일 행 추가기 때문에 int 타입으로! 해봄.
List의 제네릭을 vo의 타입으로 받고 SELECT 절로 받아온 열의 항목들을 VO 타입으로 바인딩 해 줌.
(이 코드에선 STUDNO, NAME, DEPTNO, PROFNO을 Student 타입으로 바인딩해줘서 return student;에 연결 됨.

 

 

StudentApp.java

package site.levinni.jdbc1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StudentApp {
	// 빈을 통한 접근 >> dao
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("jdbc1.xml");
		StudentDao dao = ctx.getBean("dao", StudentDao.class);
		System.out.println(dao.findBy(10102));
		
		dao.list().forEach(System.out::println);
		System.out.println("===절취선===");
//		dao.Write(new Student(30303, "가가가", 101, 9901));
		dao.list().forEach(System.out::println);
		System.out.println("===절취선===");
		System.out.println(dao.getTimeNow());
	}
	
}

 

오라클 STUDENT 계정에 있던 학생 정보들이 나옴!!

 

 

jdbc1.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 class="site.levinni.jdbc1.StudentDao" id="dao">
		<property name="template" ref="jdbcTemplate"/>
	</bean>
	<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource">
		<property name="driverClassName">
			<value>oracle.jdbc.driver.OracleDriver</value>
		</property>
		<property name="url">
			<value>jdbc:oracle:thin:@localhost:1521/xe</value>
		</property>
		<property name="username">
			<value>student</value>
		</property>
		<property name="password">
			<value>1234</value>
		</property>
	</bean>
</beans>

 


ORM(Object-relational mapping)

- 객체와 관계와의 설정. => 관계형 데이터베이스를 의미

- 생성한 객체를 영구적으로 저장하기 위해 파일이나 DB에 연결. 즉 DB의 테이블에 저장한다는 것.

- 테이블에 객체가 가지고있던 정보를 입력하고, 이 테이블들을 SQL 질의어를 통해 관계 설정을 해주는데, 

여기서 문제는 이 테이블과 객체간의 이질성이 발생한다는 것임.

- 본질적인 목적! : vo에 있는 내용들을 테이블에 쉽게 담자!! 

MyBatis

'스프링 Spring' 카테고리의 다른 글

21. 04. 02.  (0) 2021.04.03
21. 04. 01.  (0) 2021.04.01
AOP 끝 21. 03. 31.  (0) 2021.03.31
AOP 21. 03. 30.  (0) 2021.03.30
IoC 21. 03. 29.  (0) 2021.03.29