Java接続データベースの追加、削除、変更、チェックツールクラス
データベース操作ツールは、各メーカーのデータベースのページング条件が異なるため、現在Mysql、Oracle、Postgresqlのページングクエリをサポートしています。
Postgresql 環境ではテストされていますが、他のデータベースではテストされていません。
SQL ステートメントはプリコンパイルされた形式である必要がある
次のようにコードをコピーします。
パッケージデータベース;
java.lang.annotation.ElementType をインポートします。
インポート java.lang.annotation.Retention;
インポート java.lang.annotation.RetentionPolicy;
インポート java.lang.annotation.Target;
java.lang.reflect.Fieldをインポートします。
java.sql.Connectionをインポートします。
インポートjava.sql.Date;
java.sql.Driverをインポートします。
java.sql.DriverManagerをインポートします。
インポートjava.sql.PreparedStatement;
インポートjava.sql.ResultSet;
インポート java.sql.SQLException;
java.sql.Statementをインポートします。
インポートjava.sql.Time;
インポートjava.sql.Timestamp;
java.util.ArrayListをインポートします。
java.util.Listをインポートします。
java.util.regex.Matcherをインポートします。
java.util.regex.Patternをインポートします。
インポートjavax.naming.NamingException;
インポートjavax.sql.DataSource;
/**
* データベースクエリツール
* プリコンパイル済み SQL を使用する
*
* @作者XueLiang
*
*/
パブリック クラス DBUtil {
プライベート静的文字列ドライバー。
プライベート静的データソース ds = null;
プライベート静的文字列 URL = "jdbc:postgresql://192.168.56.101/db";
プライベート静的文字列ユーザー = "テスト";
プライベート静的文字列パスワード = "12345678";
静的 {
試す {
Class.forName("org.postgresql.Driver");
//ds = (DataSource)SpringContextUtil.getBean("dataSource");
} catch (例外 e) {
e.printStackTrace();
}
}
/**
* 接続を確立する
*
* @return con 接続
* @throwsException
*/
private static Connection getConnection() が例外をスローする {
接続 conn = DriverManager.getConnection(url, ユーザー, パスワード);
//接続 conn = ds.getConnection();
ドライバー d = DriverManager.getDriver(conn.getMetaData().getURL());
ドライバー = d.getClass().getName();
コンを返します。
}
/**
* 接続を閉じます
*
* @パラメータコン
* @paramstmt
* @param preStmt
* @param rs
* @throws SQLException
*/
private static void replease(Connection conn, Statement stmt, ResultSet rs) throws SQLException {
if (rs != null) {
rs.close();
rs = null;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
}
/**
* 正規表現を使用して SELECT SQL で列名を取得します
*
* @param SQL
* @戻る
*/
private static 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 + "||" + p8 + ")"
for (文字列 temp : 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));
}
}
列名を返します。
}
/**
* INSERT SQL で正規表現を使用して列名を取得します
*
* @param SQL
* @戻る
*/
private static 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 + "||" + p8 + ")"
for (文字列 temp : 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));
}
}
列名を返します。
}
/**
* 正規表現を使用して、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);
tempA = フィナ;
}
}
if (tempA == null) {
null を返します。
}
文字列 p1 = "(?i)(//w+)(?://s*//=//s*.*)";
文字列 p2 = "(?i)(?://w+//.)(//w+)(?://s*//=//s*.*)";
p = Pattern.compile(p1 + "||" + p2);
for (文字列 temp : 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));
}
}
列名を返します。
}
/**
* SQLに統計コードを追加
*
* @param SQL
* @戻る
*/
プライベート静的 String addCountSQL(String sql) {
StringBuffer sb = new StringBuffer();
sb.append(" select count(*) as dataCount from (");
sb.append(sql);
sb.append(") を ");
sb.toString() を返します。
}
/**
* SQLにページングコードを追加
*
* @param SQL
* @param 開始
* @param 制限
* @戻る
*/
private static String addPagingSQL(String sql, int start, int limit) {
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(" LIMIT ");
sb.append(開始);
sb.append(",");
sb.append(制限);
} else if ("oracle.jdbc.driver.OracleDriver".equals(driver)) {//Oracle8/8i/9i/10g データベース (シン モード)
List<String> list = getColumnsFromSelect(sql);
sb.append("選択");
for (文字列 str : リスト)
sb.append(str).append(", ");
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append(" from (").append(sql).append(") as a");
sb.append(" where rownum は ").append(start == 0 ? 1 : start).append(" と ").append(limit);
else if ("com.ibm.db2.jdbc.app.DB2Driver".equals(driver)) {//DB2
} else if ("com.sybase.jdbc.SybDriver".equals(driver)) {//Sybase
} else if ("com.informix.jdbc.IfxDriver".equals(driver)) {//Informix
} else if ("org.postgresql.Driver".equals(driver)) {//PostgreSQL
sb.append(sql);
sb.append(" LIMIT ");
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) throws Exception{
List<String> 列 = getColumnsFromSelect(sql);
T obj = t.newInstance();
for (文字列列:列) {
試す{
フィールド f = t.getDeclaredField(col);
f.setAccessible(true);
オブジェクト v = getValue(col, f.getType().getName(), rs);
f.set(obj, v);
}catch(NoSuchFieldException e){
フィールド[] フィールド = t.getDeclaredFields();
for (フィールド f : フィールド) {
列列 = f.getAnnotation(Column.class);
if(column != null && column.name().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) throws 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(列名);
}それ以外 {
obj = rs.getObject(列名);
}
//System.out.println("name="+f.getName() +", type="+f.getType().getName()+", value="+(obj == null ? "NULL" : obj.getClass())+",{"+columnName+":"+obj+"}");
オブジェクトを返します。
}
/**
* param のパラメータを pstate に追加します
*
* @param pstate
* @param列
* @throws SQLException
*/
private static <T> void setParameters(PreparedStatement pstate, Object... params) throws Exception {
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, (浮動小数点数) 値);
else if (整数の値インスタンス)
pstate.setInt(j, (整数) 値);
else if (値インスタンスof Long)
pstate.setLong(j, (Long) 値);
else if (値インスタンスof Short)
pstate.setShort(j, (ショート) 値);
else if (時間の値インスタンス)
pstate.setTime(j, (時間) 値);
else if (タイムスタンプの値インスタンス)
pstate.setTimestamp(j, (タイムスタンプ) 値);
それ以外
pstate.setObject(j, 値);
}
}
}
/**
* param のパラメータを pstate に追加します
*
* @param pstate
* @param列
* @param t
* @throws SQLException
*/
private static <T> void setParameters(PreparedStatement pstate, List<String> columns, T t) throws Exception {
if (columns != 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);
} catch (NoSuchFieldException e){
フィールド[] フィールド = c.getDeclaredFields();
for (フィールド f : フィールド) {
列列 = f.getAnnotation(Column.class);
if(column != null && column.name().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, (浮動小数点数) 値);
else if (整数の値インスタンス)
pstate.setInt(j, (整数) 値);
else if (値インスタンスof Long)
pstate.setLong(j, (Long) 値);
else if (値インスタンスof Short)
pstate.setShort(j, (ショート) 値);
else if (時間の値インスタンス)
pstate.setTime(j, (時間) 値);
else if (タイムスタンプの値インスタンス)
pstate.setTimestamp(j, (タイムスタンプ) 値);
それ以外
pstate.setObject(j, 値);
}
}
}
/**
* 挿入操作を実行します
*
* @param SQL プリコンパイルされた SQL ステートメント
* @param t SQLのパラメータ
* @return 実行行数
* @throwsException
*/
public static <T> int insert(String sql, T t) throws Exception {
接続 conn = null;
PreparedStatement 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);
}
updateCount を返します。
}
/**
* 挿入操作を実行します
*
* @param SQL プリコンパイルされた SQL ステートメント
* @param パラメータパラメータ
* @return 実行行数
* @throwsException
*/
public static <T> int insert(String sql, Object... param) throws Exception {
接続 conn = null;
PreparedStatement pstate = null;
int updateCount = 0;
試す {
conn = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
updateCount = pstate.executeUpdate();
} ついに {
replease(conn、pstate、null);
}
updateCount を返します。
}
/**
* アップデート操作を実行します
*
* @param SQL プリコンパイルされた SQL ステートメント
* @param t SQLのパラメータ
* @return 実行行数
* @throwsException
*/
public static <T> int update(String sql, T t) は例外をスローします {
接続 conn = null;
PreparedStatement 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);
}
updateCount を返します。
}
/**
* アップデート操作を実行します
*
* @param SQL
* @param パラメータパラメータ
* @return 実行行数
* @throwsException
*/
public static <T> int update(String sql, Object... param) throws Exception {
接続 conn = null;
PreparedStatement pstate = null;
int updateCount = 0;
試す {
conn = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
updateCount = pstate.executeUpdate();
} ついに {
replease(conn、pstate、null);
}
updateCount を返します。
}
/**
* 複数のオブジェクトをクエリする
*
* @param t クエリ結果によってカプセル化されたオブジェクト タイプ
* @param SQL プリコンパイル済み SQL
* @param パラメータのクエリ条件
* @return リスト<T>
* @throwsException
*/
public static <T> List<T> queryPlural(Class<T> t, String sql, Object... param) throws Exception {
接続 conn = null;
PreparedStatement stmt = null;
結果セット rs = null;
List<T> リスト = new ArrayList<T>();
試す {
conn = getConnection();
stmt = conn.prepareStatement(sql);
setParameters(stmt, param);
rs = stmt.executeQuery();
while (rs.next()) {
list.add(instance(t, rs, sql));
}
} ついに {
replease(conn、stmt、rs);
}
リストを返す;
}
/**
* 複数のオブジェクトに対するページングクエリ
*
* @param t クエリ結果によってカプセル化されたオブジェクト タイプ
* @param start 開始ページ
* @param 制限ページサイズ
* @param SQL プリコンパイルされた SQL ステートメント
* @param param クエリパラメータ
* @throwsException
*/
public static <T> List<T> queryPluralForPagging(Class<T> t, int start, int limit, String sql, Object... param) throws Exception {
接続 conn = null;
PreparedStatement stmt = null;
結果セット rs = null;
List<T> リスト = new ArrayList<T>();
試す {
conn = getConnection();
//ページングコードを追加
sql = addPagingSQL(sql, 開始, 制限);
stmt = conn.prepareStatement(sql);
setParameters(stmt, param);
rs = stmt.executeQuery();
while (rs.next()) {
list.add(instance(t, rs, sql));
}
} ついに {
replease(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) throws Exception {
T obj = null;
結果セット rs = null;
接続 conn = null;
PreparedStatement 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
* @戻る
* @throws SQLException
* @throws NamingException
*/
public static int queryDataCount(String sql, Object... param)
例外をスローします {
int dataCount = 0;
接続 conn = null;
PreparedStatement 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 であることを示します
*
* 属性がデータベースのフィールドと完全に一致している場合は、マークする必要はありません。
* @著者xueliang
*/
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
パブリック @interface 列{
文字列名() デフォルト "";
}
}