[목차]

10. CRUD(Create, Read, Update, Delete)

 : 스프링 사용.

 : xml 의존방식 db 연결(root-context사용).

① DB 연동

② 모든 list 출력

③ 데이터 추가(Insert)

④ Data 수정(Update)

⑤ 데이터 삭제(Delete)


[내용]

 = sprweb15_crud

① DB 연동

 - Configuration.xml

<configuration>
 <typeAliases>
 	<typeAlias type="pack.model.MemDto" alias="dto"/>
 	<typeAlias type="pack.controller.MemBean" alias="formBean"/>
 </typeAliases>
 <!--  DB 연결을 root-context.xml에서 하도록 수정.
 <properties resource="pack/mybatis/db.properties" />
 <environments default="dev">
  <environment id="dev">
   <transactionManager type="JDBC" />
   <dataSource type="POOLED">
    <property name="driver" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
   </dataSource>
  </environment>
 </environments>
 -->
 <mappers>
  <mapper resource="pack/mybatis/DataMapper.xml" />
 </mappers>
</configuration>

 => DataMapper.xml 연결.

 

 

 - DataMapper.xml

<mapper namespace="dev">
 <select id="selectAll" resultType="dto">
  select num, name, addr from mem
 </select>
 
 <select id="selectPart" parameterType="String" resultType="dto">
 select num, name, addr  from mem
 where num=#{num}
 </select>
 
 <insert id="insertData" parameterType="formBean">
 	insert into mem values(#{num}, #{name}, #{addr})
 </insert>
 
 <update id="updateData" parameterType="formBean">
 	update mem set name=#{name}, addr=#{addr}
 	where num=#{num}
 </update>
 
 <delete id="deleteData" parameterType="String">
 	delete from mem where num=#{num}
 </delete>
 
</mapper>

 => sql문 mapping.

 

 

- db.properties

driver=org.mariadb.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/happydb
username=root
password=123

 => 계정 정보 파일.

 

 

 - root-context.xml

<!-- PropertyPlaceholderConfigurer 사용 : 외부 프로퍼티의 정보를 설정파일에서 사용가능.-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<!-- locations 속성으로 db.properties를 read하도록 설정 -->
	<!-- db.properties의 프로퍼티를 ${프로퍼티값}으로 사용할 수 있다. -->
	<property name="locations">
		<value>classpath:pack/mybatis/db.properties</value>
	</property>
</bean>

<!-- SimpleDriverDataSource 사용 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
	<!--  -->
	<property name="driverClass" value="${driver}"/>
	<property name="url" value="${url}"/>
	<property name="username" value="${username}"/>
	<property name="password" value="${password}"/>
</bean>
<!-- SqlSessionFactoryBean 사용 -->
<!-- 복수개일 경우 id를 셋팅 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
	<!-- SqlMapConfig의 SqlSession에  Configuration.xml 연결-->
	<property name="dataSource" ref="dataSource"/>
	<property name="configLocation" value="classpath:pack/mybatis/Configuration.xml"></property>
</bean>

 => DB 연동. SqlFactory 객체 생성.

 

 

 - servlet-context.xml

<context:component-scan base-package="pack.controller" />
<context:component-scan base-package="pack.model" />

 => 어노테이션 스캔

 

 


② 모든 list 출력

 - index.jsp

<body>
	<h2>메인</h2>
	<ul>
		<li>인사관리</li>
		<li>영업관리</li>
	 	<li>물류관리</li>
	 	<li><a href="list">회원관리</a></li>
	 	<li>문의사항</li>
	</ul>
</body>

 => url "list" (Get 방식으로 송부)

 

 

- ListController

@Controller
public class ListController {
	@Autowired
	private MemDaoInter daoInter;
	
	@RequestMapping("list")
	public ModelAndView list() {
		/*
		List<MemDto> list = daoInter.getDataAll();
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("list");
		modelAndView.addObject("list", list);
		return modelAndView;
		*/
		return new ModelAndView("list","list",daoInter.getDataAll());
	}
}

 => @Controller : sevlet controller 동작.

 => url "list" 받을 경우 실행. list.jsp에 key("list")로 value(getDataAll() 리턴 값) 전달.

 

 

- MemBean

public class MemBean {
	private String num;
	private String name;
	private String addr;
	
	//getter/setter
}

 => FormBean작성. (insert/delete/update에 사용)

 

 

- MemDto

public class MemDto {
	private String num;
	private String name;
	private String addr;
	
	//getter/setter
}

 => DTO 작성(select에 사용)

 

 

- MemDaoInter

public interface MemDaoInter {
	List<MemDto> getDataAll();
	MemDto selectPart(String num);
	boolean insertData(MemBean bean);
	boolean updateData(MemBean bean);
	boolean deleteData(String num);
}

 => 다형성 프로그래밍을 위한 interface 사용.

 

 

- MemDaoImpl

@Repository
public class MemDaoImpl extends SqlSessionDaoSupport implements MemDaoInter{
	
	@Autowired
	public MemDaoImpl(SqlSessionFactory factory) {
		setSqlSessionFactory(factory);
	}

	@Override
	public List<MemDto> getDataAll() {
		return getSqlSession().selectList("selectAll");
	}
    ...
}

 => extends SqlSessionDaoSupport : sqlSession사용을 위해 상속진행.

 => 생성자 주입을 통한. sqlSessionFactory 객체 주입.

 => DataMapper.xml의 <select>태그의 id "selectAll" sql문 실행 결과 리턴

<select id="selectAll" resultType="dto">
 select num, name, addr from mem
</select>
...

 

 

 - list.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<body>
	<h2>*회원정보(@MVC - MyBatis : CRUD)</h2>
	<a href="insert">회원추가</a><br>
	
	<table border="1">
		<tr>
			<th>번호</th><th>이름</th><th>주소</th><th>변경</th>
		</tr>
		
		<c:forEach var="m" items="${list}">
			<tr>
				<td>${m.num}</td>
				<td>${m.name}</td>
				<td>${m.addr}</td>
				<td>
					<a href="update?num=${m.num}">수정</a>
					<a href="delete?num=${m.num}">삭제</a>
				</td>
			</tr>
		</c:forEach>
	</table>
</body>

 => 모든 list 출력 결과 실행.

 => 회원추가 하이퍼링크 클릭시 url "insert" 송부.(get방식)

 => 수정 하이퍼링크 클릭시 url "update" 송부.(get방식)(num 값 전달)

 => 삭제 하이퍼링크 클릭시 url "delete" 송부.(get방식)(num 값 전달)

 


③ 데이터 추가(Insert)

- InsertController

@Controller
public class InsertController {
	
	@Autowired
	private MemDaoInter daoInter;
	
	@RequestMapping(value = "insert", method = RequestMethod.GET)
	public String insert() {
		return "insform";
	}
	
	...
}

 => GET방식 url "insert" 받을 경우 insert() 메소드 실행.

 => insform.jsp 실행.

 

 

 - insform.jsp

<body>
	<h2>*회원입력</h2>
	<form action="insert" method="post">
		번호 : <input type="number" name="num"><br>
		이름 : <input type="text" name="name"><br>
		주소 : <input type="text" name="addr"><br>
		<input type="submit" value="추가">
	</form>
</body>

 => 회원정보 입력 <form> 생성.

 => submit시 url "insert" 송부(post방식).

 

 

- InsertController

@Controller
public class InsertController {
	
	@Autowired
	private MemDaoInter daoInter;
	...
	@RequestMapping(value="insert", method=RequestMethod.POST)
	public String submit(MemBean bean) {
		
		boolean b = daoInter.insertData(bean);
		if(b) {
			return "redirect:/list"; // list controller를 실행해야함으로 redirect로 보낸다. 
		}else {
			return "error";
		} 
	}
}

=> POST방식 url "insert" 받을 경우 submit() 메소드 실행.

=> <form>태그 value가 MemBean에 set된다.

=> bean값을 매개변수로 insertData()메소드 실행하여 insert 성공시 모든 list를 다시 출력하고,

     실패할 경우 error.jsp 실행.

 

 

 

- MemDaoImpl

@Repository
public class MemDaoImpl extends SqlSessionDaoSupport implements MemDaoInter{
	
	@Autowired
	public MemDaoImpl(SqlSessionFactory factory) {
		setSqlSessionFactory(factory);
	}

	...
	
	@Override
	public boolean insertData(MemBean bean) {
		try {
			getSqlSession().insert("insertData", bean);
			return true;
		} catch (Exception e) {
			System.out.println("insertData err"+e);
			return false;
		}
	}
	
	...
}

 => DataMapper.xml의 <insert>태그의 id "insertData" sql문 실행 결과 리턴

 

<insert id="insertData" parameterType="formBean">
 insert into mem values(#{num}, #{name}, #{addr})
</insert>

 

 

 - error.jsp

<body>
	<h2>에러가 발생하였습니다.</h2>
	<a href="list">회원자료</a> 보기
</body>

 => 에러 처리 jsp.

 


④ Data 수정(update)

- UpdateController

@Controller
public class UpdateController {
	@Autowired
	private MemDaoInter daoInter;
	
	@RequestMapping(value="update", method = RequestMethod.GET)
	public ModelAndView update(@RequestParam("num") String num) {
		MemDto dto = daoInter.selectPart(num);
		return new ModelAndView("upform","dto",dto);
	}
	...
}

=> GET방식 url "update" 받을 경우 update() 메소드 실행.

=> ?key=value값을 @RequestParam사용하여 num에 set.

=> selectPart()메소드 실행하여 검색 값 리턴하여 upform.jsp에 "dto"key로 값 전달.

 

 

 

- MemDaoImpl

@Repository
public class MemDaoImpl extends SqlSessionDaoSupport implements MemDaoInter{
	
	@Autowired
	public MemDaoImpl(SqlSessionFactory factory) {
		setSqlSessionFactory(factory);
	}
	...
	@Override
	public MemDto selectPart(String num) {
		return getSqlSession().selectOne("selectPart",num);
	}
	...
}

 => DataMapper.xml의 <select>태그의 id "selectPart" sql문 실행 결과 리턴

<select id="selectPart" parameterType="String" resultType="dto">
 select num, name, addr  from mem
 where num=#{num}
</select>

 

 

- upform.jsp

<body>
	<h2>* 회원 정보 수정</h2>
	<form action="update" method="post">
	번호 : ${dto.num}<br>
	<input type="hidden" name="num" value="${dto.num}">
	이름 : <input type="text" name="name" value="${dto.name}"><br>
	주소 : <input type="text" name="addr" value="${dto.addr}"><br>
	<input type="submit" value="수정">
	</form>
</body>

 => 검색한 Data를 초기값으로 set.

 => <form>태그 값 수정 후 submit시 url "update" post방식으로 전달.

 

 

- UpdateController

@Controller
public class UpdateController {
	@Autowired
	private MemDaoInter daoInter;
	...
	@RequestMapping(value="update", method = RequestMethod.POST)
	public String submit(MemBean bean) {
		boolean b = daoInter.updateData(bean);
		if(b) {
			return "redirect:/list";
		}else {
			return "error";
		}
	}
}

=> POST방식 url "update" 받을 경우 submit() 메소드 실행.

=> <form>태그 값 MemBean에 set.

=> bean을 매개변수로 updateData()메소드 실행하여 업데이트 성공시 list.jsp 출력. 실패 시 error.jsp실행.

 

 

 

- MemDaoImpl

@Repository
public class MemDaoImpl extends SqlSessionDaoSupport implements MemDaoInter{
	
	@Autowired
	public MemDaoImpl(SqlSessionFactory factory) {
		setSqlSessionFactory(factory);
	}
	...
	@Override
	public boolean updateData(MemBean bean) {
		try {
			getSqlSession().update("updateData", bean);
			return true;
		}catch (Exception e) {
			System.out.println("updateData err"+e);
			return false;
		}
	}
	...
}

 => DataMapper.xml의 <update>태그의 id "updateData" sql문 실행 결과 리턴

...
 <update id="updateData" parameterType="formBean">
 	update mem set name=#{name}, addr=#{addr}
 	where num=#{num}
 </update>
...

 

 


⑤ 데이터 삭제(Delete)

- DeleteController

@Controller
public class DeleteController {
	@Autowired
	MemDaoInter daoInter;
	
	@RequestMapping("delete")
	public String delete(@RequestParam("num") String num) {
		boolean b = daoInter.deleteData(num);
		if(b) {
			return "redirect:/list";
		}else {
			return "error";
		}
	}
}

=> GET방식 url "delete" 받을 경우 delete() 메소드 실행.

=> @RequestParam사용하여 num값 set.

=> num을 매개변수로 deleteData()메소드 실행하여 삭제 성공시 list.jsp 출력. 실패 시 error.jsp실행.

 

 

- MemDaoImpl

@Repository
public class MemDaoImpl extends SqlSessionDaoSupport implements MemDaoInter{
	
	@Autowired
	public MemDaoImpl(SqlSessionFactory factory) {
		setSqlSessionFactory(factory);
	}
	...
	@Override
	public boolean deleteData(String num) {
		try {
			int result = getSqlSession().delete("deleteData", num);
			return true;
		}catch (Exception e) {
			System.out.println("deleteData err"+e);
			return false;
		}
	}
}

 => DataMapper.xml의 <delete>태그의 id "deleteData" sql문 실행 결과 리턴

<delete id="deleteData" parameterType="String">
	delete from mem where num=#{num}
</delete>

 

[목차]

10. DDL

11. DML

12. 제약조건

13. Sequence

 

[내용]

10. DDL(Date Definition Language) : 테이블 생성, 수정, 삭제, 자동 commit

    1) 테이블 생성 

create table 테이블명(
     칼럼명 데이터 타입(크기)
      ....            );
create table board( 
no number, 
id varchar2(20), 
title varchar2(20), 
content varchar2(2), 
hit number, 
regdate date);
create table myemp(
empno char(5), ename varchar2(10), hiredate date, sal number(10), memo varchar2(10));

 

    2) 테이블 변경 - 추가

alter table 테이블명
add (칼럼명 데이터타입(크기));
alter table board
add (email varchar2(20));

 

 

    3) 테이블 변경 - 수정

alter table 테이블명
modify (칼럼명 데이터타입(크기));

 

alter table board
modify (content varchar2(20));

 

    4) 테이블 삭제

drop table 테이블명;
drop table emp2;


  
11. DML(Data Manipulation Language) : 데이터 조작어

    1) insert into : data 추가

insert into 테이블명
values(값,...);
insert into board values(1,'jang','test','test1',0,sysdate,null);

insert into board values(2,'kim','title','ccocnocnco',0,sysdate,'kwdd@naver.com');

insert into board values(6,'choi','oracle','안녕하세요?????',0,sysdate, null);
insert into myemp values('00001', 'scott', sysdate, 3000,'신입');

     - 선택 칼럼의 데이터만 입력하기

insert into emp (empno, ename, hiredate) values(1111,'이이이',sysdate);
insert into emp (empno, ename, hiredate, deptno) values(7777,'율곡', sysdate, 100);


    2) update

update 테이블
set
where
update board
set title ='oracle'
where no=1;
update board
set title='oracle', hit=hit+1
where no=4;

 

    - set절 서브쿼리 이용하여 조건에 맞는 값 update

update myemp
set sal=(select sal
         from emp
         where empno=7934)
where empno=7369;

 

update myemp
set sal=(select avg(sal)
		from emp
		where mgr=7698)
where ename is null;
update myemp
set sal =sal+300
where sal<(select avg(sal)
           from emp
           where mgr=7698);
-> where절 서브쿼리 이용 조건에 맞는 값 update

 


    3) delete

delete (into) from 테이블명
where
delete from board
where no=5;
delete board
where id is null;

    - where절 서브쿼리 이용 조건에 맞는 값 delete

delete from myemp
where sal>(select avg(sal)
           from myemp);

 

    4) 삽입된 데이터 저장하기

commit;

 


12. 제약조건

    - 테이블 생성시 제약조건 추가

create table 테이블명(
칼럼명 데이터타입(크기) 제약조건,
  ....                 );
create table emp2(id varchar2(10) primary key,
                  name varchar2(10) not null,
                  pass varchar2(10));
create table emp2(
    empno number(5),
    ename varchar2(10) not null,
    deptno varchar2(10),
    sal number,
    tel varchar2(10),
    job varchar2(10),
    constraints emp2_empno_pk primary key(empno));


    - 테이블에 적용된 제약 조건 확인

desc user_contraints
select OWNER,CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
from user_constraints;
OWNER
---------------------------------------------------------------------------------------------------------------------
CONSTRAINT_NAME                                              CO TABLE_NAME
------------------------------------------------------------ -- -----------------------------------------------------
SCOTT
SYS_C006997                                                  P  EMP

SCOTT
SYS_C007004                                                  C  EMP2

SCOTT
BOARD_ID_PK                                                  P  BOARD

SCOTT
EMP2_ID_FK                                                   R  EMP2

SCOTT
EMP2_SAL_CK                                                  C  EMP2

SCOTT
SYS_C007013                                                  P  DEPT2

SCOTT
EMP2_JOB_CK                                                  C  EMP2

     - 제약 조건 변경 (primary key)

alter table board
add constraint board_no_pk primary key(no);

 

     - 제약 조건 변경 (unique key)

alter table emp2
add constraint emp2_tel_uk unique(tel);

 

     - 제약 조건 변경 (check)

alter table 테이블
add constraint 제약조건명 check(조건);
alter table emp2
add constraint emp2_sal_ck check(sal between 5000 and 7000);

alter table emp2
add constraint emp2_job_ck check(job in('developer', 'siger', 'teacher'));

 

     - 제약 조건 변경 (foreign key)

alter table 테이블명
add constraiont 제약조건명 foreign key(칼럼) references 테이블명2(칼럼2);
                        primary key(칼럼);
alter table emp2
add constraint emp2_deptno_fk foreign key(deptno) references dept2(decode);
alter table emp2
add constraint emp2_id_fk foreign key(id) references board(id);

 

    - 제약조건 삭제

alter table emp2
drop constraint emp2_empno_pk;

 

 

13. Sequence
    - 시퀀스 생성

create sequence 시퀀스명;
create sequence board_seq;

 

    - 시퀀스 시작값 설정

create sequence tb_order_seq
start with 2020111100;

    - 현재 시퀀스 확인.

select 시퀀스명.currval form dual;
select tb_order_seq.currval from dual;
->현재 sequence 확인.

    - 다음 시퀀스

select board_seq.nextval from dual;
insert into board(no, title,regdate,hit)
            values(board_seq.nextval, 'text', sysdate,0);

 

14. on delete cascade :  미사용 권장

   - on delete cascade추가하여 foreign 제약조건 추가.

alter table tb_order
add constraint order_fk foreign key(id) references tb_customer(id) on delete cascade;

 

- on delete cascade foreign키 삭제 시 error 발생

drop table tb_customer;

- on delete cascade constraint 삭제

drop table tb_customer cascade constraints;
alter table tb_order
add constraint id_notnull not null(id);
-> error

alter table tb_order
modify id varchar2(10) not null;
-> not null 조건 추가
create table myemp
as
select empno, ename,sal, mgr, hiredate
from emp
where 1=1;
-> 테이블 생성
-> 데이터 들어감

create table myemp2
as
select empno, ename,sal, mgr, hiredate
from emp
where 1=2;
-> 테이블 생성
-> 데이터 안들어감
insert all
     into myemp values(7777,'aaaaa',1000,7475,sysdate)
     into myemp2 values(7777,'aaaaa',1000,7475,sysdate)
select * from dual;
-> myemp, myemp2에 date insert
insert all
     into myemp2 values(1111,'bbbb',1000,7475,sysdate)
     into myemp2 values(2222,'ccccc',1000,7475,sysdate)
select * from dual;
-> myemp2에 2개 date insert

   - Data Dictionary : 읽기전용
   - rollback;

   - 모든 테이블 삭제

SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' FROM user_tables;

+ Recent posts

1