2024. 2. 8. 18:18ㆍDaily Codig Reminder
기존방법
4가지 정보 ⇒ connection 연결 ⇒ prepare
스프링 db연결
4가지 propertity 파일저장 ⇒ 4가지 정보를 저장한 datasource
connection pool (커넥션 관리해주는 클래스 ): 커넥선 풀에서 커넥션을 얻어서 사용,
커넥션 사용 후 반납, 다른 커넥션에서 재사용할 수 있게 해줌
jdbc dependency 추가하고 maven확인 alt + f5
<!-- https://mvnrepository.com/artifact/com.jslsolucoes/ojdbc6 -->
<dependency>
<groupId>com.jslsolucoes</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
sql table 만들기
create table test
( num number(4) primary key,
username varchar2(10),
address varchar2(10) );
insert into test values ( 1, '홍길동' , '서울');
insert into test values ( 2, '이순신' , '전라');
insert into test values ( 3, '유관순' , '서울');
insert into test values ( 4, '강감찬' , '서울');
insert into test values ( 5, '유재석' , '서울');
commit;
dao
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.sql.Connection;
public class TestDAO {
//jdbc
String driver="oracle.jdbc.driver.OracleDriver";
String url ="jdbc:oracle:thin:@localhost:1521:xe";
String userid = "scott";
String passwd = "tiger";
public TestDAO() {
try {
Class.forName(driver);
System.out.println("드라이버 로딩성공~~~");
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<TestDTO> select(){
ArrayList<TestDTO> list = new ArrayList<TestDTO>();
Connection con = null;
PreparedStatement pstmt= null;
ResultSet rs =null;
try {
con = DriverManager.getConnection(url, userid, passwd);
String sql = "select * from test";
pstmt= con.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
int n = rs.getInt("num");
String n2 = rs.getString("username");
String n3 = rs.getString("address");
TestDTO dto = new TestDTO(n, n2, n3);
list.add(dto);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(rs!=null)rs.close();
if(pstmt!=null)pstmt.close();
if(con!=null)con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return list;
}
}
main
TestDAO dao = new TestDAO();
ArrayList<TestDTO> list =dao.select();
for (TestDTO testDTO : list) {
System.out.println(list);
}
main2
ApplicationContext ctx = new
GenericXmlApplicationContext("classpath:Test.xml");
TestDAO p3 =
(TestDAO)ctx.getBean("testDAO");
System.out.println(p3.select());
jdbc dataSource
dependency
<!-- https://mvnrepository.com/artifact/com.jslsolucoes/ojdbc6 -->
<dependency>
<groupId>com.jslsolucoes</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
<!--DataSource\uCEE8\uB125\uC158 \uD480 \uCD94\uAC00\uBD80\uBD84 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1</version>
</dependency>
properties
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.userid=scott
jdbc.passwd=tiger
dao
public class TestDAO {
// //jdbc
// String driver="oracle.jdbc.driver.OracleDriver";
// String url ="jdbc:oracle:thin:@localhost:1521:xe";
// String userid = "scott";
// String passwd = "tiger";
//
@Autowired
DataSource dataSource;
//드라이버 로딩, 커넥션 연결후 받아서 사용하게 함
public TestDAO() {
}
public ArrayList<TestDTO> select(){
System.out.println("in dao ===="+dataSource);
ArrayList<TestDTO> list = new ArrayList<TestDTO>();
Connection con = null;
PreparedStatement pstmt= null;
ResultSet rs =null;
try {
con = dataSource.getConnection();/////////
String sql = "select * from test";
pstmt= con.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
int n = rs.getInt("num");
String n2 = rs.getString("username");
String n3 = rs.getString("address");
TestDTO dto = new TestDTO(n, n2, n3);
list.add(dto);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(rs!=null)rs.close();
if(pstmt!=null)pstmt.close();
//if(con!=null)con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return list;
}
public void delete(int num){
System.out.println("in dao ===="+dataSource);
ArrayList<TestDTO> list = new ArrayList<TestDTO>();
Connection con = null;
PreparedStatement pstmt= null;
try {
con = dataSource.getConnection();/////////
String sql = "delete from test where num =?";
pstmt= con.prepareStatement(sql);
pstmt.setInt(1, num);
int n = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
//if(con!=null)con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
auto commit 이 되어 commit 코드가 필요하지 않음
bean
<context:annotation-config></context:annotation-config>
<context:property-placeholder location="classpath:com/config/jdbc.properties"/>
<bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.userid}"></property>
<property name="password" value="${jdbc.passwd}"></property>
</bean>
<bean id="testDAO" class="com.dao.TestDAO"></bean>
main
ApplicationContext ctx = new
GenericXmlApplicationContext("classpath:com/config/config.xml");
TestDAO dao =
(TestDAO)ctx.getBean("testDAO");
System.out.println(dao.select());
dao.delete(5);
ArrayList<TestDTO> list = dao.select();
for(TestDTO string : list) {
System.out.println(string);
}
번호: 1 이름은: 홍길동 주소는: 서울
번호: 2 이름은: 이순신 주소는: 전라
번호: 3 이름은: 유관순 주소는: 서울
번호: 4 이름은: 강감찬 주소는: 서울
jdbc template
dependency
<!-- https://mvnrepository.com/artifact/com.jslsolucoes/ojdbc6 -->
<dependency>
<groupId>com.jslsolucoes</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1</version>
</dependency>
<!-- 추가 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.22.RELEASE</version>
</dependency>
dao
public class TestDAO {
// @Autowired
// DataSource dataSource;
private JdbcTemplate jdbcTemplate;
//드라이버 로딩, 커넥션 연결후 받아서 사용하게 함
public TestDAO() {
}
public TestDAO(DataSource dataSource){//생성자를 통해 DataSourcre 주입, JdbcTemplate 에 설정
this.jdbcTemplate = new JdbcTemplate(dataSource);//DataSource 에서 JdbcTemplate생성
//데이터베이스 주소 출럭
//jdbc Templete 주소 출력
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(DataSource dataSource) {
this.jdbcTemplate =new JdbcTemplate(dataSource);
}
public List<TestDTO> select(){
System.out.println(jdbcTemplate);
List<TestDTO>list = jdbcTemplate.query("select * from test",
new RowMapper<TestDTO>() {
public TestDTO mapRow(ResultSet rs , int roNum) throws SQLException{
TestDTO dto = new TestDTO();
dto.setNum(rs.getInt(1));
dto.setUsername(rs.getString(2));
dto.setAddress(rs.getString(3));
return dto;
}
});
return list;
}//end select
}
selectByName
public List<TestDTO> selectByName(String name){
System.out.println(jdbcTemplate);
List<TestDTO>list = jdbcTemplate.query("select * from test where username=?",
new RowMapper<TestDTO>() {
public TestDTO mapRow(ResultSet rs , int roNum) throws SQLException{
TestDTO dto = new TestDTO();
dto.setNum(rs.getInt(1));
dto.setUsername(rs.getString(2));
dto.setAddress(rs.getString(3));
return dto;
}
}, name);
return list;
}//end select
count
public int selectCount(){
System.out.println(jdbcTemplate);
Integer count = jdbcTemplate.queryForObject("select count(*) from test",
Integer.class);
return count;
}//end select
⇒ 4
select One
public TestDTO selectOne(int num){
System.out.println(jdbcTemplate);
TestDTO dto = jdbcTemplate.queryForObject("select * from test where num =?",
new RowMapper<TestDTO>() {
public TestDTO mapRow(ResultSet rs , int roNum) throws SQLException{
TestDTO dto = new TestDTO();
dto.setNum(rs.getInt(1));
dto.setUsername(rs.getString(2));
dto.setAddress(rs.getString(3));
return dto;
}
}, num);
return dto;
}//end selectOne
System.out.println(dao.selectOne(1));
⇒ 번호: 1 이름은: 홍길동 주소는: 서울
insert delete
public void insert(int num, String name, String address){
int n = jdbcTemplate.update("insert into test (num, username, address)values (?,?,?)",
num, name, address);
System.out.println("insert 갯수: "+ n);
}//end insert
public void delete(int num){
int n = jdbcTemplate.update("delete from test where num =?",
num);
System.out.println("insert 갯수: "+ n);
}//end insert
⇒ insert 갯수: 1
delete 갯수 : 1
insert 하고 rollback
public void insert(int num, String name, String address){
Connection con = null;
PreparedStatement pstmt= null;
try {
con = DriverManager.getConnection(url, userid, passwd);
String sql = "insert into test (num, username, address)"+ " values (?,?,?)";
pstmt= con.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.setString(2, name);
pstmt.setString(3, address);
con.setAutoCommit(false); //insert 후
int n = pstmt.executeUpdate();
System.out.println("insert 갯수 ==== " + n);
int x= 5/0; //강제 exception
if (n==1)con.commit();
} catch (Exception e) {
try {
System.out.println("rollback====");
con.rollback();
} catch (Exception e2) {
e2.printStackTrace();
}
finally {
try {
if(pstmt!=null)pstmt.close();
if(con!=null)con.close();
} catch (Exception e2) {
e2.printStackTrace();
}}}}}
dao.insert(7, "zhemfmf", "Wkwnj");
⇒ insert 갯수 ==== 1
rollback====
dataresource
tx 처리 ⇒ xml : xml 설정이 어려움
tx처리 ⇒ @ 이용 :tx이 필요한 함수위에 선언하면 끝임
main ⇒ service ⇒ dao ⇒ jdbcTemplate ⇒ dataSource ⇒ propertites
- jdbc.propertites 로딩
- —> DataSource 생성
- tx 터리 dataSource 주입 txManager생성 @Transactional 사용 <tx:annotation-driven txManaer 등록>
- DataSource 주입으로 JdbcTemplate 생성
- JdbcTemplate 을 Dao 에 주입 생성
- dao를 service 에 주입 생성
- main 에서 service 를 get 해서 사용
- tx 처리 필요함수에 @Transactional 처리
dependency
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.jslsolucoes/ojdbc6 -->
<dependency>
<groupId>com.jslsolucoes</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
bean
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:jdbc.propertites</value>
</property>
</bean>
<!-- dataSource 생성 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
<!-- 3. DatatransactionManager 설정 : @Transaction 으로 tx 자릴,ㄹ 위임받아 자동 commit ,rollback 함-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 4. Tx 자리에 annotation 활성화 필요함수에서 @Transactional 처리 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="deptDAO" class="com.dao.ProductDAO">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id= "deptService" class="com.service.ProductService">
<property name="dao" ref="deptDAO"/>
</bean>
</beans>
dao
package com.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import com.entity.ProductDTO;
import com.entity.OrderDTO;
public class ProductDAO {
private JdbcTemplate jdbcTemplate;// new JdbcTemplate(DataSource)//xml에서 작업
//properties=> DataSoucre => jdbcTemplate에 주입되어야 사용 가능
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
//DataSource주입완료된 template set 이용 주입 사용
this.jdbcTemplate = jdbcTemplate;
}
// 전체 상품 목록
public List<ProductDTO> selectProduct() {
//template 주소확인
String query = "select * from t_product order by pcode";
return jdbcTemplate.query(query, new RowMapper<ProductDTO>() {
@Override
public ProductDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
ProductDTO dto = new ProductDTO();
dto.setPcode(rs.getString("pcode"));
dto.setPname(rs.getString("pname"));
dto.setPrice(rs.getInt("price"));
dto.setQuantity(rs.getInt("quantity"));
return dto;
}
});
}// end select
// 전체 주문 목록
public List<OrderDTO> selectOrder() {
String query = "select * from t_order order by pcode";
return jdbcTemplate.query(query, new RowMapper<OrderDTO>() {
@Override
public OrderDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
OrderDTO dto = new OrderDTO();
dto.setNum(rs.getInt("num"));
dto.setPcode(rs.getString("pcode"));
dto.setQnantity(rs.getInt("quantity"));
return dto;
}
});
}// end select
// 주문
public void addOrder(String pcode, int quantity) throws Exception{// p01, 3
String sql = "insert into t_order ( num, pcode, quantity ) values "
+ "( t_order_seq.nextval, ? , ? )";
int n = jdbcTemplate.update(sql, pcode, quantity);
System.out.println("insert 갯수 : "+n); //ordre테이블
//sysout n
//오더데이블에 insert후
// String sql2 = "update t_product set quantity = 5 where pcode = ?";
//String sql2 = "update t_product set quantity = quantity-? where pcode = ?";
String sql2 = "up t_product set quantity = quantity - ? where pcode = ?";
//update쿼리를 잘못 작성하여 에러를 발생시킴 수량감소
int n2= jdbcTemplate.update(sql2 , quantity, pcode );
System.out.println("update 갯수 : "+n2);
}// end insert
public void update(int deptno, String dname, String loc) {
String sql = "update dept set dname = ? , loc = ? where deptno = ?";
int n = jdbcTemplate.update(sql, dname, loc, deptno);
}// end update
public void delete(int deptno) {
String sql = "delete from dept where deptno = ?";
int n = jdbcTemplate.update(sql, deptno);
}// end delete
}
service
public class ProductService {
ProductDAO dao;
public void setDao(ProductDAO dao) {
this.dao = dao;
}
@Transactional //tx처리함 필요함수 위에 붙여줌 //자동 commit, rollback
public void addOrder(String pcode, int quantity) throws Exception{
dao.addOrder(pcode, quantity);
}
//t_product목록읽기
public List<ProductDTO> selectProduct(){
//sysout dao 주소 확인
return dao.selectProduct();
}
public ProductDAO getDao() {
return dao;
}
public List<OrderDTO> selectOrder() {
return dao.selectOrder();
}
public void update(int deptno, String dname, String loc){
dao.update(deptno, dname, loc);
}
public void delete(int deptno){
dao.delete(deptno);
}
}
main
public class ProductTest {
public static void main(String[] args) {
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("Dept.xml");
ProductService service = ctx.getBean("deptService", ProductService.class);
System.out.println("주문전 데이터 =============================================");
List<ProductDTO> list = service.selectProduct(); // t_product 테이블 전체 데이터 출력
for (ProductDTO dto : list) {
System.out.println(dto);
}
// 상품 주문
System.out.println("p01 상품 3개 주문합니다");
try {
service.addOrder("p01", 3);//add시 문제 발생
//T_ORDER에 정상 INSERT, T_product update p01 수량 10-5개 변경 에러 발생 =>에러 발생 롤백
//T_order에 인서트 확인 할 것
//
} catch (Exception e) {
System.out.println("에러가 발생하여 롤백처리.");
}
System.out.println("주문 후 product table 데이터 =============================================");
list = service.selectProduct();
for (ProductDTO dto : list) {
System.out.println(dto);
}
System.out.println("주문 후 OrderTable 데이터 =============================================");
List<OrderDTO> oList = service.selectOrder();
for (OrderDTO dto : oList) {
System.out.println(dto);
}
}//end main
}//end class
주문전 데이터 =============================================
ProductDTO [pcode=p01, pname=TV, price=1000, quantity=10]
ProductDTO [pcode=p02, pname=iPhone, price=500, quantity=5]
ProductDTO [pcode=p03, pname=G3, price=600, quantity=20]
p01 상품 3개 주문합니다
insert 갯수 : 1
에러가 발생하여 롤백처리.
주문 후 product table 데이터 =============================================
ProductDTO [pcode=p01, pname=TV, price=1000, quantity=10]
ProductDTO [pcode=p02, pname=iPhone, price=500, quantity=5]
ProductDTO [pcode=p03, pname=G3, price=600, quantity=20]
주문 후 OrderTable 데이터 =============================================
bean 더 간단히 하기
- prtoperty 에 jdbcTemplate 지우기 dao 도 생성 변수 위에 @Autowired 붙이기
- dao , service bean 생성 자동 <context:component-scan base-package="com.*"></context:component-scan> @Repository처리: dao 맨 위에 service 맨 위에
'Daily Codig Reminder' 카테고리의 다른 글
parameter (1) | 2024.02.12 |
---|---|
mybatis (1) | 2024.02.12 |
@Autowired, CoC ,@Qualifier ,lifecycle (1) | 2024.02.08 |
props, autowired (1) | 2024.02.07 |
spring - property (1) | 2024.02.06 |