
sql developer로 db 접속

테스트 누름

상태: 성공 떠야함

비번이 틀리면 오류가 뜸

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

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)
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 전체 내용이 다 나오는 것을 확인 가능
ORM : Object Relation Mapping
BeanPropertyRowMapper 얘가 ORM역할
mybatis 사이트
https://blog.mybatis.org/p/products.html
mybatis docs 만 참고
트랜잭션 설정 - Tx매니저, Advice 등록
프로젝트 만들고 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. 오목 서버, 클라이언트 작성
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 자바프로젝트 생성: mybatis-02
2. maven으로 변환
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 );
}
}
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 );
}
}
요렇게 코드 복붙하고 수정 했다.
생성자메서드, 기본생성자, 변수 전체수신 생성자라는데 아직 잘 모르겠다. 일단 만듬
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 + "]";
}
}
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>
<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>
아직은 내가 이걸 제대로 이해 못해서 여기에 꼭 필요한 기능이 뭔지 제대로 파악 못했다. 공부 좀 더해보자

2023/2/6 java spring 쉅 끝