[SQL] 자바의 SQL 문자열을 구축 깨끗한 방법
SQL자바의 SQL 문자열을 구축 깨끗한 방법
나는 데이터베이스 조작을 수행하는 SQL 문자열을 구축하려는 (업데이트, 삭제, 삽입, 선택, 그런 종류) - 대신 끔찍한 문자열 CONCAT 방법의 최선을 읽을 수 없습니다 "+"의 수백만 따옴표를 사용하여 -가 더 좋은 방법이 있어야합니다.
나는 MessageFormat의를 사용하여 생각했다 -하지만 난 그게 합리적인 일을 할 것이라고 생각하지만 그 생각은, 사용자 메시지에 사용되는 -하지만 난 더 자바 SQL 라이브러리에서 SQL 유형의 작업에 정렬 뭔가가 있어야 같아요.
그루비는 좋은 것입니까?
해결법
-
==============================
1.우선 준비된 문에 쿼리 매개 변수를 사용하는 것이 좋습니다 :
우선 준비된 문에 쿼리 매개 변수를 사용하는 것이 좋습니다 :
PreparedStatement stm = c.prepareStatement("UPDATE user_table SET name=? WHERE id=?"); stm.setString(1, "the name"); stm.setInt(2, 345); stm.executeUpdate();
할 수있는 다른 것은 속성 파일의 모든 쿼리를 유지하는 것입니다. 예를 들면 queries.properties에 파일은 위의 쿼리를 배치 할 수 있습니다 :
update_query=UPDATE user_table SET name=? WHERE id=?
그런 다음 간단한 유틸리티 클래스의 도움으로 :
public class Queries { private static final String propFileName = "queries.properties"; private static Properties props; public static Properties getQueries() throws SQLException { InputStream is = Queries.class.getResourceAsStream("/" + propFileName); if (is == null){ throw new SQLException("Unable to load property file: " + propFileName); } //singleton if(props == null){ props = new Properties(); try { props.load(is); } catch (IOException e) { throw new SQLException("Unable to load property file: " + propFileName + "\n" + e.getMessage()); } } return props; } public static String getQuery(String query) throws SQLException{ return getQueries().getProperty(query); } }
다음과 같이 쿼리를 사용할 수 있습니다 :
PreparedStatement stm = c.prepareStatement(Queries.getQuery("update_query"));
이것은 오히려 간단한 해결책이지만, 잘 작동합니다.
-
==============================
2.임의의 SQL의 경우, jOOQ를 사용합니다. jOOQ 현재 SELECT, INSERT, UPDATE, DELETE, TRUNCATE, 및 병합을 지원합니다. 이 같은 SQL을 생성 할 수 있습니다 :
임의의 SQL의 경우, jOOQ를 사용합니다. jOOQ 현재 SELECT, INSERT, UPDATE, DELETE, TRUNCATE, 및 병합을 지원합니다. 이 같은 SQL을 생성 할 수 있습니다 :
String sql1 = DSL.using(SQLDialect.MYSQL) .select(A, B, C) .from(MY_TABLE) .where(A.equal(5)) .and(B.greaterThan(8)) .getSQL(); String sql2 = DSL.using(SQLDialect.MYSQL) .insertInto(MY_TABLE) .values(A, 1) .values(B, 2) .getSQL(); String sql3 = DSL.using(SQLDialect.MYSQL) .update(MY_TABLE) .set(A, 1) .set(B, 2) .where(C.greaterThan(5)) .getSQL();
대신 SQL 문자열을 얻을, 당신은 또한 단지 jOOQ를 사용하여 그것을 실행할 수 있습니다. 보다
http://www.jooq.org
(면책 조항 : jOOQ 뒤에 회사 I 작업)
-
==============================
3.직접 자바에 포함 된 SQL 문에 대한 방법 - 당신이 고려해야 할 하나 개의 기술은 SQLJ이다. 간단한 예를 들어, 당신은 TestQueries.sqlj라는 파일에 다음이있을 수 있습니다 :
직접 자바에 포함 된 SQL 문에 대한 방법 - 당신이 고려해야 할 하나 개의 기술은 SQLJ이다. 간단한 예를 들어, 당신은 TestQueries.sqlj라는 파일에 다음이있을 수 있습니다 :
public class TestQueries { public String getUsername(int id) { String username; #sql { select username into :username from users where pkey = :id }; return username; } }
당신의 .sqlj 파일을 소요하고 순수 자바로 변환 추가 사전 컴파일 단계가있다 - 짧은이, 그것은으로 구분 된 특수 블록을 찾습니다
#sql { ... }
그리고 JDBC 호출로 변합니다. SQLJ를 사용하는 몇 가지 주요 혜택이 있습니다 :
주변의 주요 데이터베이스 공급 업체의 대부분 번역자의 구현이있다, 그래서 당신은 당신이 쉽게 필요한 모든 것을 찾을 수 있어야합니다.
-
==============================
4.당신이 SQUIGGLE 같은 후 경우 궁금입니다. 또한 매우 유용 뭔가 jDBI이다. 이 쿼리하지만 당신을 도움이되지 않습니다.
당신이 SQUIGGLE 같은 후 경우 궁금입니다. 또한 매우 유용 뭔가 jDBI이다. 이 쿼리하지만 당신을 도움이되지 않습니다.
-
==============================
5.나는 봄 JDBC를 살펴 것이다. 내가 프로그래밍 방식으로 SQL을 실행해야 할 때마다 나는 그것을 사용합니다. 예:
나는 봄 JDBC를 살펴 것이다. 내가 프로그래밍 방식으로 SQL을 실행해야 할 때마다 나는 그것을 사용합니다. 예:
int countOfActorsNamedJoe = jdbcTemplate.queryForInt("select count(0) from t_actors where first_name = ?", new Object[]{"Joe"});
그것은 SQL 실행, 특히 쿼리의 모든 종류의 정말 좋아요; 그것은 당신이 완전한 ORM의 복잡성을 추가하지 않고, 객체에 가능한 결과를 매핑하는 데 도움이됩니다.
-
==============================
6.내가 같은 표준 문자열을 쓸 수 있도록 봄의 명명 된 JDBC 매개 변수를 사용하는 경향이 "어쩌구에서 선택 * 어디 colX = 'someValue와'"; 나는 꽤 읽을 생각합니다.
내가 같은 표준 문자열을 쓸 수 있도록 봄의 명명 된 JDBC 매개 변수를 사용하는 경향이 "어쩌구에서 선택 * 어디 colX = 'someValue와'"; 나는 꽤 읽을 생각합니다.
대안은 별도의 .SQL 파일의 문자열을 공급하고 유틸리티 메소드를 사용하여 내용을 읽을하는 것입니다.
아, 또한 가치 실라를 살펴 갖는 https://squill.dev.java.net/docs/tutorial.html
-
==============================
7.최대 절전 모드와 같은 ORM을 사용하는 I 번째 권고 사항. SqlBuilder 동적으로 "빌더"스타일을 사용하여 SQL 문을 구축하기위한 자바 라이브러리입니다 : 내가 쓰기에 도움이 한 몇 가지 물건을 강매하는 기회를 갖고 있습니다 그래서, 일을하지 않는 경우 그러나, 상황은 확실히있다. 그것은 매우 강력하고 매우 유연합니다.
최대 절전 모드와 같은 ORM을 사용하는 I 번째 권고 사항. SqlBuilder 동적으로 "빌더"스타일을 사용하여 SQL 문을 구축하기위한 자바 라이브러리입니다 : 내가 쓰기에 도움이 한 몇 가지 물건을 강매하는 기회를 갖고 있습니다 그래서, 일을하지 않는 경우 그러나, 상황은 확실히있다. 그것은 매우 강력하고 매우 유연합니다.
-
==============================
8.나는 필요 애드혹보고 목적을 위해 매우 동적 SQL 문을 구성 할 수있는 자바 서블릿 응용 프로그램에 노력하고있다. 응용 프로그램의 기본 기능은 미리 코딩 된 쿼리에라는 이름의 HTTP 요청 매개 변수의 무리를 공급하고, 출력 멋지게 형식의 테이블을 생성하는 것입니다. 나는 XML 파일에 내 SQL 쿼리를 모두 저장하고 테이블 포맷 정보와 함께보고 응용 프로그램에로드하기 위해 스프링 MVC와 의존성 주입 프레임 워크를 사용했다. 결국,보고 요구 사항은 더 이상 기존의 매개 변수 매핑 프레임 워크의 기능을보다 복잡하게되었고, 나는 내 자신을 써야했다. 그것은 개발에 흥미있는 운동이었다 훨씬 더 강력한 내가 찾을 수있는 다른 무엇보다도 매개 변수 매핑을위한 프레임 워크를 생산했다.
나는 필요 애드혹보고 목적을 위해 매우 동적 SQL 문을 구성 할 수있는 자바 서블릿 응용 프로그램에 노력하고있다. 응용 프로그램의 기본 기능은 미리 코딩 된 쿼리에라는 이름의 HTTP 요청 매개 변수의 무리를 공급하고, 출력 멋지게 형식의 테이블을 생성하는 것입니다. 나는 XML 파일에 내 SQL 쿼리를 모두 저장하고 테이블 포맷 정보와 함께보고 응용 프로그램에로드하기 위해 스프링 MVC와 의존성 주입 프레임 워크를 사용했다. 결국,보고 요구 사항은 더 이상 기존의 매개 변수 매핑 프레임 워크의 기능을보다 복잡하게되었고, 나는 내 자신을 써야했다. 그것은 개발에 흥미있는 운동이었다 훨씬 더 강력한 내가 찾을 수있는 다른 무엇보다도 매개 변수 매핑을위한 프레임 워크를 생산했다.
같은보고 새 매개 변수 매핑 :
select app.name as "App", ${optional(" app.owner as "Owner", "):showOwner} sv.name as "Server", sum(act.trans_ct) as "Trans" from activity_records act, servers sv, applications app where act.server_id = sv.id and act.app_id = app.id and sv.id = ${integer(0,50):serverId} and app.id in ${integerList(50):appId} group by app.name, ${optional(" app.owner, "):showOwner} sv.name order by app.name, sv.name
그 결과 프레임 워크의 장점은 적절한 유형 검사 및 한계 검사와 쿼리에 직접 HTTP 요청 매개 변수를 처리 할 수 있었다. 엑스트라 매핑 입력 확인을 위해 필요하지 않습니다. 매개 변수 이름 SERVERID 위의 예제 쿼리에서 이 정수로 캐스팅 할 수 있는지 확인하기 위해 검사 및 0-50의 범위에 있었다 될 것이다. 필드 showOwner이 "참"으로 존재하고 설정하면 파라미터 APPID는 따옴표 SQL의 비트가 선택 필드에 대해 생성 된 쿼리에 추가 될 것이다 (50)의 길이를 제한하여, 정수의 배열로 처리 될 매핑. 필드 몇 가지 더 매개 변수 형식 매핑 추가 매개 변수 매핑으로 SQL의 선택적인 세그먼트를 포함하여 사용할 수 있습니다. 그것은 가지고 올 수있는 개발자로 쿼리 매핑 같은 복잡한 수 있습니다. 심지어 주어진 쿼리가 된 PreparedStatement를 통해 최종 매핑을 가지고 또는 단순히 사전 구축 된 쿼리로 실행할지 여부를 결정하기 위해 보고서 구성에 컨트롤이 있습니다.
샘플 HTTP 요청 값 :
showOwner: true serverId: 20 appId: 1,2,3,5,7,11,13
그것은 다음과 같은 SQL을 생성 할 것입니다 :
select app.name as "App", app.owner as "Owner", sv.name as "Server", sum(act.trans_ct) as "Trans" from activity_records act, servers sv, applications app where act.server_id = sv.id and act.app_id = app.id and sv.id = 20 and app.id in (1,2,3,5,7,11,13) group by app.name, app.owner, sv.name order by app.name, sv.name
정말 봄 또는 최대 절전 모드 또는 그 프레임 워크 중 하나를 검증 유형, 배열 및 기타 기능 같은 복잡한 데이터 유형을 허용하는보다 강력한 매핑 메커니즘을 제공해야한다고 생각합니다. 나는 그것이 매우 일반적인 릴리스 읽을되지 않으며, 단지 내 목적을 위해 내 엔진을 썼다. 그것은 단지 순간에 오라클 쿼리와 공동으로 작업하여 모든 코드가 큰 기업에 속한다. 언젠가는 내 아이디어를 가지고 새로운 오픈 소스 프레임 워크를 구축,하지만 난 도전을 차지합니다 기존의 큰 선수 중 하나를 바라고있다.
-
==============================
9.왜 손으로 모든 SQL을 생성 할 수 있습니까? 당신은 청소기 방법 다음 원시 SQL에서 그것을 할, 당신이 얻을 필요가있는 경우 성능의 마지막 비트는을 만들 수 있습니다, 그것은 아마 당신이 필요 적어도 95 %을 할 것 프로젝트에 따라 최대 절전 모드와 같은 ORM 봤어 SQL은 필요가 손으로 조정하는 것을 쿼리합니다.
왜 손으로 모든 SQL을 생성 할 수 있습니까? 당신은 청소기 방법 다음 원시 SQL에서 그것을 할, 당신이 얻을 필요가있는 경우 성능의 마지막 비트는을 만들 수 있습니다, 그것은 아마 당신이 필요 적어도 95 %을 할 것 프로젝트에 따라 최대 절전 모드와 같은 ORM 봤어 SQL은 필요가 손으로 조정하는 것을 쿼리합니다.
-
==============================
10.또한 MyBatis로 (www.mybatis.org)을 볼 수있다. 그것은 당신이 당신의 자바 코드 외부에서 SQL 문을 작성하는 데 도움이 다른 것들 사이 당신의 자바 객체에 SQL 결과를 매핑합니다.
또한 MyBatis로 (www.mybatis.org)을 볼 수있다. 그것은 당신이 당신의 자바 코드 외부에서 SQL 문을 작성하는 데 도움이 다른 것들 사이 당신의 자바 객체에 SQL 결과를 매핑합니다.
-
==============================
11.구글은 안드로이드 애플 리케이션, SQLite는 데이터베이스를 기본 이상 기본적으로 추상화 계층을위한 SQL을 작성하는 매우 깨끗한 방법을 제공합니다 객실 Persitence 라이브러리라는 라이브러리를 제공합니다. 벨로 공식 웹 사이트에서 짧은 코드입니다 :
구글은 안드로이드 애플 리케이션, SQLite는 데이터베이스를 기본 이상 기본적으로 추상화 계층을위한 SQL을 작성하는 매우 깨끗한 방법을 제공합니다 객실 Persitence 라이브러리라는 라이브러리를 제공합니다. 벨로 공식 웹 사이트에서 짧은 코드입니다 :
@Dao public interface UserDao { @Query("SELECT * FROM user") List<User> getAll(); @Query("SELECT * FROM user WHERE uid IN (:userIds)") List<User> loadAllByIds(int[] userIds); @Query("SELECT * FROM user WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") User findByName(String first, String last); @Insert void insertAll(User... users); @Delete void delete(User user); }
라이브러리에 대한 공식 문서에서 더 많은 예제와 더 좋은 문서가있다.
자바 ORM이다 MentaBean라는 하나가있다. 그것은 좋은 기능을 가지고 있으며, SQL을 작성하는 아주 간단한 방법이 될 것으로 보인다.
-
==============================
12.당신은 XML 파일에서 읽을 수 있습니다. 그것의 쉬운 관리와 함께 작동하도록. 그것은 자바 코드 몇 줄이 만들어 표준 STAX, DOM, SAX 파서 사용할 수 밖에 있습니다.
당신은 XML 파일에서 읽을 수 있습니다. 그것의 쉬운 관리와 함께 작동하도록. 그것은 자바 코드 몇 줄이 만들어 표준 STAX, DOM, SAX 파서 사용할 수 밖에 있습니다.
당신은 도움에 태그의 속성을 가진 몇 가지 의미 정보를 가질 수있는 SQL과 더 많은 일을 할. 이 코드를 적게하는 데 도움이 메소드 이름이나 쿼리 유형 또는 아무것도 될 수 있습니다.
당신은 단지 외부 XML을 넣고 그것을 쉽게를 유지 관리 할 수 있습니다. 특성 파일과 동일한 혜택을 제공합니다.
XML은 확장과 다른 형식으로 쉽게 전환이다.
Metamug는 SQL로 구성 REST 리소스 파일에 XML을 사용합니다.
-
==============================
13.당신은 속성의 파일에서 SQL 문자열을 넣어 경우에 당신은 일반 텍스트 파일에서 SQL 문자열을 유지할 수에 읽어 보시기 바랍니다.
당신은 속성의 파일에서 SQL 문자열을 넣어 경우에 당신은 일반 텍스트 파일에서 SQL 문자열을 유지할 수에 읽어 보시기 바랍니다.
즉, SQL 유형의 문제를 해결하지 않지만, 적어도 그것은 복사하게 & 더 쉽게 SQLPLUS TOAD에서 붙여 넣기 또는.
-
==============================
14.여러 줄에 걸쳐 깰 것을 어떻게 (쉽게 어쨌든 리소스로 텍스트 파일 및 부하에 제공 할 수 있음)자는 PreparedStatements 긴 SQL 문자열을 제외하고, 문자열 연결을받을 수 있나요?
여러 줄에 걸쳐 깰 것을 어떻게 (쉽게 어쨌든 리소스로 텍스트 파일 및 부하에 제공 할 수 있음)자는 PreparedStatements 긴 SQL 문자열을 제외하고, 문자열 연결을받을 수 있나요?
당신은 SQL 문자열을 생성하지 않는 직접 당신은? 즉 프로그래밍에 더-더 큰 없습니다. 자는 PreparedStatements를 사용하고 매개 변수로 데이터를 제공하십시오. 그것은 훨씬 SQL 인젝션의 기회를 줄일 수 있습니다.
from https://stackoverflow.com/questions/370818/cleanest-way-to-build-an-sql-string-in-java by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL Server에서 외래 키를 만들려면 어떻게해야합니까? (0) | 2020.04.05 |
---|---|
[SQL] 서로 값을 하나 개의 MySQL의 테이블을 업데이트 (0) | 2020.04.05 |
[SQL] 왜 사람들이 너무 많은 SQL 커서를 싫어합니까? [닫은] (0) | 2020.04.05 |
[SQL] 어떻게 SELECT INTO OUTFILE와 MySQL을 errcode를 13 주위를받을 수 있나요? (0) | 2020.04.05 |
[SQL] 가장 좋은 방법은 "비어 있거나 null 값"을 확인합니다 (0) | 2020.04.05 |