java spring 5일차

이수종·2023년 2월 6일

java spring

목록 보기
4/8


sql developer로 db 접속


테스트 누름

상태: 성공 떠야함

비번이 틀리면 오류가 뜸

빨간색 X를 누르면 삭제예정이고 그옆에 체크표시 누르면 커밋됌

jdbc-02 프젝 생성

  1. 메이븐으로 컨버팅


2. dependencies 추가

package jdbc02;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

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

public class Main01 {

	@SuppressWarnings("resource")
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		ApplicationContext context =
				new ClassPathXmlApplicationContext("beans.xml");
		DataSource dataSource = context.getBean(DataSource.class);
		Connection connection = dataSource.getConnection();
		System.out.println("DB연결성공!");
	}

}

Main01 클래스에 코드 입력

Main02 클래스에 코드 입력

package jdbc02;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.Connection;

public class Main02 {

	@SuppressWarnings("resource")
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
		JdbcTemplate jdbcTemplate = context.getBean(JdbcTemplate.class);
		String sql = "insert into member(mid, mname, mpwd, mintro)";
		sql += "values(?,?,?,?)";
		jdbcTemplate.update(sql, "user100", "유저100","pwd100","백번째 유저");
		System.out.println("등록 성공!");
	}

}

jdbctemplate 이용해서 등록 , sql문을 이용해서 db에 데이터 등록

main03 클래스에 코드 입력

package jdbc02;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

public class Main03 {

	@SuppressWarnings("resource")
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
		JdbcTemplate jdbcTemplate = context.getBean(JdbcTemplate.class);
		//1개 숫자나 문자를 가져올때
//		String sql = "select count(*) from member";
//		Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
//		System.out.println("저장갯수="+count);
		//1개 행을 가져올때
		String sql = "select * from MEMBER where mid=?";
		Map<String, Object> mem = jdbcTemplate.queryForMap(sql, "user100");
		// 대문자 컬럼명이 키
		System.out.println(mem.get("MID"));
		System.out.println(mem.get("MNAME"));
		System.out.println(mem);
		// 위 코드는 게시판 상세보기 할때 사용
		List<Map<String,Object>> list = jdbcTemplate.queryForList("select * from MEMBER");
		System.out.println("** 전체출력 **");
		for (Map<String, Object> map: list) {
			System.out.println(map);
		// 위 코드는 게시판 전체보기 할때 사용
		// map의 단점 : 비어있는 값이 있으면 불러오기 힘듬
		}
	}
}

map의 단점 때문에 VO클래스에 사용하는게 맞다

DB의 한개행 -> Entity
Entity를 저장하는 목적의 객체를 VO(Value Object) DTO(Data Transfer Object)

vo클래스 생성

package jdbc02.vo;
/** 테이블의 한개행 전체를 저장할 목적의 클래스 */

public class MemberVo {
	private String mid, mname, mpwwd, mintro;
	// 생성자메서드. 기본생성자, 변수전체수신 생성자
//기본 생성자는 ctrl+space 하고 enter하면 생성
	public MemberVo() {
	}
	//Source->Generate Constructor using Fields
	public MemberVo(String mid, String mname, String mpwwd, String mintro) {
		super();
		this.mid = mid;
		this.mname = mname;
		this.mpwwd = mpwwd;
		this.mintro = mintro;
	}
	//getter/setter 메서드  Source->Generate Getters and Setters
	public String getMid() {
		return mid;
	}
	public void setMid(String mid) {
		this.mid = mid;
	}
	public String getMname() {
		return mname;
	}
	public void setMname(String mname) {
		this.mname = mname;
	}
	public String getMpwwd() {
		return mpwwd;
	}
	public void setMpwwd(String mpwwd) {
		this.mpwwd = mpwwd;
	}
	public String getMintro() {
		return mintro;
	}
	public void setMintro(String mintro) {
		this.mintro = mintro;
	}
	// 선택사항 : toString() - 디버깅용. 전체변수값 출력
	//Source -> Generate toString()
	@Override
	public String toString() {
		return "MemberVo [mid=" + mid + ", mname=" + mname + ", mpwwd=" + mpwwd + ", mintro=" + mintro + "]";
	}
	
}
//전체데이터를 VO에 자동저장하기
		String sql = "select * from MEMBER where mid=?";
		MemberVo vo = jdbcTemplate.queryForObject(sql,
				new BeanPropertyRowMapper<MemberVo>(MemberVo.class)
				,"user100");
		System.out.println("VO="+vo);

위 코드추가

String sql = "select * from MEMBER ORDER BY mid ASC";
		List<MemberVo> mlist = jdbcTemplate.query(sql,
				new BeanPropertyRowMapper<MemberVo>(MemberVo.class)
				);
		System.out.println("** 전체 출력 **");
		for (MemberVo vo : mlist) {
			System.out.println(vo);
		}//end for


출력 결과 db 전체 내용이 다 나오는 것을 확인 가능

웹개발 -> 성능기준 -> 페이지표시는 3초이내

ORM : Object Relation Mapping
BeanPropertyRowMapper 얘가 ORM역할
mybatis 사이트
https://blog.mybatis.org/p/products.html
mybatis docs 만 참고

트랜잭션

트랜잭션 설정 - Tx매니저, Advice 등록

mybatis

프로젝트 만들고 dependency 추가

<dependency>
  		<groupId>org.mybatis</groupId>
  		<artifactId>mybatis</artifactId>
  		<version>3.5.11</version>
  	</dependency>
  	<dependency>
  		<groupId>com.oracle.database.jdbc</groupId>
  		<artifactId>ojdbc8</artifactId>
  		<version>21.8.0.0</version>
  	</dependency>
  	<dependency>
  		 <groupId>commons-dbcp</groupId>
	 	 <artifactId>commons-dbcp</artifactId>
	 	 <version>1.4</version>
  	</dependency>

main01 클래스 코드

package mybatis01;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import jdbc02.vo.MemberVo;

public class Main01 {

	public static void main(String[] args) throws Exception {
		String resource = "mybatis/config/mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

		try (SqlSession session = sqlSessionFactory.openSession()) {
		  MemberVo  vo = session.selectOne("MemberMapper.selectOne", "user100");
		  System.out.println( vo );
		}
	}//end main
}

mybatis-config.xml 코드

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@127.0.0.1/XE"/>
        <property name="username" value="spring"/>
        <property name="password" value="spring"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="mybatis/mapper/MemberMapper.xml"/>
  </mappers>
</configuration>

membermapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MemberMapper">

  <select id="selectOne" resultType="jdbc02.vo.MemberVo">
    select * from MEMBER where mid = #{mid}
  </select>
  
  
</mapper>

sqlSession.commit()을 하던가 아님 autocommit 옵션 true 해줌
sqlSessionFactory.openSession()

pom.xml에 dependency 추가

  	<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.3.30.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>4.3.30.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.3</version>
</dependency>


요 버전에 맞춰서 선택

mybatis와 spring의 접근 방식 차이점

추천하는 프로젝트
1. 자바로 채팅 서버, 클라이언트 작성
(교재: 자바의 정석 마지막에 구현되어 있음)
2. 오목 서버, 클라이언트 작성

  1. 지뢰찾기 서버, 클라이언트 작성(상대방 지뢰 빨리 터트리기)

update 기능 구현
mapper.xml 코드 추가

  <insert id="update">
  update member set mname=#{mname}, mpwd=#{mpwd}, mintro=#{mintro}
  where mid=#{mid}
  </insert>
  <!-- 태그이름 상관 x  -->

update와 delete는 where 필수!!!

test 코드

SqlSession session = context.getBean(SqlSession.class);
		MemberVo vo = session.selectOne("selectOne", "user100");
		if(vo!=null) {
			vo.setMintro(vo.getMintro()+"-수정");
			session.update("update", vo);
			System.out.println("수정완료");
		}

잘 모르겠지만 워크샵 내준거 풀었음

문제는 아래와 같았다..


  1. 테이블 생성
    테이블이름 Book :
    title varchar2(100) PK
    publisher varchar2(100)
    writer varchar2(100)
    price NUMBER(8)

1 자바프로젝트 생성: mybatis-02
2. maven으로 변환

  1. 아래 코드가 동작하도록 코드를 작성하세요

package mybatis01;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import jdbc02.vo.bookrVo;

public class ProductSpringMain01 {

@SuppressWarnings("resource")
public static void main(String[] args) {
	ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

	SqlSession session = context.getBean(SqlSession.class);
	BookVo vo = session.selectOne("BookMapper.selectOne", "user100");
	System.out.println( vo );
	
	SqlSession session = context.getBean(SqlSession.class);
	//BookVo는 책제목(title),출판사(publisher),저자(Writer),가격(price)로 구성된다.
	BookVo vo = new BookVo("자바기본","해냄출판사","저자01",22000);
	session.insert("BookMapper.insert", vo);
	System.out.println("등록성공 1");
	
	vo = new BookVo("자바실무","해냄출판사","저자01",25000);
	session.insert("BookMapper.insert", vo);
	System.out.println("등록성공 2");
	
	vo = new BookVo("스프링입문","하남출판사","저자02",27000);
	session.insert("BookMapper.insert", vo);
	System.out.println("등록성공 3");

	vo = session.selectOne("BookMapper.selectOne", "자바실무");
	System.out.println( "자바실무책정보: "+vo );
	
	//자바실무책의 가격을 20000원으로 내림
	vo.setPrice(20000);
	session.update("BookMapper.update",vo);
	System.out.println( "수정된 자바실무책정보: "+vo );	

}

}


나의 풀이

1. 메인 프젝만들고 메인 클래스 생성

package mybatis01;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import jdbc02.vo.BookVo;

public class ProductSpringMain01 {

	@SuppressWarnings("resource")
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

		
		SqlSession session = context.getBean(SqlSession.class);
		//BookVo는 책제목(title),출판사(publisher),저자(Writer),가격(price)로 구성된다.
		BookVo vo = new BookVo("자바기본","해냄출판사","저자01",22000);
		session.insert("BookMapper.insert", vo);
		System.out.println("등록성공 1");
		
		vo = new BookVo("자바실무","해냄출판사","저자01",25000);
		session.insert("BookMapper.insert", vo);
		System.out.println("등록성공 2");
		
		vo = new BookVo("스프링입문","하남출판사","저자02",27000);
		session.insert("BookMapper.insert", vo);
		System.out.println("등록성공 3");

		vo = session.selectOne("BookMapper.selectOne", "자바실무");
		System.out.println( "자바실무책정보: "+vo );
		
		//자바실무책의 가격을 20000원으로 내림
		vo.setPrice(20000);
		session.update("BookMapper.update",vo);
		System.out.println( "수정된 자바실무책정보: "+vo );	

	}
}

요렇게 코드 복붙하고 수정 했다.

2. BookVo 클래스를 만들어 줬다.

생성자메서드, 기본생성자, 변수 전체수신 생성자라는데 아직 잘 모르겠다. 일단 만듬

package jdbc02.vo;

public class BookVo {
	private String title, publisher, writer;
	private int price;
// 생성자메서드. 기본생성자, 변수전체수신 생성자
//기본 생성자는 ctrl+space 하고 enter하면 생성
	public BookVo() {
		// TODO Auto-generated constructor stub
	}
public BookVo(String title, String publisher, String writer, int price) {
	super();
	this.title = title;
	this.publisher = publisher;
	this.writer = writer;
	this.price = price;
}
public String getTitle() {
	return title;
}
public void setTitle(String title) {
	this.title = title;
}
public String getPublisher() {
	return publisher;
}
public void setPublisher(String publisher) {
	this.publisher = publisher;
}
public String getWriter() {
	return writer;
}
public void setWriter(String writer) {
	this.writer = writer;
}
public int getPrice() {
	return price;
}
public void setPrice(int price) {
	this.price = price;
}
@Override
public String toString() {
	return "BookVo [title=" + title + ", publisher=" + publisher + ", writer=" + writer + ", price=" + price + "]";
}
	
}

3. BookMapper.xml 만들어주기

selectOne, selectAll, insert, update 기능을 구현할 mapper를 구현했다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="BookMapper">

  <select id="selectOne" resultType="jdbc02.vo.BookVo">
    select * from book where title = #{title}
  </select>                         <!-- 치환문자 -->
  <select id="selectAll" resultType="jdbc02.vo.BookVo">
  	select * from book ORDER BY title asc
  </select>
  
	<insert id="insert" parameterType="jdbc02.vo.BookVo">
 	 insert into book(title, publisher, writer, price)
 	 values( #{title}, #{publisher}, #{writer}, #{price} )
  	</insert>
  <insert id="update">
  update book set title=#{title}, publisher=#{publisher}, writer=#{writer}
  where title=#{title}
  </insert>
  <!-- 태그이름 상관 x  -->
</mapper>

4. Maven 컨버팅과 pom.xml에 코드추가

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>mybatis-02</groupId>
  <artifactId>mybatis-02</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
<dependencies>
<dependency>
  		<groupId>org.mybatis</groupId>
  		<artifactId>mybatis</artifactId>
  		<version>3.5.11</version>
  	</dependency>
  	<dependency>
  		<groupId>com.oracle.database.jdbc</groupId>
  		<artifactId>ojdbc8</artifactId>
  		<version>21.8.0.0</version>
  	</dependency>
  	<dependency>
  		 <groupId>commons-dbcp</groupId>
	 	 <artifactId>commons-dbcp</artifactId>
	 	 <version>1.4</version>
  	</dependency>
  	
  	<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.3.30.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>4.3.30.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.3</version>
</dependency>
</dependencies>
  
</project>

아직은 내가 이걸 제대로 이해 못해서 여기에 꼭 필요한 기능이 뭔지 제대로 파악 못했다. 공부 좀 더해보자

5. 끝으로 워크샵 프젝 폴더 남기기

2023/2/6 java spring 쉅 끝

0개의 댓글