20220803_WEN
사원 이름에 '김'이라는 글자가 들어간 사원의 모든 정보 조회
SELECT *
FROM EMP
WHERE ENAME = LIKE '%김%';
cf) WHERE ENAME NO LIKE '%김%; 이름에 김을 포함하지 않을 때
(주의! '=' 이 아닌 LIKE 사용한다!!)
와일드 카드: '%','_'
'_' : 하나의 어떤 글자를 의미한다.(한 글자) '__'(두글자)
EX)
'김' : 김으로 시작하는 두글자 의미
'__김' :김으로 끝나는 세글자
'김__' : 두번째 글자가 김으로 고정되어있는 네글자를 의미
'%': 0개이상의 어떤 글자를 의미한다.
EX)
'김%' :김으로 시작하는 모든 글자(글자수 제한X)
'%김' :김으로 끝나는 모든 글자(글자수 제한X)
주요 함수
내가 SELECT 할때 연습용으로 만든 테이블이 DUAL이다.
절대값 함수 ABS()
SELECT -10, ABS(-10)
FROM DUAL;
INSERT INTO BOARD (
BOARD_NUM
, TITLE
, CONTENT
, WRITER
) VALUES (
(SELECT NVL(MAX(BOARD_NUM), 0) + 1 FROM BOARD)
, 'jAva'
, '내용입니다.'
, '홍길동'
);
(예제) 게시판에서 제목에 java라는 글자가 포함되는 게시글의 모든 정보를 조회
단, 대소문자 구분 하지 않는다.
SELECT *
FROM BOARD
WHERE UPPER(TITLE) LIKE UPPER('%java%');
글자 중 3번째 글자부터 시작하겠다./ 3번째글자부터 6자리까지 하겠다(공백도 포함!!)
SELECT SUBSTR('Welcome Oracle',3), SUBSTR('Welcome Oracle',3,6)
FROM DUAL;
형변환
: NUMBER,VARCHAR2(), DATE
--문자를 숫자로, -> TO_NUMBER()
--숫자를 문자로, ->TO_CHAR()
--날짜를 문자로, ->TO_CHAR()
--문자를 날짜로-> TO_DATE()
--숫자를 날짜로 가능(숫자-문자-날짜)
숫자 10을 문자 10으로 형변환
SELECT 10,TO_CHAR(10)
FROM DUAL;
cf) 우측정렬: 숫자 좌측정렬: 문자
SELECT SYSDATE
FROM DUAL;
오늘 날짜를 문자로 형변환
SELECT SYSDATE,TO_CHAR(SYSDATE)
FROM DUAL;
원하는 형식으로 오늘 날짜 문자로 형 변환하기 (많이사용하니 암기하기!)
SELECT SYSDATE,TO_CHAR(SYSDATE,'YYYY-MM-DD') --'-' 사용
, TO_CHAR(SYSDATE,'YYYY.MM.DD') -- '.' 사용
, TO_CHAR(SYSDATE,'MM')-- 월
, TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') --오늘날짜 시 분 초
, TO_DATE('20220803') -- 문자를 날짜로 이기때문에 ''홀따옴표로 감싸서 사용
FROM DUAL;
SELECT SYSDATE,TO_CHAR(SYSDATE,'YYYY-MM-DD')
, TO_CHAR(SYSDATE,'YYYY.MM.DD')
, TO_CHAR(SYSDATE,'MM')
, TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') --오늘날짜 시 분 초
, TO_DATE('20220803','YYYYMMDD')
FROM DUAL;
DESC EMP; -- 간단히 테이블을 묘사하다
유형에서 ()괄호안은 자릿수 의미
예제01)
--입사일이 2003년 09월 02일 이후에 입사한 사원 정보 모두 조회
SELECT *
FROM EMP
WHERE HIREDATE >= TO_DATE('20030902'); --(주의)비교할 때 데이터 타입 맞춰줘야함!!!
예제02)
3월 입사 모든 사원 정보조회
SELECT *
FROM EMP
WHERE TO_CHAR(HIREDATE,'MM') ='03';--문자('')끼리 비교
이클립스 - 디비-자바
프로젝트명 : MybatisBoard_0802
위에서 배운대로 날짜 형 변환하기
<!-- 항상 쿼리 실행결과를 염두하고 만들어라. -->
<select id="selectBoardList" resultMap="board"><!-- resultmap은 위에 id와 같다. -->
SELECT BOARD_NUM
, TITLE
, WRITER
, TO_CHAR(CREATE_DATE,'YYYY-MM-DD') AS CREATE_DATE
//형변환 대신 오류발생함
//왜? 실제로 조회를 하면 원래 저장되어있던 컬럼명이 TO_CHAR로 되어있지않기때문에 따로 별칭을 원래대로 CREATE_DATE로 지정해주면 오류가 발생하지 않는다.
, READ_CNT
FROM BOARD
ORDER BY BOARD_NUM DESC
참고)
<select id="selectBoardDetail" resultMap="board"><!--여러문자열과 숫자를 가져오는(resultMap) board라는 타입으로 담아서 가져오겠다. -->
SELECT BOARD_NUM
, TITLE
, WRITER
, CONTENT
, CREATE_DATE
, READ_CNT
FROM BOARD
WHERE BOARD_NUM = #{adsdf98498s} <!-- 빈값은 ?값 대신 #{}넣어주기 -->
</select>
자바와 디비 연결 실무Ver.
-mybatis.pptx 참고 읽어보기
-프로젝트 내 생성한 모든 파일
package controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dto.BoardDTO;
import service.BoardServiceImpl;
@WebServlet("*.bo")
public class BoardController extends HttpServlet {
private static final long serialVersionUID = 1L;
private BoardServiceImpl boardService;// ⓐ변수만 선언한다.
private String boardNum;
public BoardController() {
boardService = new BoardServiceImpl();//ⓑ생성자에서 초기화 선언
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글 인코딩 처리
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String requestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String command = requestURI.substring(contextPath.length());
System.out.println("command = " + command);
String page = "";
boolean isRediect = false;
//게시글 목록페이지로 이동
if(command.equals("/boardList.bo")) {
List<BoardDTO> boardList = boardService.selectBoardList();//객체명.메소드명()
//--> boardDAO.selectBoardList();는 자료형 리턴값List<BoardDTO> 으로 나에게 던져서 돌려준다.
//화면에 보여주기위해 돌려줄 때 데이터 던져주기!!
request.setAttribute("boardList", boardList);
page="board_list.jsp";
}
//상세보기조회
else if(command.equals("/detailBoard.bo")){
int boardNum = Integer.parseInt(request.getParameter("boardNum"));
BoardDTO board = boardService.selectDetailBoard(boardNum);//boardNum 데이터가 넘겨주기(객체x)
boardService.updateReadCnt(boardNum);
request.setAttribute("board", board);
page ="detail_board.jsp";
}
//글 등록 양식 페이지
else if(command.equals("/regBoardForm.bo")) {
page ="reg_board_form.jsp";
}
//실제 글쓰기 등록
else if(command.equals("/regBoard.bo")) {
String title = request.getParameter("title");
String writer = request.getParameter("writer");
String content = request.getParameter("content");
BoardDTO board = new BoardDTO();//board 객체생성 << 위에 가져온 데이터 담을 통만 만들었음
//빈 통에다가 실제 채워질 값을 넣어준다.
board.setContent(content);
board.setTitle(title);
board.setWriter(writer);
boardService.insertBoard(board);//board 객체생성
page ="detailBoard.bo?boardNum= "+ boardNum;
isRediect =true;
}
//삭제
else if(command.equals("/deleteBoard.bo")) {
int boardNum = Integer.parseInt(request.getParameter("boardNum"));
int result = boardService.deleteBoard(boardNum);
request.setAttribute("result", result);
page= "boardList.bo";
isRediect = true;
}
//수정 양식페이지
//실제 수정하기 전에 먼저 상세정보조회를 해야한다!!!
else if(command.equals("/updateBoardForm.bo")) {
int boardNum =Integer.parseInt(request.getParameter("boardNum"));
BoardDTO board = boardService.selectDetailBoard(boardNum);
request.setAttribute("board", board);
page= "update_board_form.jsp";
}
//실제 글 수정
else if(command.equals("/updateBoard.bo")) {
int boardNum = Integer.parseInt(request.getParameter("boardNum"));
String title = request.getParameter("title");
String content = request.getParameter("content");
String writer = request.getParameter("writer");
BoardDTO board = new BoardDTO();
board.setBoardNum(boardNum);
board.setContent(content);
board.setTitle(title);
board.setWriter(writer);
boardService.updateBoard(board);
page= "detailBoard.bo?boardNum="+ boardNum;
//ex) 글번호 10일 때,
//page= detailBoard.bo?boardNum=10 글번호가 10인 게시글데이터 가지고 상세보기 페이지이동.
isRediect = true;
}
//페이지이동에 사용되는 if문
if(isRediect) {
response.sendRedirect(page);
}
else {
RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
}
<?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">
<!-- 해당 파일에 모든 쿼리문을 작성한다. -->
<mapper namespace="boardMapper">
<!--resultmap: db에서 조호된 데이터를 자바로 가져올 때
어떻게 가져올지에 대한 정의를 말한다. -->
<!-- TYPE :조회된 데이터를 저장할 수 있는 DTO클래스를 사용한다. 단, 패키지명까지 포함한다.(EX.dto.BoardDTO) -->
<!--조회된데이터를 보드dto에 담아서 가져오겠다-->
<!-- id 컬럼은 (pk)기본키 -->
<resultMap type="dto.BoardDTO" id="board"><!--dto라는 패키지안에있는 자료형 BoardDTO / board는 resultmap의 모든것을 지칭하는 이름 -->
<id column="BOARD_NUM" property="boardNum"/><!--컬럼을 property 변수명으로 가져오겠다. property: dto에 담긴 변수명을 뜻함 -->
<result column="TITLE" property="title"/>
<result column="WRITER" property="writer"/>
<result column="CONTENT" property="content"/>
<result column="CREATE_DATE" property="createDate"/>
<result column="READ_CNT" property="readCnt"/>
</resultMap>
<!--실행하고자 하는 쿼리문에 따라서 적절한 태그르 만든 후
그 태그안에서 쿼리르 작성한다.
각 태그안에는 id(쿼리이름뭐로할래?) 속성을 먼저 정해줘야한다.-->
<!-- select태그는 반드시 조회 결과를 어떻게 자바로 가져올지에 대한 정의를 해줘야 한다.
조회된 데이터가 자바에서 제공하는 자료형(int, String)인 경우에는
resultType을 사용한다.
만약 조회 결과를 자바로 가져오기 위해 클래스형 사용해야한다면
resultMap을 사용해야 한다.-->
<!-- <select id="aaa" resultType="int">쿼리실행결과가 '300'이기때문에 정수형 자료형 int 결과타입
SELECT SAL
FROM EMP
WHERE EMPNO = 101
</select> -->
<!--게시글 목록조회 -->
<!-- 항상 쿼리 실행결과를 염두하고 만들어라. -->
<select id="selectBoardList" resultMap="board"><!-- resultmap은 위에 id와 같다. -->
SELECT BOARD_NUM
, TITLE
, WRITER
, TO_CHAR(CREATE_DATE,'YYYY-MM-DD') AS CREATE_DATE
, READ_CNT
FROM BOARD
ORDER BY BOARD_NUM DESC
</select>
<!-- 등록 -->
<insert id="insertBoard">
INSERT INTO BOARD (
BOARD_NUM
, TITLE
, WRITER
, CONTENT
) VALUES (
(SELECT NVL(MAX(BOARD_NUM),0)+1 FROM BOARD)
, #{title}
, #{writer}
, #{content}
)
</insert>
<!-- 상세보기-->
<select id="selectBoardDetail" resultMap="board"><!--여러문자열과 숫자를 가져오는(resultMap) board라는 타입으로 담아서 가져오겠다. -->
SELECT BOARD_NUM
, TITLE
, WRITER
, CONTENT
, CREATE_DATE
, READ_CNT
FROM BOARD
WHERE BOARD_NUM = #{boardNum} <!-- 빈값은 ?값 대신 #{}넣어주기 -->
</select>
<!-- 삭제-->
<delete id="deleteBoard">
DELETE BOARD
WHERE BOARD_NUM = #{boardNum}
</delete>
<!-- 수정-->
<update id="updateBoard">
UPDATE BOARD
SET
TITLE = #{title}
, WRITER = #{writer}
, CONTENT = #{content}
WHERE BOARD_NUM = #{boardNum}
</update>
<!-- 조회수 증가-->
<update id="updateReadCnt">
UPDATE BOARD
SET
READ_CNT = READ_CNT +1
WHERE BOARD_NUM = #{boardNum}
</update>
</mapper>
package service;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import dto.BoardDTO;
import sqlmap.SqlSessionManager;
//쿼리작업하는 곳
public class BoardServiceImpl implements BoardService{
//쿼리 실행하는 객체
SqlSessionFactory sqlSessionFactory = SqlSessionManager.getSqlSession();
SqlSession sqlSession = sqlSessionFactory.openSession();
//목록조회 기능(쿼리실행시 데이터 여러줄 나오니까 -> selectList)
@Override
public List<BoardDTO> selectBoardList() {
//조회한 데이터가 한줄 나오냐 두줄이상 나오냐에 따라
//괄호안에 board-mapper에 있는 nameSpace명.목록조회id명
List<BoardDTO> list = sqlSession.selectList("boardMapper.selectBoardList");//복수붙여넣기!!
sqlSession.commit();
//쿼리에서 빈값이 없어서 빈값채워줄 일 없을때는 매개변수 하나만!
return list;
}
//상세보기 조회 기능(쿼리실행시 데이터가 한 줄 나오니까 -> selectOne)
@Override
public BoardDTO selectDetailBoard(int boardNum) {
//조회하고 나면 리턴으로 데이터 가져온다!!!(result는 조회된 모든 데이터를 담아간다)
BoardDTO result = sqlSession.selectOne("boardMapper.selectBoardDetail", boardNum);//""쿼리문 실행할때 빈값은 위 매개변수로 채워주겠다.
sqlSession.commit();
//오타안나도록 복사붙여넣기!!
//매개변수 int 하나 있어서 괄호안에 매개변수 총 2개 있는것!
return result; //데이터 리턴해서 보내주기
}
//게시글 등록
@Override
public int insertBoard(BoardDTO boardDTO) {
//insertBoard는 쿼리실행위해 만들었기 때문에 사용하려면 쿼리 객체(sqlSession) 불러온다.
//보드맵퍼 파일 안에 insertBoard매소드가 있는데 메소드안에 빈값채울수있는 매개변수 boardDTO를 가져와서 사용한다.
//데이터를 가젹오기위해서 리턴해줘야하기때문에 리턴값 int로 받은 result라는 이름으로 만들어서 리턴시켜준다.
int result = sqlSession.insert("boardMapper.insertBoard", boardDTO);
sqlSession.commit();
return result;
}
//게시글 삭제
@Override
public int deleteBoard(int boardNum) {
int result = sqlSession.delete("boardMapper.deleteBoard", boardNum);
sqlSession.commit();
return result;
}
//게시글 수정
@Override
public int updateBoard(BoardDTO boardDTO) {
int result = sqlSession.update("boardMapper.updateBoard", boardDTO);
sqlSession.commit();
return result;
}
@Override
public int updateReadCnt(int boardNum) {
int result = sqlSession.update("boardMapper.updateReadCnt",boardNum);
sqlSession.commit();
return result;
}
}
package service;
import java.util.List;
import dto.BoardDTO;
//인터페이스는 메소드의 정의만 올 수 있다.
// public void aaa();--> 인터페이스
public interface BoardService {
//게시글 목록조회
List<BoardDTO> selectBoardList();
//게시글 등록
int insertBoard(BoardDTO boardDto);
//게시글 상세정보조회(한줄만 조회되니까 리스트말고 그냥보등dto)
BoardDTO selectDetailBoard(int boardNum);//매퍼 쿼리문에서 빈값 ? 채워야해서 매개변수로 들고옴
//게시글 삭제
int deleteBoard(int boardNum);
//게시글 수정
int updateBoard(BoardDTO boardDTO);
//게시글 조회수증가
int updateReadCnt(int boardNum);
}
한 페이지에서 여러화면(jsp) 동시 구성 만들기
프로젝트명 : TemplateProject
1.index파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("*.do")
public class TemplateController extends HttpServlet {
private static final long serialVersionUID = 1L;
public TemplateController() {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글 인코딩 처리
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String requestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String command = requestURI.substring(contextPath.length());
System.out.println("command = " + command);
String page = "";
boolean isRediect = false;
//(index.jsp)에서 넘어오는 페이지
//메인페이지로 이동
if(command.equals("/main.do")) {
page=".jsp";
}
//페이지이동에 사용되는 if문
if(isRediect) {
response.sendRedirect(page);
}
else {
RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
}
3.동시 구성할 화면 jsp 파일 만들기
-top.jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
-main1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>