1. SQL 쿼리문 실행 

CREATE EXTENSION postgis;

 

2. 에러 발생 

 

 

 

 

3. 해결 방법 

   - C:\Program Files\PostgreSQL\10\bin\postgisgui 에서   "libeay32.dll" and "ssleay32.dll" 복사 

 

   - C:\Program Files\PostgreSQL\10\bin 에 붙여넣기

 

블로그 이미지

미나미나미

,

# JSON 값 넣기 : https://minaminaworld.tistory.com/133

 

[DB] postgreSQL json - insert 하기

# 테이블 구조 - index : 인덱스 값 - 형식serial, - stuName : 학생 이름 - varchar , - stuGrade : 학생 학년 - varchar, - stuInfo : 학생 정보 - json -- Drop table -- DROP TABLE "testGroup".teststudentin..

minaminaworld.tistory.com


# 테이블 구조 

       - index  : 인덱스 값 - 형식serial,

       - stuName : 학생 이름 - varchar ,

       - stuGrade : 학생 학년 - varchar,

       - stuInfo : 학생 정보 - json

 

-- Drop table

-- DROP TABLE "testGroup".teststudentinfo;

CREATE TABLE "testGroup".teststudentinfo (
	"index" serial NOT NULL,
	"stuName" varchar NULL,
	"stuGrade" varchar NULL,
	"stuInfo" json NULL
);

-- Permissions

ALTER TABLE "testGroup".teststudentinfo OWNER TO postgres;
GRANT ALL ON TABLE "testGroup".teststudentinfo TO postgres;


# 학생 중에서 4학년인 경우 stuinfo(json) graduteCheck : true 추가.

     - 중복 되는 항목이 없기 떄문에, 추가가 된다.

update "testGroup".teststudentinfo set
	"stuInfo" = "stuInfo"::jsonb || '{"graduteCheck" : "true"}'
where "stuGrade" = '4';


 

 

# 학생 중에서 stuinfo. major가 수학과인 사람을 통계학과로 전환.

       - major는 중복 되기 떄문에, 덮어쓰기가 된다.

update "testGroup".teststudentinfo set
	"stuInfo" = "stuInfo"::jsonb || '{"major" : "통계학과"}'
where "stuInfo"->>'major' = '수학과';


# 손오공이라는 학생의 전적대인 '경호학과'가 빠졌습니다. 추가합니다.

       - json에 json을 넣는 경우도 중복이 되지 않으면, 추가가 된다.

update "testGroup".teststudentinfo set
	"stuInfo" = "stuInfo"::jsonb || '{"preUnivercity" : {"major" : "경호학과"}}'
where "stuName"= '손오공';

 


 

블로그 이미지

미나미나미

,

 

# JSON 값 넣기 : https://minaminaworld.tistory.com/133

 

[DB] postgreSQL json - insert 하기

# 테이블 구조 - index : 인덱스 값 - 형식serial, - stuName : 학생 이름 - varchar , - stuGrade : 학생 학년 - varchar, - stuInfo : 학생 정보 - json -- Drop table -- DROP TABLE "testGroup".teststudentin..

minaminaworld.tistory.com


# 테이블 구조 

       - index  : 인덱스 값 - 형식serial,

       - stuName : 학생 이름 - varchar ,

       - stuGrade : 학생 학년 - varchar,

       - stuInfo : 학생 정보 - json

 

-- Drop table

-- DROP TABLE "testGroup".teststudentinfo;

CREATE TABLE "testGroup".teststudentinfo (
	"index" serial NOT NULL,
	"stuName" varchar NULL,
	"stuGrade" varchar NULL,
	"stuInfo" json NULL
);

-- Permissions

ALTER TABLE "testGroup".teststudentinfo OWNER TO postgres;
GRANT ALL ON TABLE "testGroup".teststudentinfo TO postgres;


# 학생 중에서 address가 '인천광역시'인 사람.

-- # ->> 표시를 통해서 json 내부의 값을 비교할 수 있다.
select * from "testGroup".teststudentinfo as t where t."stuInfo"->>'address' = '인천광역시';

 


# 전체 학생들의 학년과 주소만을 표시

select "index" as index, "stuName" as name, "stuInfo"->'address' as Address from "testGroup".teststudentinfo as t ;


# 학생들 중 json 값중 specific 키 값이 없는 사람들

select * from "testGroup".teststudentinfo as t where t."stuInfo" ->> 'specific' is null;


# 학생 중에 preUnivercity 값을 갖고 있는 사람 중에 경영학과인 사람

select * from "testGroup".teststudentinfo as t where t."stuInfo" -> 'preUnivercity' ->> 'major' = '경영학과';

 


 

블로그 이미지

미나미나미

,

# 테이블 구조 

       - index  : 인덱스 값 - 형식serial,

       - stuName : 학생 이름 - varchar ,

       - stuGrade : 학생 학년 - varchar,

       - stuInfo : 학생 정보 - json

-- Drop table

-- DROP TABLE "testGroup".teststudentinfo;

CREATE TABLE "testGroup".teststudentinfo (
	"index" serial NOT NULL,
	"stuName" varchar NULL,
	"stuGrade" varchar NULL,
	"stuInfo" json NULL
);

-- Permissions

ALTER TABLE "testGroup".teststudentinfo OWNER TO postgres;
GRANT ALL ON TABLE "testGroup".teststudentinfo TO postgres;

 

 


# insert 하기 

       - json 값 넣는 방법

                 -  '{ "key" :  "value" }'

       - json안에 json을 넣는 방법 :

                 -  '{ "key" :  { "key" :  "value"} }'

INSERT INTO "testGroup".teststudentinfo("stuName", "stuGrade", "stuInfo")
VALUES('강감찬', '2', '{ "address" : "서울특별시" , "major" : "수학과" }');

INSERT INTO "testGroup".teststudentinfo("stuName", "stuGrade", "stuInfo")
VALUES('허준', '1', '{ "address" : "서울특별시" , "major" : "국어국문과" }');

INSERT INTO "testGroup".teststudentinfo("stuName", "stuGrade", "stuInfo")
VALUES('세종대왕', '4', '{ "address" : "서울특별시" , "major" : "국어국문과" }');


INSERT INTO "testGroup".teststudentinfo("stuName", "stuGrade", "stuInfo")
VALUES('손오공', '4', '{ "address" : "부산광역시" , "major" : "체육학과" , "specific" : "태권도"}');

-- json 안에 json을 넣는 방법  
INSERT INTO "testGroup".teststudentinfo("stuName", "stuGrade", "stuInfo")
VALUES('손오반', '2', '{ "address" : "인천광역시" , "major" : "체육학과" , "specific" : "농구"}');


select * from "testGroup".teststudentinfo as t;

# 결과화면.

블로그 이미지

미나미나미

,

[데이터베이스] 데이터를 한줄로 합치기 group_concat() 함수 사용



 ■ group_concat : 


데이터 결과값들을 가끔 한줄로 묶어서 처리해야 되는 경우가 있다.

그럴때 사용하는 group_concat()함수를 사용해 보려고 한다.



table 이름은 test_stu


필드 number , name , grade , major로 이루어졌습니다.





첫번째. name 필드 모두다 한줄로 뽑기



sql 구문 :

SELECT group_concat(test_stu.name) FROM test_stu;



test_stu 테이블에서 test_stu의 name 필드의 값들을 기본 콤마(,)로 합치겠습니다.



결과 화면을 보시게 되면 name 필드의 내용 가느다란,나다,구구단,아오링,찬스,실패가 한줄로 표현되게 됩니다.




두번째. 같은 grade로 묶어서 , name을 한줄로 묶기



sql 구문 :

SELECT  test_stu.grade, group_concat(test_stu.name) 

FROM test_stu 

group by test_stu.grade;



test_stu 테이블에서 test_Stu테이블에서 grade를 값과 name을 가져옵니다. 

가져오면서 test_stu.grade의 값들로 그룹을 만들어서 name의 값을 묶도록 합니다.




결과 화면을 보시게 되면 grade의 값으로 각각 묶여서 name 필드로 출력이 됩니다.




세번째. 같은 grade로 묶어서 , name , major을 한줄로 묶기



sql 구문 :


SELECT  

test_stu.grade,  

group_concat(test_stu.major),

group_concat(test_stu.name) 

FROM test_stu 

group by test_stu.grade;





결과 화면을 grade 값들로 그룹을 만들어서 name과 major를 한 줄로 묶어줍니다.





네번째. 같은 grade로 묶어서 , number와 major 합쳐서 한줄로 묶기



sql 구문 :


SELECT 

test_stu.grade, 

group_concat(test_stu.number , test_stu.name) 

FROM test_stu 

group by test_stu.grade;







결과 화면을 grade 값들로 그룹을 만들어서 number와  major 필드를 합쳐서 출력합니다.







도움이 되셨다면, 구독과 좋아요.... 아니아니 ...

공감 버튼 꾸욱 눌러주세요 ~~



블로그 이미지

미나미나미

,

DAO : Data Access Object 란? 무엇을 달라는 다오다오.....



최대한 이해하고, 공부하는 분야도 보니 틀리 수도 있습니다.

틀린점이 있다면, 알려주시면 감사합니다.



DAO 결론 : Database의 수행하는 부분을 전적으로 담당한다고 생각하면 됩니다.

커넥션을 하나만 두고(싱글톤 패턴), 여러 사용자가 DAO의 interface를 사용하여 필요한 자료에 접근하게 만드는 것입니다. 


 예를 들어, 뷰에서 사용자가 데이터를 요청할 때, 서블렛(또는 서버)에서 DB에 접근을 하는 경우, DB의 접근을 위해서 커넥션 객체를 생성하게 됩니다. 만약, 다수의 서블렛에서 동시에 컨넥션 객체를 생성한다면, DB 접근으로 인한 컨넥션 객체를 생성하는데, 메모리와 시간을 상당히 사용됩니다. 


 이러한 점을 탈피하기 위해서, 하나의 객체를 생성하여 그 객체만이 계속적으로 DB의 접근하도록 하는 것입니다. 그 객체가 바로 DAO 입니다.


DAO 패턴은 표준 J2EE 디자인 패턴 중 하나입니다. 이 패턴을 사용하여 하위 수주늬 데이터 액세스 작업과 상위 수준의 비즈니스 논리와 분리합니다.

DAO 클래스에는 특정 데이터 소스의 데이터에 액세스하기위한 논리가 포함되어 있습니다. 



참고 페이지 : Advanced DAO programming








도움이 되셨다면, 구독과 좋아요.... 아니아니 ...

공감 버튼 꾸욱 눌러주세요 ~~




블로그 이미지

미나미나미

,

[데이터베이스] mybatis 에러 Attribute "resource" must be declared for element type "mapper".






 mybatis에서 설정 작성 중 일때, resource에서,


Attribute "resource" must be declared for element type "mapper".


라는 에러가 발생하면 


<!DOCTYPE의 선언 문을 아래 수정 후로 고쳐주세요!






수정 전


<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


수정 후


<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">







도움이 되셨다면, 구독과 좋아요.... 아니아니 ...

공감 버튼 꾸욱 눌러주세요 ~~




블로그 이미지

미나미나미

,

[데이터베이스] mybatis 사용하기 ( JSP,AJAX. Sevlet)


[데이터베이스] MariaDB 설치하기 보러가기

[데이터베이스] 마리아DB(MariaDB) - 이클립스 연동 보러가기

[데이터베이스] 마리아DB(MariaDB) - JSP - ajax 연동 예제 의 다음 이야기로 진행하시는데 

어려움 또는 설정 파일을 필요하신 분들은 앞에 부분들부터 천천히 읽고 오시면 좋을거 같습니다.




마리아DB를 편리하게 쓰고, 좀더 DB의 오버헤드를 줄이기 위해서

Mybatis를 사용하는 법을 진행하겠습니다.


Mybatis를 쓰기 위해서는 Jar의 파일이 필요합니다.

아래의 GITHUB의 가시면 mybaits의 zip 파일을 얻을 수 있습니다.

파일 중 mybatis-3.X.X.jar를

WebContent , WEB-INF , lib 아래 두시면 됩니다. 


다운 받으러 가기 : https://github.com/mybatis/mybatis-3/releases





마리아DB와 Mybatis를 사용하기 위해서는 
아래의 주황색 박스의 부분의 코드들이 필요하다.





controller : JSP에서 버튼 이벤트로 Ajax 요청을 받아서, package test.DataDao에서 

데이터를 Object로 돌려줍니다.


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    //doGet(request, response);
    DataDao dao = new DataDao();
    //test.DataDao의 DataDao.java를 통해서 sqlSessionFa
    List<Data> list= dao.getList();
    for(int i = 0; i < list.size(); i++){
        System.out.println(list.get(i).getName());
    }
    
}




test.DataDao:  controller 의해 요청된 정보에 대해서 

test.mybatis의 SqlSessionFactoryService.java 파일에 

생성된 sqlSessionFactory의 인스턴스 통해서

sqlSession를 생성 후 DataMpper.xml에서 Mapper를 통해서 

원하는 데이터를 가져옵니다. 
여기서 가져올 때, test.DataVO.Data.java를 통해서 Data를 object화 시켜가져옵니다.


package test.DataDao;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import test.mybatis.SqlSessionFactoryService;
import test.DataVo.*;

public class DataDao {
    private SqlSessionFactory sqlSessionFactory;
    //sqlSessionFactory는 sqlSession를 생성하기 위해 사용
    /*
        한번 만든뒤 SqlSessionFactory는 애플리케이션을 실행하는 동안 존재해야만 한다.
        그래서 삭제하거나 재생성할 필요가 없다.
        애플리케이션이 실행되는 동안 여러 차례 SqlSessionFactory 를
        다시 빌드하지 않는 것이 가장 좋은 형태이다.
         가장 간단한 방법은 싱글턴 패턴이나 static 싱글턴 패턴을 사용하는 것이다.
     */
    public DataDao(){
        sqlSessionFactory = SqlSessionFactoryService.getSqlSessionFactory();
    }
    public List<Data> getList() { // DataDao의 의해서 MariaDB에서 값을 받아온다. list

        SqlSession session = null;

        try {
            session = sqlSessionFactory.openSession();
            //세션을 생성하여 매핑구문을 실행하거나
            //커밋 또는 롤백을 하기 위해 세션을 사용
            return session.selectList("getlist");
            //DataMapper.xml 매핑된 Sql 구문을 실행 후 찾은 데이터를
            //controller에 데이터를 보내준다.
        } finally {
            if (session != null)
                session.close();
                //세션 더이상 필요하지 않은 상태가 되면 세션을 닫는다.
        }
    }


}




test.DataVo:  DB에서 읽어올 데이터를 Object화 시켜주기 위하여 생성된 변수들

getter/setter를 사용하며, 테이블의 구조의 헤더의 선언된 정보와 같다.


package test.DataVo;

public class Data {
    /*
        MariaDB에서 읽어올 테이블의 헤더와 동일하다.
        읽어 올 테이블의 구조는
        번호 , 이름 , 학년
        => number , name. grade
        이렇게 구성되어있다.
    */
    
    private String name;
    private int grade;
    private int number;
        
    public Data() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Data(String name, int grade , int number) {
        super();
        this.name = name;
        this.grade = grade;
        this.number = number;
    }   
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getGrade() {
        return grade;
    }
    public void setGrade(int grade) {
        this.grade = grade;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    
}




test.mybatis.DataMapper.xml:  DataDao.java 에서의 수행할 함수 기능에 대한 정보를 가지고 있다.


<?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="test.mybatis.DataMapper">
<!--패키지 경로를 포함한 전체 이름을 가진 구문을 구분하기 위해 필수로 사용한다.-->
    <select id="getlist" resultType="data">
        <!--함수 호출명 getlist 결과 DataVo의 Data.java 형식-->
        select * from test_stu order by number desc
    </select>
</mapper>



test.mybatis.mybatis-config.xml:  접속한 DB의 정보 및 수행할 정보도 가지고 있다.


<?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"> -->
<!-- Attribute "resource" must be declared for element type "mapper". -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <typeAliases>
        <typeAlias type="test.DataVo.Data" alias="data" />
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="org.mariadb.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/가져올DB" />
                <property name="username" value="아이디" />
                <property name="password" value="비밀번호" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="test/mybatis/DataMapper.xml" />
    </mappers>

</configuration>



test.mybatis.sqlSessionFactoryService.java


package test.mybatis;

import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlSessionFactoryService {

    private static SqlSessionFactory sqlSessionFactory;
    static{
        try{
String resource = "test/mybatis/mybatis-config.xml";
//mybatis를 통해서 연결할 DB, id , pass 정보를 가지고 있다.
InputStream is = Resources.getResourceAsStream(resource);

//mybatis-config.xml를 통해서 내가 연결할 mariadb 연결 정보를 읽어 온다.
sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
/*
이 클래스는 인스턴스회되어 사용되고 던져질 수 있다.
SqlSessionFactory 를 생성한 후 유지할 필요는 없다.
그러므로 SqlSessionFactoryBuilder 인스턴스의
가장 좋은 스코프는 메소드 스코프(예를들면 메소드 지역변수)이다.
여러개의 SqlSessionFactory 인스턴스를 빌드하기 위해 SqlSessionFactoryBuilder를
재사용할 수도 있지만 유지하지 않는 것이 가장 좋다.
*/
// 가져온 정보를 통해서
        }catch(IOException ie){
            System.out.println(ie.getMessage());
        }
    }

    public static SqlSessionFactory getSqlSessionFactory() {
//test.DataDao의 DataDao.java 파일의 의해서 요청된
//sqlSessionFactory -> sqlSession를 만들기위해서 sqlSessionFactory를 reutrn한다.
        return sqlSessionFactory;
    }   
}




JSP 화면


<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>

<title>테스트 페이지</title>
</head>

<body>
<p>테스트</p>
<button id="jsonSend" type="button"> maria 값 가져오기 실행</button>
<script>
$('#jsonSend').click(function () {
jsonSend();
});

function jsonSend() {
$.ajax({
type: "POST",
url: "/TistoryExample//MariaDB_mybatis_tset",
data: {}, //json을 보내는 방법
success: function (data) { //서블렛을 통한 결과 값을 받을 수 있습니다.
alert(data);
console.log(data);
},
error: function (e) {
console.log(e);
alert('저장에 실패했습니다.');
}
});
}
</script>
</body>

</html>




결과화면










도움이 되셨다면, 구독과 좋아요.... 아니아니 ...

공감 버튼 꾸욱 눌러주세요 ~~


블로그 이미지

미나미나미

,