Java 연결 데이터베이스 추가, 삭제, 수정, 도구 클래스 확인
데이터베이스 운영 툴은 제조사별 데이터베이스의 페이징 조건이 다르기 때문에 현재 Mysql, Oracle, Postgresql의 페이징 쿼리를 지원하고 있다.
Postgresql 환경에서는 테스트되었지만 다른 데이터베이스에서는 테스트되지 않았습니다.
SQL 문은 미리 컴파일된 형식이어야 합니다.
다음과 같이 코드 코드를 복사합니다.
패키지DB;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.sql.Connection;
java.sql.Date 가져오기;
java.sql.Driver 가져오기;
java.sql.DriverManager 가져오기;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
java.sql.Time 가져오기;
import java.sql.Timestamp;
import java.util.ArrayList;
java.util.List 가져오기;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
* 데이터베이스 쿼리 도구
* 미리 컴파일된 SQL 사용
*
* @author XueLiang
*
*/
공개 클래스 DBUtil {
개인 정적 문자열 드라이버;
개인 정적 데이터 소스 ds = null;
개인 정적 문자열 url = "jdbc:postgresql://192.168.56.101/db";
개인 정적 문자열 사용자 = "테스트";
개인 정적 문자열 비밀번호 = "12345678";
정적 {
노력하다 {
Class.forName("org.postgresql.Driver");
//ds = (DataSource)SpringContextUtil.getBean("dataSource");
} 잡기(예외 e) {
e.printStackTrace();
}
}
/**
* 연결 설정
*
* @return con 연결
* @throwsException
*/
개인 정적 연결 getConnection()이 예외를 발생시킵니다.
연결 conn = DriverManager.getConnection(url, 사용자, 비밀번호);
//연결 conn = ds.getConnection();
드라이버 d = DriverManager.getDriver(conn.getMetaData().getURL());
드라이버 = d.getClass().getName();
반환 연결;
}
/**
* 연결을 닫습니다
*
* @param 콘
* @param stmt
* @param preStmt
* @param rs
* @SQLException 발생
*/
private static void replease(Connection conn, 명령문 stmt, ResultSet rs)가 SQLException을 발생시킵니다.
if (rs != null) {
rs.close();
RS = 널;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
if (콘 != null) {
conn.close();
콘 = 널;
}
}
/**
* 정규식을 사용하여 SELECT SQL에서 열 이름을 얻습니다.
*
* @param SQL
* @반품
*/
개인 정적 List<String> getColumnsFromSelect(String sql) {
List<String> colNames = new ArrayList<String>();
//SQL에서 컬럼명 부분을 빼낸다.
패턴 p = Pattern.compile("(?i)select//s(.*?)//sfrom.*");
일치자 m = p.matcher(sql.trim());
문자열[] tempA = null;
if (m.matches()) {
tempA = m.group(1).split(",");
}
if (tempA == null) {
null을 반환;
}
문자열 p1 = "(//w+)";
문자열 p2 = "(?://w+//s(//w+))";
문자열 p3 = "(?://w+//sas//s(//w+))";
문자열 p4 = "(?://w+//.(//w+))";
문자열 p5 = "(?://w+//.//w+//s(//w+))";
문자열 p6 = "(?://w+//.//w+//sas//s(//w+))";
문자열 p7 = "(?:.+//s(//w+))";
문자열 p8 = "(?:.+//sas//s(//w+))";
p = Pattern.compile("(?:" + p1 + "||" + p2 + "||" + p3 + "||" + p4
+ "||" + p5 + "||" + p6 + "||" + p8 + ")")
for (문자열 온도 : tempA) {
m = p.matcher(temp.trim());
if (!m.matches()) {
계속하다;
}
for (int i = 1; i <= m.groupCount(); i++) {
if (m.group(i) == null || "".equals(m.group(i))) {
계속하다;
}
colNames.add(m.group(i));
}
}
colName을 반환합니다.
}
/**
* INSERT SQL에서 정규식을 사용하여 열 이름 얻기
*
* @param SQL
* @반품
*/
개인 정적 List<String> getColumnsFromInsert(String sql) {
List<String> colNames = new ArrayList<String>();
//SQL에서 컬럼명 부분을 빼낸다.
패턴 p = Pattern.compile("(?i)insert//s+into.*//((.*)//)//s+values.*");
일치자 m = p.matcher(sql.trim());
문자열[] tempA = null;
if (m.matches()) {
tempA = m.group(1).split(",");
}
if (tempA == null) {
null을 반환;
}
문자열 p1 = "(//w+)";
문자열 p2 = "(?://w+//s(//w+))";
문자열 p3 = "(?://w+//sas//s(//w+))";
문자열 p4 = "(?://w+//.(//w+))";
문자열 p5 = "(?://w+//.//w+//s(//w+))";
문자열 p6 = "(?://w+//.//w+//sas//s(//w+))";
문자열 p7 = "(?:.+//s(//w+))";
문자열 p8 = "(?:.+//sas//s(//w+))";
p = Pattern.compile("(?:" + p1 + "||" + p2 + "||" + p3 + "||" + p4
+ "||" + p5 + "||" + p6 + "||" + p8 + ")")
for (문자열 온도 : tempA) {
m = p.matcher(temp.trim());
if (!m.matches()) {
계속하다;
}
for (int i = 1; i <= m.groupCount(); i++) {
if (m.group(i) == null || "".equals(m.group(i))) {
계속하다;
}
colNames.add(m.group(i));
}
}
colName을 반환합니다.
}
/**
* 정규식을 사용하여 WHERE 절을 포함하여 UPDATE SQL의 열 이름을 얻습니다.
*
* @param SQL
* @반품
*/
개인 정적 List<String> getColumnsFromUpdate(String sql) {
List<String> colNames = new ArrayList<String>();
//SQL에서 컬럼명 부분을 빼낸다.
패턴 p = Pattern.compile("(?i)update(?:.*)set(.*)(?:from.*)*where(.*(and)*.*)");
일치자 m = p.matcher(sql.trim());
문자열[] tempA = null;
if (m.matches()) {
tempA = m.group(1).split(",");
if(m.groupCount() > 1){
String[] tmp = m.group(2).split("and");
String[] fina = new String[tempA.length + tmp.length];
System.arraycopy(tempA, 0, fina, 0, tempA.length);
System.arraycopy(tmp, 0, fina, tempA.length, tmp.length);
온도A = 피나;
}
}
if (tempA == null) {
null을 반환;
}
문자열 p1 = "(?i)(//w+)(?://s*//=//s*.*)";
문자열 p2 = "(?i)(?://w+//.)(//w+)(?://s*//=//s*.*)";
p = Pattern.compile(p1 + "||" + p2);
for (문자열 온도 : tempA) {
m = p.matcher(temp.trim());
if (!m.matches()) {
계속하다;
}
for (int i = 1; i <= m.groupCount(); i++) {
if (m.group(i) == null || "".equals(m.group(i))) {
계속하다;
}
colNames.add(m.group(i));
}
}
colName을 반환합니다.
}
/**
* SQL에 통계 코드 추가
*
* @param SQL
* @반품
*/
개인 정적 문자열 addCountSQL(문자열 sql) {
StringBuffer sb = new StringBuffer();
sb.append(" (")에서 dataCount로 count(*)를 선택합니다.
sb.append(sql);
sb.append(")를");
sb.toString()을 반환합니다.
}
/**
* SQL에 페이징 코드 추가
*
* @param SQL
* @param 시작
* @param 제한
* @반품
*/
개인 정적 문자열 addPagingSQL(String sql, int start, intlimit) {
StringBuffer sb = new StringBuffer();
if ("com.microsoft.jdbc.sqlserver.SQLServerDviver".equals(driver)) {//SQLServer 0.7 2000
} else if ("com.microsoft.sqlserver.jdbc.SQLServerDriver".equals(driver)) {//SQLServer 2005 2008
} else if ("com.mysql.jdbc.Driver".equals(driver)) {//MySQL
sb.append(sql);
sb.append(" 제한 ");
sb.append(시작);
sb.append(",");
sb.append(한계);
} else if ("oracle.jdbc.driver.OracleDriver".equals(driver)) {//Oracle8/8i/9i/10g 데이터베이스(씬 모드)
List<String> 목록 = getColumnsFromSelect(sql);
sb.append("선택");
for(문자열 문자열: 목록)
sb.append(str).append(", ");
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append(" from (").append(sql).append(")를 ");
sb.append(" ").append(start == 0 ? 1 : start).append(" 및 ").append(limit) 사이의 rownum;
} else if ("com.ibm.db2.jdbc.app.DB2Driver".equals(드라이버)) {//DB2
} else if ("com.sybase.jdbc.SybDriver".equals(드라이버)) {//Sybase
} else if ("com.informix.jdbc.IfxDriver".equals(드라이버)) {//Informix
} else if ("org.postgresql.Driver".equals(driver)) {//PostgreSQL
sb.append(sql);
sb.append(" 제한 ");
sb.append(한계);
sb.append(" 오프셋 ");
sb.append(시작);
}
sb.toString()을 반환합니다.
}
/**
* RusultSet 개체를 T 개체로 인스턴스화합니다.
*
* @param <T>
* @param t
* @param rs
* @param SQL
* @return t
* @throwsException
*/
private static <T> T 인스턴스(Class<T> t, ResultSet rs, String sql)에서 예외 발생{
List<String> 열 = getColumnsFromSelect(sql);
T obj = t.newInstance();
for (String col : 열) {
노력하다{
필드 f = t.getDeclaredField(col);
f.setAccessible(true);
객체 v = getValue(col, f.getType().getName(), rs);
f.set(obj, v);
}catch(NoSuchFieldException e){
Field[] 필드 = t.getDeclaredFields();
for (필드 f : 필드) {
열 열 = f.getAnnotation(Column.class);
if(열 != null && 열.이름().equals(col)){
f.setAccessible(true);
객체 v = getValue(col, f.getType().getName(), rs);
f.set(obj, v);
}
}
}
}
반환 객체;
}
private static Object getValue(String columnName, String type, ResultSet rs)에서 SQLException이 발생합니다.
객체 obj = null;
//System.out.println("name="+f.getName()+", type="+f.getType().getName() );
if("java.lang.Integer".equals(type) || "int".equals(type)) {
obj = rs.getInt(열이름);
}else if("java.lang.Long".equals(type) || "long".equals(type)) {
obj = rs.getLong(열이름);
}else if("java.lang.Short".equals(type)||"short".equals(type)) {
obj = rs.getShort(열이름);
}else if("java.lang.Float".equals(type)||"float".equals(type)) {
obj = rs.getFloat(열이름);
}else if("java.lang.Double".equals(type)||"double".equals(type)) {
obj = rs.getDouble(열이름);
}else if("java.lang.Byte".equals(type)||"byte".equals(type)) {
obj = rs.getByte(열이름);
}else if("java.lang.Boolean".equals(type)||"boolean".equals(type)) {
obj = rs.getBoolean(열 이름);
}else if("java.lang.String".equals(type)) {
obj = rs.getString(columnName);
}또 다른 {
obj = rs.getObject(columnName);
}
//System.out.println("name="+f.getName() +", type="+f.getType().getName()+", value="+(obj == null ? "NULL" : obj.getClass())+",{"+columnName+":"+obj+"}");
반환 객체;
}
/**
* pstate에 param의 매개변수를 추가합니다.
*
* @param pstate
* @param 열
* @SQLException 발생
*/
private static <T> void setParameters(PreparedStatement pstate, Object... params)가 예외를 발생시킵니다.
if (params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
객체값 = params[i];
int j = i + 1;
if (값 == null)
pstate.setString(j, "");
if(문자열의 값 인스턴스)
pstate.setString(j, (문자열) 값);
else if(부울 값 인스턴스)
pstate.setBoolean(j, (부울) 값);
else if(날짜 인스턴스 값)
pstate.setDate(j, (날짜) 값);
else if(Double의 값 인스턴스)
pstate.setDouble(j, (Double) 값);
else if(Float 인스턴스 값)
pstate.setFloat(j, (Float) 값);
else if(정수의 값 인스턴스)
pstate.setInt(j, (정수) 값);
else if(Long의 값 인스턴스)
pstate.setLong(j, (Long) 값);
else if(Short의 값 인스턴스)
pstate.setShort(j, (짧은) 값);
else if(시간 인스턴스 값)
pstate.setTime(j, (시간) 값);
else if(타임스탬프 값 인스턴스)
pstate.setTimestamp(j, (타임스탬프) 값);
또 다른
pstate.setObject(j, value);
}
}
}
/**
* pstate에 param의 매개변수를 추가합니다.
*
* @param pstate
* @param 열
* @param t
* @SQLException 발생
*/
private static <T> void setParameters(PreparedStatement pstate, List<String> columns, T t) throws Exception {
if (열 != null && columns.size() > 0) {
for (int i = 0; i < columns.size(); i++) {
문자열 속성 = columns.get(i);
개체 값 = null;
클래스<?> c = t.getClass();
노력하다{
필드 f = c.getDeclaredField(attr);
값 = f.get(t);
} 잡기(NoSuchFieldException e){
Field[] 필드 = c.getDeclaredFields();
for (필드 f : 필드) {
열 열 = f.getAnnotation(Column.class);
if(열 != null && 열.이름().equals(attr))
값 = f.get(t);
}
}
int j = i + 1;
if (값 == null)
pstate.setString(j, "");
if(문자열의 값 인스턴스)
pstate.setString(j, (문자열) 값);
else if(부울 값 인스턴스)
pstate.setBoolean(j, (부울) 값);
else if(날짜 인스턴스 값)
pstate.setDate(j, (날짜) 값);
else if(Double의 값 인스턴스)
pstate.setDouble(j, (Double) 값);
else if(Float 인스턴스 값)
pstate.setFloat(j, (Float) 값);
else if(정수의 값 인스턴스)
pstate.setInt(j, (정수) 값);
else if(Long의 값 인스턴스)
pstate.setLong(j, (Long) 값);
else if(Short의 값 인스턴스)
pstate.setShort(j, (짧은) 값);
else if(시간 인스턴스 값)
pstate.setTime(j, (시간) 값);
else if(타임스탬프 값 인스턴스)
pstate.setTimestamp(j, (타임스탬프) 값);
또 다른
pstate.setObject(j, value);
}
}
}
/**
* 삽입 작업 수행
*
* @param sql 미리 컴파일된 sql 문
* SQL의 @param t 매개변수
* @return 실행 라인 수
* @throwsException
*/
public static <T> int insert(String sql, T t)는 예외를 발생시킵니다.
연결 연결 = null;
ReadyStatement pstate = null;
int updateCount = 0;
노력하다 {
conn = getConnection();
List<String> 열 = getColumnsFromInsert(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, columns, t);
updateCount = pstate.executeUpdate();
} 마지막으로 {
replease(conn, pstate, null);
}
업데이트 개수를 반환합니다.
}
/**
* 삽입 작업 수행
*
* @param sql 미리 컴파일된 sql 문
* @param 매개변수 매개변수
* @return 실행 라인 수
* @throwsException
*/
public static <T> int insert(String sql, Object... param)는 예외를 발생시킵니다.
연결 연결 = null;
ReadyStatement pstate = null;
int updateCount = 0;
노력하다 {
conn = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
updateCount = pstate.executeUpdate();
} 마지막으로 {
replease(conn, pstate, null);
}
업데이트 개수를 반환합니다.
}
/**
* 업데이트 작업 수행
*
* @param sql 미리 컴파일된 sql 문
* SQL의 @param t 매개변수
* @return 실행 라인 수
* @throwsException
*/
public static <T> int update(String sql, T t)는 예외를 발생시킵니다.
연결 연결 = null;
ReadyStatement pstate = null;
int updateCount = 0;
노력하다 {
conn = getConnection();
List<String> 열 = getColumnsFromUpdate(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, columns, t);
updateCount = pstate.executeUpdate();
} 마지막으로 {
replease(conn, pstate, null);
}
업데이트 개수를 반환합니다.
}
/**
* 업데이트 작업 수행
*
* @param SQL
* @param 매개변수 매개변수
* @return 실행 라인 수
* @throwsException
*/
public static <T> int update(String sql, Object... param)에서 예외가 발생합니다.
연결 연결 = null;
ReadyStatement pstate = null;
int updateCount = 0;
노력하다 {
conn = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
updateCount = pstate.executeUpdate();
} 마지막으로 {
replease(conn, pstate, null);
}
업데이트 개수를 반환합니다.
}
/**
* 복수 객체 쿼리
*
* @param t 쿼리 결과로 캡슐화된 객체 유형
* @param sql 미리 컴파일된 SQL
* @param param 쿼리 조건
* @return 목록<T>
* @throwsException
*/
public static <T> List<T> queryPlural(Class<T> t, String sql, Object... param) throws Exception {
연결 연결 = null;
ReadyStatement stmt = null;
결과 집합 rs = null;
List<T> 목록 = new ArrayList<T>();
노력하다 {
conn = getConnection();
stmt = conn.prepareStatement(sql);
setParameters(stmt, param);
rs = stmt.executeQuery();
동안(rs.next()) {
list.add(인스턴스(t, rs, sql));
}
} 마지막으로 {
다시 한번 부탁드립니다(conn, stmt, rs);
}
반환 목록;
}
/**
* 복수 객체에 대한 페이징 쿼리
*
* @param t 쿼리 결과로 캡슐화된 객체 유형
* @param 시작 시작 페이지
* @param 페이지 크기 제한
* @param sql 미리 컴파일된 sql 문
* @param param 쿼리 매개변수
* @throwsException
*/
public static <T> List<T> queryPluralForPaging(Class<T> t, int start, intlimit, String sql, Object... param) throws Exception {
연결 연결 = null;
ReadyStatement stmt = null;
결과 집합 rs = null;
List<T> 목록 = new ArrayList<T>();
노력하다 {
conn = getConnection();
//페이징 코드 추가
sql = addPagingSQL(sql, 시작, 제한);
stmt = conn.prepareStatement(sql);
setParameters(stmt, param);
rs = stmt.executeQuery();
동안(rs.next()) {
list.add(인스턴스(t, rs, sql));
}
} 마지막으로 {
다시 한번 부탁드립니다(conn, stmt, rs);
}
반환 목록;
}
/**
* 단일 개체 쿼리
*
* @param t 쿼리 결과 객체
* @param sql 미리 컴파일된 SQL
* @param param 쿼리 매개변수
* @return T
* @throwsException
*/
public static <T> T querySingular(Class<T> t, String sql, Object... param) 예외 발생 {
T obj = null;
결과 집합 rs = null;
연결 연결 = null;
ReadyStatement pstate = null;
노력하다 {
conn = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
rs = pstate.executeQuery();
if (rs.next()) {
obj = 인스턴스(t, rs, sql);
}
} 마지막으로 {
replease(conn, pstate, rs);
}
반환 객체;
}
/**
*쿼리 데이터 볼륨
*
* @param param 쿼리 매개변수
* @param SQL
* @반품
* @SQLException 발생
* @namingException 발생
*/
공개 정적 int queryDataCount(String sql, Object... param)
예외가 발생합니다. {
int dataCount = 0;
연결 연결 = null;
ReadyStatement pstate = null;
결과 집합 rs = null;
노력하다 {
conn = getConnection();
sql = addCountSQL(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
rs = pstate.executeQuery();
if (rs.next()) {
dataCount = rs.getInt("dataCount");
}
} 마지막으로 {
replease(conn, pstate, rs);
}
데이터카운트를 반환합니다.
}
/**
* 속성에 해당하는 데이터베이스 필드를 표시하는 데 사용되는 속성 필드에 대한 설명
* 예를 들어:
* @Column(name="사용자_이름");
* 문자열 사용자 이름;
* userName 속성에 해당하는 데이터베이스 필드가 user_name임을 나타냅니다.
*
* 속성이 데이터베이스 필드와 완전히 일치하는 경우 표시할 필요가 없습니다.
* @author xueliang
*/
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
공개 @인터페이스 열{
문자열 이름() 기본값 "";
}
}