반응형

안녕하세요. 자바프로젝트 입니다.

불철주야  개발에  열심이신 개발자님 반갑습니다.

mybatis 경우  이미 만들어진  sql 을  조회합니다.

그러나  만약 사용자가 쿼리를 만들어서 파라메터로 받은 다음 조회  할 경우는 어떻게 할까요?

즉 동적으로  sql 를 실행하는 경우 입니다.

몇가지 방법이 있습니다.

그 중에 하나입니다.

 

    /**
	 * 
	 * @param query  (sql 쿼리가 들어감)
	 * @return 쿼리 쿼리 결과가 리턴함( KEY :	columnList ,dataList )
	 *  (columnList -> 컬럼 리스트, dataList - > 데이터)
	 */
    public Map<String, Object> getQueryResultData(String query) {
		Map<String,Object> queryResultData = new HashMap<String,Object>(); 

		List<String>  columnList = new ArrayList<String>(); 
				
		List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>(); 
		
    	String JDBC = "com.mysql.jdbc.Driver";
    	String URL = "jdbc:mysql://localhost:3306/javaproject";
    	String ID = "javaprojject";
    	String PWD = "1234";
    	String SQL = query.replaceAll(";","");
    	Connection conn = null;
    	PreparedStatement psmt = null;
    	ResultSet rs = null;
		try {
			Class.forName(JDBC);			
			
			conn = DriverManager.getConnection(URL, ID, PWD);
			psmt = conn.prepareStatement(SQL);			
			rs = psmt.executeQuery();
			ResultSetMetaData meta = rs.getMetaData();			
			int colCnt = meta.getColumnCount();
		
			for(int i = 1;i<=colCnt;i++) {
				String name = meta.getColumnName(i);
				columnList.add(name);
			}		
			while(rs.next()) {
				Map<String,Object> cont = new HashMap<String,Object>();
				for(int i = 1;i<=colCnt;i++) {
					String name = meta.getColumnName(i);
					Object value = rs.getObject(i);
					
					if(value == null)value = "";
					if(value instanceof String) {						
						value = ((String)value).replace("\\", "\\\\")
						               .replace("\'", "\\\'")
						               .replace("\"", "\\\"")
						               .replace("\r\n", "\\n")
						               .replace("\n", "\\n");
						               
						               
					} else if(value instanceof java.sql.Clob) {
					
						 StringBuffer output = new StringBuffer();
						 String str = "";
						 Clob clob = (java.sql.Clob)value;
						 BufferedReader br = new BufferedReader(clob.getCharacterStream());
						 try {
							 while((str = br.readLine())!=null) {
							 output.append(str);
						 }
						 }catch(Exception e) {}
						     value = output.toString();
						     value = ((String)value).replace("\\", "\\\\")
								               .replace("\'", "\\\'")
								               .replace("\"", "\\\"")
								               .replace("\r\n", "\\n")
								               .replace("\n", "\\n");
					}
						
					cont.put(name, value);
				}				
				dataList.add(cont);
			}
			
			queryResultData.put("columnList", columnList);
			queryResultData.put("dataList", dataList);
			
		} catch (ClassNotFoundException e) {
			System.out.println("jdbc driver 로딩 실패");
		} catch (SQLException e) {
			System.out.println(" 연결 실패" + e.getMessage());
		}finally {
			if (rs!=null) {
				   try {
				      rs.close();
				   } catch (SQLException e) {
				   }
				}
				 
				if(psmt!=null) {
				   try {
					   psmt.close();
				   } catch (SQLException e) {
				   }
				}
				 
				if(conn!=null) {
				   try {
				      conn.close();
				   } catch (SQLException e) {
				   }
				}
		}

		return queryResultData;
		
	}

 

혹시 궁금한점이나 더 알고 싶은 부분이 있으면 편하게 답글 남겨주시면  답변드리겠습니다.

감사합니다.

반응형
반응형
  1. $> wget https://repo.continuum.io/archive/Anaconda3-5.2.0-Linux-x86_64.sh
  2. $> bash Anaconda3-5.2.0-Linux-x86_64.sh
  3. $> source .bashrc
  4. $>jupyter notebook --generate-config
  5. $>vi /root/.jupyter/jupyter_notebook_config.py
c.NotebookApp.ip = '0.0.0.0' 
c.NotebookApp.port = 8888
c.NotebookApp.notebook_dir = '/data/jupyter'

 6. 실행하기

   

  • 사용자 계정으로 실행
    • upyter notebook --config=/root/.jupyter/jupyter_notebook_config.py &
  • root 계정으로 실행
    • $> nohup jupyter notebook --config=/root/.jupyter/jupyter_notebook_config.py --allow-root &

 7. $>jupyter notebook list (토큰 값 알기)

 

8. http://111.222.333.444(서버아이피):8888/?token=545(7번에서 얻은 토큰 값을 입력함)

반응형
반응형

1. pom.xml 에 라이브러리 추가

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
   </dependency>
              
        <dependency> 
        	<groupId>org.springframework</groupId> 
        	<artifactId>spring-jdbc</artifactId>  
        </dependency> 
      
		<dependency>
		    <groupId>org.mariadb.jdbc</groupId>
		    <artifactId>mariadb-java-client</artifactId>
		    <version>2.4.1</version>
		</dependency>

 

 

 

2. src/main/resource/application.properties 설정추가

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
#없으면 디폴드 포트 8080 임
server.port = 80 
spring.devtools.livereload.enabled=true
spring.thymeleaf.cache=false

# mybatis 매핑 type을 짧게 쓰기 위한 설정 (이 하위 디렉터리의 클래스들은 모두 myBatis Mapper XML에서 parameter type 이나 result Type으로 사용할 수 있다.)
#mybatis.type-aliases-package=com.bpa.main.model
# mybatis 매퍼 위치 추가. classpath:를 쓰면  src/main/resource 가 루트가 됨 (src/main/resources/sql/mariadb/admin-sql.xml)
mybatis.mapper-locations=classpath:sql/**/*.xml

# mapper 이하를 로깅 위치로 설정.(mapper interface 패키지 경로)
logging.level.com.bpa.main.dao=TRACE

# db 연결정보 추가
spring.datasource.url=jdbc:mariadb://localhost:3306/bpa
spring.datasource.username=root
spring.datasource.password=1111
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

 

 

3. sql xml 추가 (src/main/resources/sql/mariadb/admin-sql.xml)

<?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="com.bpa.main.dao.AdminDBMapper"> 
    
      <select id="getUserList" resultType="map">
      	SELECT * FROM BPA_USER
      </select>
</mapper>

<mapper namespace="com.bpa.main.dao.AdminDBMapper"> 은 실제 interface 경로이며 getUserList 은 실제 메소드임

 

 

4. xml 과 메핑될 interface 추가(com.bpa.main.dao.AdminDBMapper )

package com.bpa.main.dao;

import java.util.List;

public interface 	AdminDBMapper {
  public List getUserList();
}

 

 

5. spring boot Application 에 MapperScan 추가

@SpringBootApplication
@MapperScan(basePackages = "com.bpa.main.dao") /* AdminDBMapper의 위치*/
@EnableAsync
public class BpaApplication {

	public static void main(String[] args) {
		SpringApplication.run(BpaApplication.class, args);
	}

}

 

 

6. 호출하기

@Autowired
	private AdminDBMapper adminDBMapper;

@Override
	public List getUserList() {
		// TODO Auto-generated method stub
		return adminDBMapper.getUserList();
	}

 

 

application.properties 에서 sql xml 위치 지정해주고 xml 에서 namespace ,id 에 해당하는 interface 만들고 호출하면 됨 interface 위치는 springboot Application 에서 @MapperScan 로 지정함 admin-sql.xml 과 com.bpa.main.dao.AdminDBMapper 와 매핑이 되어 실행되는 구조 임

 

반응형
반응형

1. 이슈 증상
webjars은 웹에서 쓰는 라이브러리(jquery,bootstrap)를 패키징한 jar을 말하는데
못 불러올 경우가 있습니다.
해결방법은 다음과 같습니다.

2. 해결방법
아래 둘중에 하나를 추가 하면 됩니다.

- WebConfig 추가 하기

package kr.co.penta.dataeye.spring.web;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
 
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
  }
 
}

또는 xml Config 추가하기

<mvc:resources mapping="/webjars/**" location="classpath:/META-INF/resources/webjars/"/>
반응형
반응형

CSV 생성 후 다운로드 하기

@RequestMapping("/csvDownload")
public ResponseEntity<String> getTotalList() {
 
   
 
   //CSV는 UTF-8로 하면 깨지고, MS949 로 세팅해야 된다.
   //import org.springframework.http.HttpHeaders; 
   HttpHeaders header = new HttpHeaders();
   header.add("Content-Type", "text/csv; charset=MS949");
   header.add("Content-Disposition", "attachment; filename=\"" + "total.csv" + "\""); 
   
  
  //내용에 콤마가 있을경우 쌍따움표로 감싼다.
   String csvData = "가, "나,1,2,3" , 다, \n 1, 2, 3";
   return new ResponseEntity<String>(csvData , header, HttpStatus.CREATED);
}
반응형
반응형

1. ExcelReader.java

import java.io.File;
import java.io.InputStream;
 
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.util.SAXHelper;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.model.StylesTable;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
 
public class ExcelReader {
 
  public static void main(String[] args) {
    // TODO Auto-generated method stub
       
 
//읽어올 엑셀파일 경로
    SheetHandler excelData = readExcel(new File("C:\\work\\excel\\mysample.xlsx"));
 
    System.out.println("Header List" + excelData.getHeader().size());
    System.out.println("Rows List" + excelData.getRows().size());
 
  }
 
   
  public static SheetHandler readExcel(File excelFile) {
 
   
      SheetHandler sheetHandler = new SheetHandler();
 
      try {
 
          OPCPackage pkg = OPCPackage.open(excelFile);
 
          XSSFReader xssfReader = new XSSFReader(pkg);
 
          ReadOnlySharedStringsTable data = new ReadOnlySharedStringsTable(pkg);
           
          StylesTable styles = xssfReader.getStylesTable();
 
 
          InputStream sheetStream = xssfReader.getSheetsData().next();
          InputSource sheetSource = new InputSource(sheetStream);
          
          ContentHandler handler = new XSSFSheetXMLHandler(styles, data, sheetHandler, false);
          
          XMLReader sheetParser = SAXHelper.newXMLReader();
 
          sheetParser.setContentHandler(handle
          sheetParser.parse(sheetSource);
          sheetStream.close();
        
      }catch (Exception e) {
        throw new RuntimeException(e);
      }
 
      return sheetHandler;
  }
   
}

 

2. SheetHandler.java

import java.util.ArrayList;
import java.util.List;
 
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.SheetContentsHandler;
import org.apache.poi.xssf.usermodel.XSSFComment;
public class SheetHandler implements SheetContentsHandler {
 
    private List<List<String>> rows = new ArrayList<>();
 
    private List<String> row = new ArrayList<>();
 
    private List<String> header = new ArrayList<>();
 
    private int currentCol = -1;
 
    private int currRowNum = 0;
     
    public List<String> getHeader() {
      return header;
    }
     
    public List<List<String>> getRows() {
      return rows;
    }
 
    public void startRow(int rowNum) {
 
        this.currentCol = -1;
        this.currRowNum = rowNum;
 
    }
 
    public void endRow(int rowNum) {
        if(rowNum ==0) {
            header = new ArrayList(row);
        } else {
            if(row.size() < header.size()) {
                for (int i = row.size(); i < header.size(); i++) {
                    row.add("");
                }
            }
            rows.add(new ArrayList(row));
        }
       row.clear();
    }
 
    public void cell(String columnName, String value, XSSFComment var3) {
        int iCol = (new CellReference(columnName)).getCol();
        int emptyCol = iCol - currentCol - 1;
 
        for(int i = 0 ; i < emptyCol ; i++) {
            row.add("");
        }
        currentCol = iCol;
        row.add(value);
    }
 
    public void headerFooter(String text, boolean isHeader, String tagName) {
 
    }
 
}
반응형
반응형

원래파일명하고 물리파일명을 받아
물리파일명을 읽어 원래 파일명으로 다운로드 시킵니다.

@RequestMapping("/download")
      public void download(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException {
           
        
       int fileNo = (request.getParameter("fileNo")==null)?0:Integer.parseInt(request.getParameter("fileNo"));
        
       Map<String,String> fileInfo = portalService.getPortalBoardFileInfo(fileNo);
           
          String filename = fileInfo.get("ORG_NAME");
          String downname = fileInfo.get("SYS_NAME");
          String path = fileInfo.get("PATH");
           
           
          String realPath = "";
          System.out.println("downname: "+downname);
          if (filename == null || "".equals(filename)) {
              filename = downname;
          }
            
          try {
              String browser = request.getHeader("User-Agent"); 
 
              if (browser.contains("MSIE") || browser.contains("Trident")
                      || browser.contains("Chrome")) {
                  filename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+",
                          "%20");
              } else {
                  filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
              }
          } catch (UnsupportedEncodingException ex) {
              System.out.println("UnsupportedEncodingException");
          }
          realPath = path +"/" + downname;
          System.out.println(realPath);
          File file1 = new File(realPath);
          if (!file1.exists()) {
              return ;
          }
                
          response.setContentType("application/octer-stream");
          response.setHeader("Content-Transfer-Encoding", "binary;");
          response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
          try {
              OutputStream os = response.getOutputStream();
              FileInputStream fis = new FileInputStream(realPath);
    
              int ncount = 0;
              byte[] bytes = new byte[512];
    
              while ((ncount = fis.read(bytes)) != -1 ) {
                  os.write(bytes, 0, ncount);
              }
              fis.close();
              os.close();
          } catch (FileNotFoundException ex) {
              System.out.println("FileNotFoundException");
          } catch (IOException ex) {
              System.out.println("IOException");
          }
      }
반응형
반응형

웹에서 로그인시 사용자 아이디를 저장하면
다시 로그인 창에 접속할때 전에 로그인한 아이디가 자동으로
입력되어서 사용자에게 편리성을 제공해줍니다.

다음은 처리 코드입니다

 

1. 로그인 

<input type="text" id="userId">
<input type="checkbox" id="idSaveCheck">아이디 저장하기

2. 아이디 저장 

$(document).ready(function(){
  
     
    var key = getCookie("key");
    $("#userId").val(key); 
      
    if($("#userId").val() != ""){
        $("#idSaveCheck").attr("checked", true); 
    }
      
    $("#idSaveCheck").change(function(){ 
        if($("#idSaveCheck").is(":checked")){ 
            setCookie("key", $("#userId").val(), 7); 
        }else{ 
            deleteCookie("key");
        }
    });
      
    
    $("#userId").keyup(function(){ 
        if($("#idSaveCheck").is(":checked")){ 
            setCookie("key", $("#userId").val(), 7); 
        }
    });
});
  
function setCookie(cookieName, value, exdays){
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var cookieValue = escape(value) + ((exdays==null) ? "" : "; expires=" + exdate.toGMTString());
    document.cookie = cookieName + "=" + cookieValue;
}
  
function deleteCookie(cookieName){
    var expireDate = new Date();
    expireDate.setDate(expireDate.getDate() - 1);
    document.cookie = cookieName + "= " + "; expires=" + expireDate.toGMTString();
}
  
function getCookie(cookieName) {
    cookieName = cookieName + '=';
    var cookieData = document.cookie;
    var start = cookieData.indexOf(cookieName);
    var cookieValue = '';
    if(start != -1){
        start += cookieName.length;
        var end = cookieData.indexOf(';', start);
        if(end == -1)end = cookieData.length;
        cookieValue = cookieData.substring(start, end);
    }
    return unescape(cookieValue);
}
반응형

+ Recent posts