반응형

게시판 글쓰기 기능

 

글 등록하기

 

reviewController.java

// 게시판 글쓰기 기능
	@GetMapping("/write")
	public String writeform() throws Exception{
		return "/writeform";
	}
	@PostMapping("insert")
	public String insertreview(reviewVo reviewvo) throws Exception{
		boolean result = reviewservice.insertreview(reviewvo);
		if (result) {
			return "success";
		} else {
			return "error";
		}
	}

 

reviewMapper.xml

	<!-- 게시판 글쓰기 기능 -->
	<insert id="insertreview">
		insert into reviewTable(reTitle, reContent, reUser)  values(#{reTitle}, #{reContent}, #{reUser})
	</insert>

reviewmapper.java

	// 문의 글 쓰기
	public boolean insertreview(reviewVo reviewvo) throws Exception;

reviewService.java

	// 게시글 작성 
	public boolean insertreview(reviewVo reviewvo) throws Exception {
		return reviewmapper.insertreview(reviewvo);
	}

 

writeform.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
** 글쓰기 **
<form action="insert" method="post">
글제목: <input type="text" name="reTitle"><br>
작성자: <input type="text" name="reUser"><br>
글내용: <textarea rows="5" cols="30" name="reContent"></textarea>
<br><br>
<input type="submit" value="저장">
</form>
</body>
</html>

 

게시글 상세보기

글 제목을 누르면 해당하는 글 번호의 내용을 상세보기로 출력 시켜주도록 하는 방법입니다.

 

list.jsp의 내용을 변경

<td><a href="detailreview?reNum=${item.reNum}">${item.reTitle}</a></td>

 

reviewService.java 추가

	// 게시글 상세보기
	public reviewVo detail(Integer reNum) throws Exception {
		return reviewmapper.detail(reNum);
	}

 

reviewController.java 내용 추가

	// 게시글 자세히보기
	@RequestMapping(value="/detailreview")
	public ModelAndView detail(@RequestParam("reNum") int reNum) throws Exception {
		
		// 
		return new ModelAndView("detail","detail",reviewservice.detail(reNum));
	}

 

reviewmapper.java 내용 추가

	// 문의글 상세 보기
	public reviewVo detail(Integer reNum) throws Exception;

 

reviewMapper.xml 내용 추가

	<!-- 게시글 상세보기 -->
	<select id="detail" resultType="reviewVo">
		select * from reviewTable where reNum = #{reNum}
	</select>

 

detail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload = function() {
	document.getElementById("btnList").onclick = function() {
		location.href="/";
	}
	document.getElementById("btnUpdate").onclick = function() {
		
		if(confirm("정말수정할까요")) {
	
			frm.action="/updatereview";
			frm.submit();
		}
	}
	document.getElementById("btnDelete").onclick = function() {
		if(confirm("정말 삭제할까요?")) {
			frm.action="deletereview";
			frm.submit();
		}
	}
}
</script>

</head>
<body>
** 상세보기 **
<br>
<form name="frm" method="get">
<table border="2">
	<tr>
		<td>번호</td>
		<td>${detail1.reNum}</td>
		<input type="hidden" value="${detail1.reNum}" name="reNum">
		
	</tr>
	<tr>
		<td>작성자</td>
		<td>${detail1.reUser}</td>	
	</tr>
		<tr>
		<td>제목</td>
		<td>${detail1.reTitle}</td>
	</tr>
		<tr>
		<td>글내용</td>
		<td>${detail1.reUser}</td>
	</tr>
	</tr>
	<tr>
		<td>작성일</td>
		<td>${detail1.reregisterDate}</td>
	</tr>
	<tr>
		<td>조회수</td>
		<td>${detail1.reCnt}</td>
	</tr>
		<tr colspan="3">
		<td>
		<input type="button" value="목록" id="btnList">
		<input type="button" value="수정" id="btnUpdate">
		<input type="button" value="삭제" id="btnDelete">
		</td>
	</tr>
</table>
</form>
</body>
</html>

 

글을 눌렀을때 나오는 결과 페이지

 

 

글 수정하기

우선 상세보기에 사용하였던 메소드를 수정할 jsp 폼에 불러옵니다.

 

reviewController.java

	@GetMapping("/updatereview")
	// 여기서 RequestParam("num")은 detail.jsp에서 input 값의 reNum
	public ModelAndView update(@RequestParam("reNum") String reNum) throws Exception {
		
		return new ModelAndView("upform","up",reviewservice.detail(reNum));
	}

upform.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload = function() {

	document.getElementById("btnUpdate").onclick = function() {
		
		if(confirm("정말수정할까요")) {
	
			frm.action="updatereviewcommit";
			frm.submit();
		}
	}
}
</script>

</head>
<body>
** 수정하기 **
<br>
<form name="frm" method="post">
<table border="2">
	<tr>
		<td>번호</td>
		<td>${up.reNum}</td>
		<input type="hidden" value="${up.reNum}" name="reNum">
		
	</tr>
	<tr>
		<td>작성자</td>
		<td>${up.reUser}</td>	
	</tr>
		<tr>
		<td>제목</td>
		<td><input type="text" value="${up.reTitle}" name="reTitle"></td>
	</tr>
		<tr>
		<td>글내용</td>
		<td><textarea rows="5" cols="50" name="reContent">${up.reContent}</textarea></td>
	</tr>
	</tr>
	<tr>
		<td>작성일</td>
		<td>${up.reregisterDate}</td>
	</tr>
	<tr>
		<td>조회수</td>
		<td>${up.reCnt}</td>
	</tr>
		<tr colspan="3">
		<td colspan="3">
		<input type="button" value="수정" id="btnUpdate" style="margin: auto; width: 100%;">
		</td>
	</tr>
</table>
</form>
</body>
</html>

 

 

여기서 제목과 내용을 수정 후 수정하기 버튼을 클릭 하면

 

reviewMapper.xml

	// 문의글 수정하기
	int updatereview(reviewVo vo) throws Exception;

 

reviewmapper.java

	// 문의글 수정하기
	int updatereview(reviewVo vo) throws Exception;

 

reviewService.java

	// 게시글 수정하기
	public int updatereview(reviewVo vo) throws Exception {
		return reviewmapper.updatereview(vo);
	}

reviewController.java

	@PostMapping("/updatereviewcommit")
	public String updatesubmit(reviewVo vo) throws Exception {
		int result = reviewservice.updatereview(vo);
		System.out.println("result " + result);
		if ( result > 0 )
			return "redirect:/";
		else
			return "error";
	}

 

현재 10번 글을 수정해보겠습니다.

 

 

 

 

글 삭제하기

 

reviewMapper.xml

	<!-- 글 삭제하기 -->
	<delete id="deletereview">
		delete from reviewTable where reNum = #{reNum}
	</delete>

 

reviewmapper.java

	// 게시글 삭제하기
	public int deletereview(String num) throws Exception;

 

reviewService.java

	// 게시글 삭제하기
	public int deletereview(String num) throws Exception {
		// TODO Auto-generated method stub
		return reviewmapper.deletereview(num);
	}

 

reviewController.java

	
	// 게시글 삭제하기
	@GetMapping("/deletereview")
	public String del(@RequestParam("reNum") String num) throws Exception {
		int delresult = reviewservice.deletereview(num);
		if(delresult > 0 )
			return "redirect:/";
		else
			return "error";
	}
	

 

현재 글이 10번까지 있는 것을 확인 할 수 있습니다.

 

10번 글을 지우도록 하겠습니다.

삭제가 정상적으로 된 것을 볼 수 있습니다.

 

반응형
반응형

* 윈도우에서 python용 MySql(MariaDB) 드라이버 설치 방법

버전별 드라이버 다운로드 http://www.lfd.uci.edu/~gohlke/pythonlibs/

사이트에서 mysqlclient 로 검색하여 원하는 파일( mysqlclient-1..-cp3*-cp3*m-win_amd64.whl )을 다운로드하면 된다.

확장자를 zip으로 변경하고 압축을 풀어준다. 

풀린 파일과 폴더들을 복사한 후 C:\Python3*\Lib\site-packages 에 붙여넣기 하면 된다.

또는 pip install ... 해주면 된다.

이클립스에서 MariaDB를 연결하는 방법은 다음과 같습니다.

 

방법 1.

conn = MySQLdb.connect(host = '127.0.0.1', user = '사용자이름', password='비밀번호', database='DB명')

ex)
conn = MySQLdb.connect(host = '127.0.0.1', user = 'root', password='123', database='test')

또는 다음과 같이 작성해주시면됩니다.

 

config = {

    'host':'127.0.0.1',
    'user':'사용자이름',
    'password':'비밀번호',
    'database':'DB명',
    'port':3306,
    'charset':'utf8',
    'use_unicode':True
}

ex)

config = {

    'host':'127.0.0.1',
    'user':'root',
    'password':'123',
    'database':'test',
    'port':3306,
    'charset':'utf8',
    'use_unicode':True

}

 

이번에는 제가 만든 테이블에 데이터를 삽입하고 결과를 출력해보겠습니다.

 

table prac

CREATE TABLE prac(num INT(255) NOT NULL PRIMARY KEY,
NAME VARCHAR(20),
HOUR INT(11),
pay INT(11))
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

 

 

위 DB연결 코드 밑에 데이터 삽입 SQL문을 넣고 결과를 보겠습니다

 

try:
    conn = MySQLdb.connect(**config)
    print(conn) # DB가 잘 연결되었는지 확인
    cursor = conn.cursor() # SQL문 수행을 위한 커서 객체 생성
    
   
        
except Exception as e:
    print('err : ',  e) 
    
finally:
    cursor.close()
    conn.close()

# print(conn) 의 출력 결과
<_mysql.connection open to '127.0.0.1' at 0000025181F6F578>

try문 내의 코드는 다음과 같습니다.

 

- import MySQLdb 를 하여 MySQLdb 모듈을 불러옵니다.

 

- MySQLdb.connect(**config) 메소드를 통하여 MySQL에 연결해줍니다. 호스트명, 사용자명, 암호, 접속할 DB, 포트, 등을 기재합니다.

 

- DB 접속이 성공하면, Connection 객체로부터 cursor() 메서드를 호출하여 Cursor 객체를 가져옵니다.

 

- cursor 객체를 생성하였다면 이제 이 객체로 SQL의 DML 명령어들을 다 수행할 수 있습니다.

 

이제 자료를 추가하고 수정하고 삭제하는 DML 명령어들을 작성해보겠습니다. 

 

지금부터 작성되는 내용들은 try ~ except 안에 추가로 작성해주시면됩니다.

 

1. 자료 추가 ( insert ) , 자료 조회 ( select )

방법 1.

# 자료 추가
    sql = "insert into prac(num, NAME, HOUR, pay) values (1, '홍길동',3,8000)"
    cursor.execute(sql) # 결과가 1이면 commit한다 아니면 rollback execute에 사실 리턴값이 존재
    conn.commit()
    
#select 전체자료 읽기
    sql = 'select * from prac'
    cursor.execute(sql)
    
    # 출력1 튜플 타입으로 출력된다
    for data in cursor.fetchall():
        print(data)
        
        
# 출력결과

(1, '홍길동', 3, 8000)

 insert 문을 사용하여 각각의 컬럼에 맞게 값들을 입력해주었습니다.

 

이후 cursor객체에 execute를 사용해  실행할 sql문이 들어있는 변수를 입력해줍니다.

그 후 commit() 과정을 해주어야 합니다.

그 이유는 Autocommit 이 아니기때문입니다. 자동으로 commit 실행을 하고싶다면, connect() 메서드 호출시 autocommit=True 를 지정해줍니다.

 

insert문이 잘 실행되었는지 보기 위해 select 문도 작성하고, 반복문 for을 통해 데이터가 잘 삽입 되었는지 출력해보았습니다.

 

이번에는 다른 방법으로 insert 문과 select문을 사용해보겠습니다.

방법 2.

 sql = "insert into prac values(%s,%s,%s,%s)" # 자바는 values에 ?가 들어감
    sql_data = (2, 'insert2','5', 9000)
    cursor.execute(sql, sql_data)
    conn.commit()
    
    
    
     # 출력 2 
     # 반복문 for에 cursor 객체 값들을 r에 넣고 출력
     # list로 출력
    for r in cursor: 
    
     # 배열에 저장되는 값들은 다음과 같습니다.
        print([r[0], r[1], r[2], r[3]]) # r[0] = num값 r[1] name값 r[2] HOUr값 r[3] pay값 저장     
        
# 출력 결과

[1, '홍길동', 3, 8000]
[2, 'insert2', 5, 9000]


 

방법 3.

 

    sql = "insert into prac values(%s,%s,%s,%s)" # 자바는 values에 ?가 들어감
    sql_data = '3','insert3',5,6000
    cursor.execute(sql, sql_data)
    conn.commit()

# 출력 3
# 이번에는 매핑을 이용하여 서로 값이 일치하게 저장되도록 합니다.
    for (num, NAME, HOUR, pay) in cursor:
        print(num, NAME, HOUR, pay)
       	print()

# 출력4
    for (a, b, c, d) in cursor: # 매핑한거라 값은 같게 출력
        print(a, b, c, d)

# 출력 결과

1 홍길동 3 8000
2 insert2 5 9000
3 insert3 5 6000

1 홍길동 3 8000
2 insert2 5 9000
3 insert3 5 6000

 

update / delete 문 사용 후 출력 방식은 출력 1에서 사용한 방법으로 출력하도록 하겠습니다.

 

2. UPDATE

# 자료 수정

    sql = "update prac set NAME = %s, HOUR=%s, pay=%s where num=%s"
    sql_data = ('홍씨에서이씨', 5, 10000, 1)
    cursor.execute(sql, sql_data)
    conn.commit()


    #select 전체자료 읽기
    sql = 'select * from prac'
    cursor.execute(sql)
    
    # 출력1

    for data in cursor.fetchall():
        print(data)
        
        
# 출력 결과

(1, '홍씨에서이씨', 5, 10000)
(2, 'insert2', 5, 9000)
(3, 'insert3', 5, 6000)

 

3. DELETE

 

방법 1)

 

    # 자료 삭제 
    num = '1'
    sql = "delete from prac where num = " + num #권장x
    cursor.execute(sql)
    conn.commit()


	# 출력 결과
    
    (2, 'insert2', 5, 9000)
	(3, 'insert3', 5, 6000)

 

방법 2)

 

    num = '2'

    sql = "delete from prac where num='{0}'".format(num) 
    cursor.execute(sql)
    conn.commit()
    
    
    # 출력 결과
    
    (3, 'insert3', 5, 6000)

 

방법 3)

 

    num = '3'

    sql = "delete from prac where num=%s" #가장많이 쓰는 방법 밑에 cursor와 매핑 할땐 튜플형태로 줘라
    cursor.execute(sql, (num, ))
    conn.commit()
    
    
    # 출력 결과
    
    

 

참고사이트

 

https://cafe.daum.net/flowlife

 

반응형

'python' 카테고리의 다른 글

[python] Numpy 데이터타입, 메모리저장, 배열  (0) 2020.05.28
python - Thread ( 스레드 ) (1)  (0) 2020.05.14
python - 예외처리  (0) 2020.05.11
python - OS & pickle  (0) 2020.05.11
python - 상속 (2)  (0) 2020.05.10
반응형

# Tuple ( 리스트와 유사, 읽기 전용, 중복을 허용 )

# 빠른 속도를 요구할 때 사용하면 좋다.

 

Ex 1)

1
2
3
4
5
6
= ('a''b''c''a')
 
print(t)
 
print(t, ' ' , t.count('a'),'개 ' , t.index('b'))
print(t[0])

 

출력 결과

 

 

Tuple은 읽기 전용이라 수정하면 에러가 발생합니다 ! 수정을 하고 싶다면 리스트 형태로 주어야 합니다.

 

예시. t[0] = m을 하였을 경우

리스트로 담아서 넘길 경우

 

1
2
3
4
= list(t)
q[0= 'm'
= tuple(q) # q를 tuple로 지정하여 t 에 저장
print(t)

출력결과

 

 

Ex 2)

- 변수에 요소 값이 1개를 tuple로 받아주고 싶을 경우 요소 뒤에 , 를 찍어주어야 한다.

- 그렇지 않으면 int 로 받아들여 tuple이 아니게 된다.

 

1
2
3
4
5
kk = (1)
print(kk, type(kk)) 
 
kk2 = (1,)
print(kk, type(kk), kk2, type(kk2))

 

출력 결과

 

 

집합 자료형 SET ( 순서 없고 중복도 불가능하다. 중복되는 값을 스스로 스킵한다. )

 

Ex 1)

 

1
2
3
4
5
6
7
8
9
= {1,2,3,1}
print(a)
 
= {3,4}
print(a.union(b)) # 합집합
print(a.intersection(b)) # 교집합
print(a - b, a | b,  a & b) # 차집합 / 합집합 / 교집합
 
# print(a[0]) # 순서가 없기떄문에 인덱싱 불가능

 

출력 결과

 

 

Ex 2) update remove 기능 

- SET 함수는 순서가 없기 때문에 인덱싱은 불가능하다.

- SET 함수는 순서가 없기 때문에 전부 값에 의한 삭제로 이루어진다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
b.add(5)
print(b)
b.update({6,7})
b.update({8,9})
b.update({10,11}) 
print(b)
 
 
b.discard(7
b.remove(6)
b.discard(7)
 
print(b)

 

- update의 경우 차례대로 마지막에 삽입이 된다.

- discard와 remove는 삭제의 개념에서는 같으나, discard의 경우 제거 할 때 해당 값이 없으면 스킵되지만,

- remove의 경우는 오류를 출력한다.

 

출력 결과

 

 

 추가 - 변수명.clear() 를 할 경우 해당 변수의 데이터 값을 초기화 시켜준다.

 

Dict ( {key:value} 의 형태를 갖고 인덱싱은 불가능합니다, key에 의해 값을 찾기 때문에 위치는 중요하지 않다. )

 

Ex 1) dict 는 다음과 같이 출력가능합니다.

 

1
2
3
4
5
mydic = dict(k1=1, k2='abc', k3=1.2)
print(mydic) 
dic = {'파이썬':'공부''자바':'열심히''스프링':'웹'}
print(dic, ' ' )
print(dic['자바'])

 

출력 결과

 

 

Ex 2) insert / delete / update 기능

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# insert 기능
dic['오라클'= '예언자'
print(dic)
 
# delete 기능
del dic['오라클']
print(dic)
 
# update 기능
dic['자바'= 'programing lan'
print(dic)
 
print(dic['자바'])
print(dic.keys()) # key 값만 출력
print(dic.values()) # values 값만 출력
 
print(dic.get('자바'))

 

출력 결과

 

반응형

'python' 카테고리의 다른 글

python - 제어문 ( if )  (0) 2020.05.07
python - 정규 표현식  (0) 2020.05.07
python - 집합형 자료 ( String , List)  (0) 2020.05.07
python - 이클립스에서 사용 & 기본 문법  (0) 2020.05.06
python - 특징 & 설치  (0) 2020.05.06
반응형

SQL문은 크게 DML , DDL , DCL로 분류 가능합니다.

 

DML은 데이터를 조작하는데 사용되는 언어로

SELECT / INSERT / UPDATE / DELETE 가 이 구문에 해당된다.

 

DDL은 데이터베이스 / 테이블 / 뷰 / 인덱스 등의 데이터베이스 개체를 생성 / 삭제 / 변경하는 역할을 한다.

자주 사용하는 DDL은 CREATE , DROP ,ALTER가 있다.

 

DCL은 사용자에게 권한을 부여하거나 빼앗을 때 주로 사용한다.

GRANT / REVOKE / DENY 가 있다.

 

INSERT

데이터를 삽입하는 명령어

 

INSERT 형식

INSERT INTO 테이블 [ 컬럼의 부분을 추가할 경우 입력 ] VALUES (값들);

자동으로 증가시켜야할 경우 AUTO_INCREMENT를 사용해줍니다.

 

AUTO_INCREMENT 형식

CREATE TABLE 만들테이블명 (num int AUTO_INCREMENT PRIMARY KEY, ... 새로운 컬럼명2 조건2)

 

AUTO_INCREMENT로 지정할 때는 PRIMARY KEY 또는 UNIQUE 설정을 해주어야하고 데이터 형은 숫자 형식만 사용 가능합니다.

 

UPDATE

기존에 입력되어있는 데이터 값을 변경

 

UPDATE 형식

UPDATE 테이블명 SET 열1=값1 , 열2=값2 where 조건;

이전 글에서 작성했던 데이터베이스에서 'HongGildong'을 'ilGildong'으로 수정해보겠습니다.

 

1
UPDATE information SET irum='HongGildong' , irum='ilGildong' WHERE irum='HongGildong';

 

출력 결과

 

 

where 조건문을 사용하지 않는 경우 다음과 같이 전부 다 바뀌는 경우가 생기니 조심해주도록 합니다.

 

1
UPDATE information SET irum='HongGildong' , irum='ilGildong';

 

출력결과

 

DELETE

데이터를 삭제하는 명령어입니다.

 

DELETE 형식

DELETE FROM 테이블명 WHERE 조건;

 

조금전에 변경했떤 'ilGildong'을 삭제해보겠습니다.

1
DELETE FROM information WHERE irum='ilGildong';

 

출력결과

 

 

반응형

'SQL' 카테고리의 다른 글

[SQL] Mybatis XML 작성 시 SQL 별로 LIKE 동적 쿼리 사용 방법  (0) 2022.05.17
SQL 기본편 - SELECT  (0) 2020.03.06

+ Recent posts