반응형
*Framework
-
자주 사용될 기능을 미리 구현해 놓은 것 (Library와 같다)
-
=> library도 가지는 특징 => 내가만들어 남이 편하게 쓴다 => 홍익인간정신(널리사람을 이롭게한다)
-
배포는 jar로
-
생명주기에 차이가 있다(생성하고
-
library :
-
<<<개발자가 new를 할 타이밍을 잡고 사용하고>>>
-
생명주기를 개발자가 관리한다(new에 관한걸 개발자가)
-
제공하는 기능을 변경하지 않고 그대로 사용한다.
-
Framework :
-
<<<Framework에서 생명주기를 관리한다.>>>
-
생명주기를 Framework가 관리한다.(new 를 개발자가 거의 안한다)
-
제공하는 기능을 개발자가 상황에 맞게 변경(커스터마이징)하여 사용한다.
-
java는 두개의 성격을 가지고 있지만 library에 더 가깝다.
-
내장 Library를 보면 JRE Lirary라고 나옴.
-
///필요한것만 만들면된다. =>고생을 덜하게 됨
-
생산성 향상
-
///프레임워크에 사용적인 관점이 더 중요(써봤냐)
개발 방법 |
class |
CBD(component ~Develope
=Library랑 비슷
=내가 필요하지 않은 기능도 들어가 있어서 (내가 못막) |
Framework
베어본(반조립 형태)
=조립이 되서 나온다
|
컴퓨터 조립 |
cpu,ram,저항,다이오드,전선,,, |
cpu,ram,d/su,m/b,
vga,케이스(완성된 부품) |
반조립 형태로 cpu,?만 선정.
|
개발 난이도 |
上 |
中 |
下 |
개발 속도 |
느림(하) |
中 |
上=>난이도 하락으로 개발속도 증가 |
품질 |
上 |
中 |
下 |
-
최소한의 품질( 신뢰도 ) 보장 (나한테 의뢰한 클라이언트가 받고싶어 함)=>동작!!!
-
///=>사용을 일반 사용자가 하게 되는데 (대고객 서비스(모든 사람을 대상으로)/버티컬 서비스(특정계층을 상대로))
-
갑 : (공무원)공공기관,은행(금융권),물류회사-일주는 사람(업무를 만들어 구현 의뢰)
-
을 : SDS,CNS,C&C,쌍용정보-관리
-
병 : 자회사, 규모있는 회사
-
정 : 중소기업으로 피라미드 구조가 된다.
-
Mybatis, Spring, lafJ, df,,,struts,,,등이 있다. 개발환경은 다양해
MyBatis는 원래 Apache의 iBATIS에서 myBATIS -> MyBatis가 된것으로 크로스 플랫폼=>편해요
*MyBatis
-
//최소한의 품질보장으로 미리 만들어진 것들로 편하게 사용할 수 있는 Framework
-
//설정을 xml로 밖에서 변경값 설정이 가능하다(장)
-
DB Mapper Framework
-
Query 를 xml에 넣어 사용
-
iBATIS(apache)->myBAITS(google)->MyBatis(독립-GIT) 가 되었다.
-
다양한 언어에서 사용할 수 있다. (Cross Language)=>Java,.net
-
//개발자들이 가장 많이 사용해본 프레임워크 1위
-
//JDBC - 연결을 끊지 않으면 서버가 죽는 그런 문제를 다 해준다.
-
XML에 쿼리문을 정의하고 사용하는 방식(DB Mapper방식)
-
Java에서 지원하는 PreparedStatement, Procedure를 손쉽게 사용할 수 있도록 해준다.
-
///PreparedStatement:미리생성/실행 - 반복수행될때 사용 (statement보다 안전)
-
///JDBC : 연결~ 끊기 문법이 나오지 않는다.->언어에 대한 경력이 아니라 프레임워크에 대한 경력이 된다.
-
///잘해도 내가 아니고 신입도 가능해짐(결과가 같음) 협상의 카드가 줄어든다
-
JDBC의 불편함(중복코드) 를 개선 =>몰라도 MyBatis사용법만 알면 가볍고 편하게 사용가능
-
//속도가 느려진다.(더많은 ...) 범용 - 누구나...
-
구조)
-
(이미지)
DBMS
MyBatis-설정용xml-Query문을 가진 Mapper xml
-
개발자의 사용
-
사용법)
-
코드)
-
1.
-
설정용 xml에 홈페이지에 나와있는 코드 복붙
-
2.
-
Mapper xml에도 마찬가지
-
Domain : (DB=컬럼하나(가질 수 있는 값의 범위)/web=(웹 주소))
-
VO처럼 작성하나 VO와는 구분하여 사용
-
조회한 결과를 저장할 때 사용하는 객체
-
select에 대해서만.
-
VO
-
값을 가진 객체
-
insert 추가하는 값, update 변경하는 값, where 절에 들어 가는 값.
-
<select id="식별자" //
-
select name, age //<=Domain - select만 나뉘어 진다. 구분해서 사용!!! VO면 안된다
-
from 테이블명
-
where 컬럼명=값 //<=VO
-
</select>
-
사용법)
-
설정용 xml작성 (mybatis.config.xml)
-
Mapper xml 작성(xxx_mapper.xml)
-
설정용 xml과 연결할 스트림 사용. (한글이 들어갈 수도 있기 때문에 16bit으로 사용을 권장한다)
-
Reader r=Resouries.getRewourceAsReader("설정용xml경로"); //(마이바티스에서 제공하는 class-ibatis로 되어있는 클래스도 아직 존재.)
-
MyBatis Framework 생성
-
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder(); //빈 객체가 만들어 진것
-
설정파일과 연결된 Stream을 할당하여 DB가 연동된 MyBatis Framework 객체 얻기
-
SqlSessionFactory ssf=ssfb.build(r); //ssf는 가급적 하나의 객체를 권고하고 있다. 어떻게 하면 thread에 안전하게 ? : 싱글턴패턴+syncronized
-
=>ssf는 하나의 객체로 Thread에 안전하게 사용해야 하는 객체.
-
MyBatis Handler를 얻기
-
=>쿼리를 가진 XML의 노드의 id로 찾아 Parsing 하여 쿼리를 수행하고 결과를 얻는 일
-
SqlSession ss=ssf.openSession();
-
추가 : ss.insert("id",VO); //int 로 받는것도 가능하지만 쓸곳 없어 void
-
변경 : ss.update("namespace.id",VO);
-
삭제 : ss.delete("namespace.id", VO);
-
조회 - 한행 : ss.selectOne("id",VO); //=>Domain(여기에만 쓰임)
-
조회 - 여러행 : ss.selectList("id",VO); //=>List<Domain>
-
///몰라도 사용가능 알아서 연결을 끊어줌 (세세히 조절안되지만 편함)
-
///딱 하나만 알면 그 방법이 막혔을때 그 기능을 사용할 수 없게 됨.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- MyBatis의 환경설정(연동할 DB에 대한 설정)을 수행하는 xml
설정 정보를 properties에 넣고 하는 것과
설정 정보를 직접 Hard Coding하는 방법 2가지.
-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<!-- 쿼리문을 가진 XML을 연결(*:0~n개) -->
<mappers>
<mapper resource="day0403/mapper/dept_mapper.xml"/>
</mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- Query문을 정의
namespace=ns: XML내에서 중복된 id를 사용할 수 있도록 구분하는 것.
(자바의 패키지와 비슷한 용도)
select 안에 ; 절대 사용하지 않는다!!!
-->
<mapper namespace="kr.co.sist">
<select id="selectAllDept" resultType="day0403.DeptDomain">
<!-- select deptno, dname, loc from dept -->
select deptno, dname, loc from cp_dept
</select>
</mapper>
package day0403;
/**
* 조회하는 컬럼의 값을 저장하는 VO를 Domain
* @author owner
*/
public class DeptDomain {
private int deptno;
private String dname, loc;
/* public DeptDomain() {
System.out.println("DeptDomain기본생성자");
}
public DeptDomain(int deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
System.out.println("DeptDomain 인자있는 생성자");
}//컴파일러가 생성자를 알아서 만들어줌으로 만들지 않고 사용한다.
*/
public void setDetpno(int deptno) {
this.deptno = deptno;
}
public void setDname(String dname) {
this.dname = dname;
}
public void setLoc(String loc) {
this.loc = loc;
}
public int getDeptno() {
return deptno;
}
public String getDname() {
return dname;
}
public String getLoc() {
return loc;
}
}
package day0403;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class UseMyBatis {
//2차 수업
public SqlSessionFactory getSessionFactory() throws IOException{
//1.환경설정 xml에 stream연결
Reader reader=Resources.getResourceAsReader("day0403/mybatis_config.xml"); //절대경로는 필요없고 패키지경로부터 적으면된다.
//mybatis-3.5.0.jar를 build path로 잡으면 개발은 되는데 운용이 되지 않는다.
//2.MyBatis Framework 생성
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
//3.MyBatis Framework과 DB연동한 객체 얻기(객체를 하나로 관리)
SqlSessionFactory ssf=ssfb.build(reader);
//System.out.println(ssf);
if(reader!=null) {
reader.close();
}//end if
//3번까지 한번만 해서 팩토리로....
return ssf;
}//getSessionFactory
public void selectAllDept() throws IOException {
/* //1.환경설정 xml에 stream연결
Reader reader=Resources.getResourceAsReader("day0403/mybatis_config.xml"); //절대경로는 필요없고 패키지경로부터 적으면된다.
//mybatis-3.5.0.jar를 build path로 잡으면 개발은 되는데 운용이 되지 않는다.
//2.MyBatis Framework 생성
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
//3.MyBatis Framework과 DB연동한 객체 얻기(객체를 하나로 관리)
SqlSessionFactory ssf=ssfb.build(reader);
//System.out.println(ssf);
if(reader!=null) {
reader.close();
}//end if
//3번까지 한번만 해서 팩토리로....
*/
//4.MyBatis Handler 얻기
SqlSession ss=getSessionFactory().openSession();
//5.Handler를 사용하여 DB작업 수행
List<DeptDomain> list= ss.selectList("kr.co.sist.selectAllDept"); //selectAllDept도 가능하다.-id가 유일 하다면!
DeptDomain dd=null;
for(int i=0; i<list.size(); i++) {
dd=list.get(i);
System.out.println(dd.getDeptno()+"/"+dd.getDname()+"/"+dd.getLoc());
}//end for
//6.사용이 종료된 SqlSession을 닫는다.
ss.close();
}//selectAllDept
public static void main(String[] args) {
UseMyBatis umb=new UseMyBatis();
try {
umb.selectAllDept();
} catch (IOException e) {
e.printStackTrace();
}//end catch
}//main
}//class
*Mapper 작성법
-
//직관적
-
추가)
-
<insert id="Handler 에서 찾은 ID" parameterType="패기지명.vo명">
-
insert into 테이블명(컬럼명,,,) values(값,,,)
-
//이때의 값은 ${vo.getter}=>쿼리로 대체:쿼리문으로 반영 | #{vo.getter} =>bind변수로 대체=?=값(컬럼명과테이블명은 x?)
-
//따라서 값을 넣을 때 #, 컬럼명이나 테이블명은 $사용한다.
-
--쿼리로는 이 라인만 막히는게 아니라 그 뒤로 다 막혀 버린다.(내컴은 잘되지만 서버에 올라가면 안됨) /**/로는 가능하다!!!
-
</insert>
-
사용)
-
ss.insert("id", VO); //id에 해당하는 노드를 찾아서 파싱을 한다음에 그 값을 pstmt에 넣는데 $는 값, #은 ? 으로 실행된다.
-
//vo는 패키지명.vo명을 찾아 값에 들어간다.
-
변경)
-
<update id="Handler에서 찾을 ID" parameterType="VO명">
-
update 테이블명
-
set 컬럼명 = 값
-
where 컬럼명 = 값
-
</update>
-
사용)
-
int cnt= ss.update("id, vo);
-
삭제)
-
<delete id="id" parameterType="VO">
-
delete from 테이블명
-
where 컬럼명=값
-
</delete>
-
사용)
-
int cnt=ss.delete("id",vo);
-
//vo가 픽스되어있다면 id만 넣어도 된다.
-
조회)
-
<select id="id" parameterType="VO" resultType="Domain">
-
select 컬럼명,,, //Domain
-
from 테이블명
-
where 컬럼명=값 //VO
-
</select>
-
한행 사용)
-
Domain d=ss.seelctOne("id", VO); //vo가 들어가고 Domain이 나온다.
-
//한행나와야할 쿼리가 여러행이 나오면 Error
-
여러행 사용)
-
List<Domain> list=ss.selectList("id", VO); //vo가 들어가지고 조회한 결과가 도메인을 타고 나와 저장된다.
-
//그래서 for문 사용
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- Query문을 정의
namespace=ns: XML내에서 중복된 id를 사용할 수 있도록 구분하는 것.
(자바의 패키지와 비슷한 용도)
select 안에 ; 절대 사용하지 않는다!!!
-->
<mapper namespace="kr.co.sist">
<select id="selectAllDept" resultType="day0403.DeptDomain">
<!-- select deptno, dname, loc from dept -->
select deptno, dname, loc from cp_dept
</select>
<!-- 2차추가 -->
<insert id="insertCpDept" parameterType="day0403.DeptVO">
INSERT INTO CP_DEPT(DEPTNO, DNAME, LOC) VALUES(#{deptno}, #{dname}, #{loc})
</insert>
<update id="updateCpDept" parameterType="day0403.DeptVO">
UPDATE CP_DEPT
SET DNAME=#{dname}, LOC=#{loc}
WHERE DEPTNO=#{deptno}
</update>
<delete id="deleteCpDept" parameterType="int">
DELETE FROM CP_DEPT
WHERE DEPTNO=#{deptno}
</delete>
</mapper>
package day0403;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class UseMyBatis {
//2차 수업
public SqlSessionFactory getSessionFactory() throws IOException{
//1.환경설정 xml에 stream연결
Reader reader=Resources.getResourceAsReader("day0403/mybatis_config.xml"); //절대경로는 필요없고 패키지경로부터 적으면된다.
//mybatis-3.5.0.jar를 build path로 잡으면 개발은 되는데 운용이 되지 않는다.
//2.MyBatis Framework 생성
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
//3.MyBatis Framework과 DB연동한 객체 얻기(객체를 하나로 관리)
SqlSessionFactory ssf=ssfb.build(reader);
//System.out.println(ssf);
if(reader!=null) {
reader.close();
}//end if
//3번까지 한번만 해서 팩토리로....
return ssf;
}//getSessionFactory
//2차
public void insertCpDept(DeptVO dv) throws IOException,SQLException{
//4.MyBatis Handler 얻기
SqlSession ss=getSessionFactory().openSession();
//5.Handler를 사용하여 DB작업 수행
int cnt=ss.insert("insertCpDept",dv);
ss.commit(); //해주어야 보인다 실패시 rollback
System.out.println("추가 작업"+cnt);
//추가작업이 3줄로 끝나게 된다=>생산성 향상
}//insertCpDept
//2차
public void updateCpDept(DeptVO dv) throws IOException, SQLException{
//4.MyBatis Handler 얻기
SqlSession ss=getSessionFactory().openSession();
//5.쿼리문 수행
int cnt=ss.update("updateCpDept",dv);
ss.commit();
System.out.println("변경 성공"+cnt);
}//updateCpDept
//2차
public void deleteCpDept(int deptno) throws SQLException,IOException{
//4.MyBatis Handler 얻기
SqlSession ss=getSessionFactory().openSession();
//5.Handler 사용하여 쿼리 수행
int cnt=ss.delete("deleteCpDept",deptno);
ss.commit();
if(cnt==1){
System.out.println(deptno+"번 부서 정보를 삭제 하였습니다.");
}else {
System.out.println(deptno+"번 해당 부서는 존재하지 않습니다.");
}//end else
}//deleteCpDept
public void selectAllDept() throws IOException {
/* //1.환경설정 xml에 stream연결
Reader reader=Resources.getResourceAsReader("day0403/mybatis_config.xml"); //절대경로는 필요없고 패키지경로부터 적으면된다.
//mybatis-3.5.0.jar를 build path로 잡으면 개발은 되는데 운용이 되지 않는다.
//2.MyBatis Framework 생성
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
//3.MyBatis Framework과 DB연동한 객체 얻기(객체를 하나로 관리)
SqlSessionFactory ssf=ssfb.build(reader);
//System.out.println(ssf);
if(reader!=null) {
reader.close();
}//end if
//3번까지 한번만 해서 팩토리로....
*/
//4.MyBatis Handler 얻기
SqlSession ss=getSessionFactory().openSession();
//5.Handler를 사용하여 DB작업 수행
List<DeptDomain> list= ss.selectList("kr.co.sist.selectAllDept"); //selectAllDept도 가능하다.-id가 유일 하다면!
DeptDomain dd=null;
for(int i=0; i<list.size(); i++) {
dd=list.get(i);
System.out.println(dd.getDeptno()+"/"+dd.getDname()+"/"+dd.getLoc());
}//end for
//6.사용이 종료된 SqlSession을 닫는다.
ss.close();
}//selectAllDept
public static void main(String[] args) {
UseMyBatis umb=new UseMyBatis();
try {
//2차 추가
//DeptVO dv=new DeptVO(11, "SM개발", "원주");
//umb.insertCpDept(dv);
//commit을 안하면 값이 들어간게 보이지 않는다.
//umb.updateCpDept(dv);
umb.deleteCpDept(1);
umb.selectAllDept();
} catch (IOException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}//end catch
}//main
}//class
package day0403;
public class DeptVO {
//아무리 같은형태라도 일이 다르면 또만들어야 한다.(값의 사용처가 다르면!)
private int deptno;
private String dname,loc;
public DeptVO(int deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}//인자있는 생성자만 쓰는 이유-값이 들어가야 하는 경우가 있기 때문!!insert/update!!
//전달만하면되서 getter만
public int getDeptno() {
return deptno;
}
public String getDname() {
return dname;
}
public String getLoc() {
return loc;
}
}
반응형
'국비지원학원 > MyBatis' 카테고리의 다른 글
115일차-페이지 선택유지/dynamicQuery/procedure사용 (0) | 2019.04.19 |
---|---|
114일차-Dynamic Query조회 (0) | 2019.04.19 |
113일차-지도 마무리/조회 마무리 (0) | 2019.04.19 |
112일차-MyBatis (0) | 2019.04.17 |
111일차-MyBatis (0) | 2019.04.17 |