Basis data koneksi Java menambah, menghapus, memodifikasi, memeriksa kelas alat
Alat operasi basis data, karena kondisi paging dari setiap basis data pabrikan berbeda, saat ini mendukung permintaan paging dari Mysql, Oracle, dan Postgresql
Ini telah diuji di lingkungan Postgresql, tetapi tidak di database lain.
Pernyataan SQL harus dalam bentuk yang telah dikompilasi sebelumnya
Copy kode kodenya sebagai berikut:
paketdb;
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;
impor java.sql.Koneksi;
impor java.sql.Tanggal;
impor java.sql.Driver;
impor java.sql.DriverManager;
impor java.sql.PreparedStatement;
impor java.sql.ResultSet;
impor java.sql.SQLException;
impor java.sql.Pernyataan;
impor java.sql.Waktu;
import java.sql.Stempel Waktu;
impor java.util.ArrayList;
impor java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.naming.NamingException;
impor javax.sql.DataSource;
/**
* Alat kueri basis data
* Gunakan sql yang sudah dikompilasi
*
* @penulis XueLiang
*
*/
DBUtil kelas publik {
driver String statis pribadi;
Sumber Data statis pribadi ds = null;
string statis pribadi url = "jdbc:postgresql://192.168.56.101/db";
String statis pribadi pengguna = "tes";
kata sandi String statis pribadi = "12345678";
statis {
mencoba {
Class.forName("org.postgresql.Driver");
//ds = (DataSource)SpringContextUtil.getBean("dataSource");
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
}
/**
* Membangun koneksi
*
* @return dengan Koneksi
* @throwsException
*/
Koneksi statis pribadi getConnection() memunculkan Pengecualian {
Sambungan koneksi = DriverManager.getConnection(url, pengguna, kata sandi);
//Sambung koneksi = ds.getConnection();
Pengemudi d = DriverManager.getDriver(sambungan.getMetaData().getURL());
driver = d.getClass().getName();
kembali koneksi;
}
/**
* Tutup koneksi
*
* @param samb
* @param stmt
* @param praStmt
* @param rs
* @melempar SQLException
*/
private static void replease(Koneksi koneksi, Pernyataan stmt, ResultSet rs) melempar SQLException {
jika (rs != nol) {
rs.close();
rs = nol;
}
jika (stmt != nol) {
stmt.tutup();
stmt = nol;
}
jika (sambungan != null) {
samb.close();
samb = nol;
}
}
/**
* Gunakan ekspresi reguler untuk mendapatkan nama kolom di SELECT SQL
*
* @param sql
* @kembali
*/
Daftar statis pribadi<String> getColumnsFromSelect(String sql) {
Daftar<String> colNames = ArrayList baru<String>();
// Keluarkan bagian nama kolom di sql
Pola p = Pattern.compile("(?i)select//s(.*?)//sfrom.*");
Pencocokan m = p.matcher(sql.trim());
String[] tempA = nol;
jika (m.cocok()) {
tempA = m.grup(1).split(",");
}
jika (tempA == nol) {
kembalikan nol;
}
String p1 = "(//w+)";
String p2 = "(?://w+//s(//w+))";
String p3 = "(?://w+//sas//s(//w+))";
String p4 = "(?://w+//.(//w+))";
String p5 = "(?://w+//.//w+//s(//w+))";
String p6 = "(?://w+//.//w+//sas//s(//w+))";
String p7 = "(?:.+//s(//w+))";
String p8 = "(?:.+//sas//s(//w+))";
p = Pola.kompilasi("(?:" + p1 + "||" + p2 + "||" + p3 + "||" + p4
+ "||" + hal5 + "||" + hal6 + "||" + hal7 + "||" + hal8 + ")");
untuk (Suhu string : suhuA) {
m = p.matcher(temp.trim());
jika (!m.cocok()) {
melanjutkan;
}
untuk (int i = 1; i <= m.groupCount(); i++) {
if (m.grup(i) == null || "".sama dengan(m.grup(i))) {
melanjutkan;
}
colNames.tambahkan(m.grup(i));
}
}
kembalikan nama kolom;
}
/**
* Gunakan ekspresi reguler untuk mendapatkan nama kolom di INSERT SQL
*
* @param sql
* @kembali
*/
Daftar statis pribadi<String> getColumnsFromInsert(String sql) {
Daftar<String> colNames = ArrayList baru<String>();
// Keluarkan bagian nama kolom di sql
Pola p = Pattern.compile("(?i)insert//s+into.*//((.*)//)//s+values.*");
Pencocokan m = p.matcher(sql.trim());
String[] tempA = nol;
jika (m.cocok()) {
tempA = m.grup(1).split(",");
}
jika (tempA == nol) {
kembalikan nol;
}
String p1 = "(//w+)";
String p2 = "(?://w+//s(//w+))";
String p3 = "(?://w+//sas//s(//w+))";
String p4 = "(?://w+//.(//w+))";
String p5 = "(?://w+//.//w+//s(//w+))";
String p6 = "(?://w+//.//w+//sas//s(//w+))";
String p7 = "(?:.+//s(//w+))";
String p8 = "(?:.+//sas//s(//w+))";
p = Pola.kompilasi("(?:" + p1 + "||" + p2 + "||" + p3 + "||" + p4
+ "||" + hal5 + "||" + hal6 + "||" + hal7 + "||" + hal8 + ")");
untuk (Suhu string : suhuA) {
m = p.matcher(temp.trim());
jika (!m.cocok()) {
melanjutkan;
}
untuk (int i = 1; i <= m.groupCount(); i++) {
if (m.grup(i) == null || "".sama dengan(m.grup(i))) {
melanjutkan;
}
colNames.tambahkan(m.grup(i));
}
}
kembalikan nama kolom;
}
/**
* Gunakan ekspresi reguler untuk mendapatkan nama kolom di UPDATE SQL, termasuk klausa WHERE
*
* @param sql
* @kembali
*/
Daftar statis pribadi<String> getColumnsFromUpdate(String sql) {
Daftar<String> colNames = ArrayList baru<String>();
// Keluarkan bagian nama kolom di sql
Pola p = Pattern.compile("(?i)update(?:.*)set(.*)(?:from.*)*where(.*(dan)*.*)");
Pencocokan m = p.matcher(sql.trim());
String[] tempA = nol;
jika (m.cocok()) {
tempA = m.grup(1).split(",");
if(m.groupCount() > 1){
String[] tmp = m.group(2).split("dan");
String[] fina = String baru[tempA.length + tmp.length];
System.arraycopy(tempA, 0, fina, 0, tempA.length);
System.arraycopy(tmp, 0, fina, tempA.length, tmp.length);
suhuA = akhir;
}
}
jika (tempA == nol) {
kembalikan nol;
}
String p1 = "(?i)(//w+)(?://s*//=//s*.*)";
String p2 = "(?i)(?://w+//.)(//w+)(?://s*//=//s*.*)";
p = Pola.kompilasi(p1 + "||" + p2);
untuk (Suhu string : suhuA) {
m = p.matcher(temp.trim());
jika (!m.cocok()) {
melanjutkan;
}
untuk (int i = 1; i <= m.groupCount(); i++) {
if (m.grup(i) == null || "".sama dengan(m.grup(i))) {
melanjutkan;
}
colNames.tambahkan(m.grup(i));
}
}
kembalikan nama kolom;
}
/**
* Tambahkan kode statistik ke sql
*
* @param sql
* @kembali
*/
String statis pribadi addCountSQL(String sql) {
StringBuffer sb = StringBuffer baru();
sb.append(" pilih hitungan(*) sebagai dataCount dari (");
sb.tambahkan(sql);
sb.append(") sebagai");
kembali sb.toString();
}
/**
* Tambahkan kode paging ke sql
*
* @param sql
* @param mulai
* @batas param
* @kembali
*/
String statis pribadi addPagingSQL(String sql, int start, int limit) {
StringBuffer sb = StringBuffer baru();
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.tambahkan(sql);
sb.append("BATAS");
sb.tambahkan(mulai);
sb.tambahkan(",");
sb.tambahkan(batas);
} else if ("Oracle.jdbc.driver.OracleDriver".equals(driver)) {//Oracle8/8i/9i/10g database (mode tipis)
Daftar<String> daftar = getColumnsFromSelect(sql);
sb.append("pilih ");
untuk (String str : daftar)
sb.append(str).append(", ");
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append(" dari ("").append(sql).append(") sebagai");
sb.append(" di mana nomor baris antara ").append(start == 0 ? 1 : start).append(" dan ").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.tambahkan(sql);
sb.append("BATAS");
sb.tambahkan(batas);
sb.append("OFFSET");
sb.tambahkan(mulai);
}
kembali sb.toString();
}
/**
* Buat instance objek RusultSet ke dalam objek T
*
* @param<T>
* @param t
* @param rs
* @param sql
* @kembalikan t
* @throwsException
*/
instance <T> T statis pribadi (Kelas<T> t, ResultSet rs, String sql) memunculkan Pengecualian{
Daftar<String> kolom = getColumnsFromSelect(sql);
T obj = t.newInstance();
untuk (String col : kolom) {
mencoba{
Bidang f = t.getDeclaredField(col);
f.setAccessible(benar);
Objek v = getValue(col, f.getType().getName(), rs);
f.set(obj, v);
}menangkap(NoSuchFieldException e){
Bidang[] bidang = t.getDeclaredFields();
untuk (Bidang f : bidang) {
Kolom kolom = f.getAnnotation(Column.class);
if(kolom != null && kolom.nama().sama dengan(kolom)){
f.setAccessible(benar);
Objek v = getValue(col, f.getType().getName(), rs);
f.set(obj, v);
}
}
}
}
mengembalikan objek;
}
getValue Objek statis pribadi (Nama kolom String, tipe String, ResultSet rs) melempar SQLException{
Objek objek = null;
//Sistem.keluar.println("nama="+f.getName()+", type="+f.getType().getName() );
if("java.lang.Integer".equals(type) || "int".equals(type)) {
obj = rs.getInt(Namakolom);
}else if("java.lang.Long".equals(type) || "long".equals(type)) {
obj = rs.getLong(Namakolom);
}else if("java.lang.Short".equals(type)||"short".equals(type)) {
obj = rs.getShort(Namakolom);
}else if("java.lang.Float".equals(type)||"float".equals(type)) {
obj = rs.getFloat(Namakolom);
}else if("java.lang.Double".equals(type)||"double".equals(type)) {
obj = rs.getDouble(Namakolom);
}else if("java.lang.Byte".equals(type)||"byte".equals(type)) {
obj = rs.getByte(Namakolom);
}else if("java.lang.Boolean".equals(type)||"boolean".equals(type)) {
obj = rs.getBoolean(Namakolom);
}else if("java.lang.String".sama dengan(tipe)) {
obj = rs.getString(Namakolom);
}kalau tidak {
obj = rs.getObject(nama kolom);
}
//Sistem.out.println("name="+f.getName() +", type="+f.getType().getName()+", value="+(obj == null ? "NULL" : obj.getClass())+",{"+columnName+":"+obj+"}");
mengembalikan objek;
}
/**
* Tambahkan parameter di param ke pstate
*
* @param pstate
* @param kolom
* @melempar SQLException
*/
private static <T> void setParameters(PreparedStatement pstate, Object... params) memunculkan Pengecualian {
if (params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
Nilai objek = params[i];
int j = saya + 1;
jika (nilai == nol)
pstate.setString(j, "");
if (nilai instanceof String)
pstate.setString(j, (String) nilai);
else if (nilai contoh Boolean)
pstate.setBoolean(j, nilai (Boolean));
else if (nilai contoh Tanggal)
pstate.setDate(j, (Tanggal) nilai);
else if (nilai instanceof Ganda)
pstate.setDouble(j, nilai (Ganda));
else if (nilai instanceof Float)
pstate.setFloat(j, nilai (Float));
else if (nilai instance dari Integer)
pstate.setInt(j, nilai (Bilangan Bulat));
else if (nilai instanceof Long)
pstate.setLong(j, nilai (Panjang));
else if (nilai instanceof Pendek)
pstate.setShort(j, nilai (Pendek));
else if (nilai instanceof Time)
pstate.setTime(j, nilai (Waktu));
else if (nilai contoh Stempel Waktu)
pstate.setTimestamp(j, nilai (Stempel Waktu));
kalau tidak
pstate.setObject(j, nilai);
}
}
}
/**
* Tambahkan parameter di param ke pstate
*
* @param pstate
* @param kolom
* @param t
* @melempar SQLException
*/
private static <T> void setParameters(PreparedStatement pstate, Daftar<String> kolom, T t) melempar Pengecualian {
if (kolom != null && kolom.ukuran() > 0) {
for (int i = 0; i < kolom.ukuran(); i++) {
String attr = kolom.get(i);
Nilai objek = null;
Kelas<?> c = t.getClass();
mencoba{
Bidang f = c.getDeclaredField(attr);
nilai = f.dapatkan(t);
} tangkapan (NoSuchFieldException e){
Bidang[] bidang = c.getDeclaredFields();
untuk (Bidang f : bidang) {
Kolom kolom = f.getAnnotation(Column.class);
if(kolom != null && kolom.nama().sama dengan(attr))
nilai = f.dapatkan(t);
}
}
int j = saya + 1;
jika (nilai == nol)
pstate.setString(j, "");
if (nilai instanceof String)
pstate.setString(j, (String) nilai);
else if (nilai contoh Boolean)
pstate.setBoolean(j, nilai (Boolean));
else if (nilai contoh Tanggal)
pstate.setDate(j, (Tanggal) nilai);
else if (nilai instanceof Ganda)
pstate.setDouble(j, nilai (Ganda));
else if (nilai instanceof Float)
pstate.setFloat(j, nilai (Float));
else if (nilai instance dari Integer)
pstate.setInt(j, nilai (Bilangan Bulat));
else if (nilai instanceof Long)
pstate.setLong(j, nilai (Panjang));
else if (nilai instanceof Pendek)
pstate.setShort(j, nilai (Pendek));
else if (nilai instanceof Time)
pstate.setTime(j, nilai (Waktu));
else if (nilai contoh Stempel Waktu)
pstate.setTimestamp(j, nilai (Stempel Waktu));
kalau tidak
pstate.setObject(j, nilai);
}
}
}
/**
* Lakukan operasi penyisipan
*
* @param sql pernyataan sql yang telah dikompilasi sebelumnya
* @param t parameter di sql
* @return Jumlah baris eksekusi
* @throwsException
*/
public static <T> int insert(String sql, T t) melempar Pengecualian {
Sambungan koneksi = null;
Pernyataan Disiapkan pstate = null;
int pembaruanHitung = 0;
mencoba {
samb = getConnection();
Daftar<String> kolom = getColumnsFromInsert(sql);
pstate = samb.prepareStatement(sql);
setParameters(pstate, kolom, t);
updateCount = pstate.executeUpdate();
} Akhirnya {
tolong kembali(sambungan, pstate, null);
}
kembalikan updateCount;
}
/**
* Lakukan operasi penyisipan
*
* @param sql pernyataan sql yang telah dikompilasi sebelumnya
* @param parameter param
* @return Jumlah baris eksekusi
* @throwsException
*/
public static <T> int insert(String sql, Object... param) melempar Pengecualian {
Sambungan koneksi = null;
Pernyataan Disiapkan pstate = null;
int pembaruanHitung = 0;
mencoba {
samb = getConnection();
pstate = samb.prepareStatement(sql);
setParameter(pstate, param);
updateCount = pstate.executeUpdate();
} Akhirnya {
tolong kembali(sambungan, pstate, null);
}
kembalikan updateCount;
}
/**
* Lakukan operasi pembaruan
*
* @param sql pernyataan sql yang telah dikompilasi sebelumnya
* @param t parameter di sql
* @return Jumlah baris eksekusi
* @throwsException
*/
public static <T> int update(String sql, T t) memunculkan Pengecualian {
Sambungan koneksi = null;
Pernyataan Disiapkan pstate = null;
int pembaruanHitung = 0;
mencoba {
samb = getConnection();
Daftar<String> kolom = getColumnsFromUpdate(sql);
pstate = samb.prepareStatement(sql);
setParameters(pstate, kolom, t);
updateCount = pstate.executeUpdate();
} Akhirnya {
tolong kembali(sambungan, pstate, null);
}
kembalikan updateCount;
}
/**
* Lakukan operasi pembaruan
*
* @param sql
* @param parameter param
* @return Jumlah baris eksekusi
* @throwsException
*/
public static <T> int update(String sql, Object... param) memunculkan Pengecualian {
Sambungan koneksi = null;
Pernyataan Disiapkan pstate = null;
int pembaruanHitung = 0;
mencoba {
samb = getConnection();
pstate = samb.prepareStatement(sql);
setParameter(pstate, param);
updateCount = pstate.executeUpdate();
} Akhirnya {
tolong kembali(sambungan, pstate, null);
}
kembalikan updateCount;
}
/**
* Kueri objek jamak
*
* @param t Jenis objek yang dienkapsulasi oleh hasil kueri
* @param sql sql yang sudah dikompilasi
* @param kondisi kueri param
* @Daftar Kembali<T>
* @throwsException
*/
public static <T> Daftar<T> queryPlural(Kelas<T> t, String sql, Objek... param) melempar Pengecualian {
Sambungan koneksi = null;
Pernyataan Disiapkan stmt = null;
HasilSet rs = null;
Daftar<T> daftar = Daftar Array baru<T>();
mencoba {
samb = getConnection();
stmt = samb.prepareStatement(sql);
setParameter(stmt, param);
rs = stmt.executeQuery();
while (rs.next()) {
daftar.tambahkan(contoh(t, rs, sql));
}
} Akhirnya {
tolong kembali(sambungan, stmt, rs);
}
daftar pengembalian;
}
/**
* Kueri paging untuk objek jamak
*
* @param t Jenis objek yang dienkapsulasi oleh hasil kueri
* @param mulai halaman awal
* @param membatasi ukuran halaman
* @param sql pernyataan sql yang telah dikompilasi sebelumnya
* @param parameter kueri param
* @throwsException
*/
public static <T> Daftar<T> queryPluralForPagging(Kelas<T> t, int start, int limit, String sql, Object... param) melempar Pengecualian {
Sambungan koneksi = null;
Pernyataan Disiapkan stmt = null;
HasilSet rs = null;
Daftar<T> daftar = Daftar Array baru<T>();
mencoba {
samb = getConnection();
//Tambahkan kode paging
sql = addPagingSQL(sql, mulai, batas);
stmt = samb.prepareStatement(sql);
setParameter(stmt, param);
rs = stmt.executeQuery();
while (rs.next()) {
daftar.tambahkan(contoh(t, rs, sql));
}
} Akhirnya {
tolong kembali(sambungan, stmt, rs);
}
daftar pengembalian;
}
/**
* Kueri satu objek
*
* @param t objek hasil kueri
* @param sql sql yang sudah dikompilasi
* @param parameter kueri param
* @kembalikan T
* @throwsException
*/
public static <T> T querySingular(Kelas<T> t, String sql, Objek... param) melempar Pengecualian {
T keberatan = nol;
HasilSet rs = null;
Sambungan koneksi = null;
Pernyataan Disiapkan pstate = null;
mencoba {
samb = getConnection();
pstate = samb.prepareStatement(sql);
setParameter(pstate, param);
rs = pstate.executeQuery();
if (rs.next()) {
obj = contoh(t, rs, sql);
}
} Akhirnya {
tolong kembali(sambungan, pstate, rs);
}
mengembalikan objek;
}
/**
*Volume data kueri
*
* @param parameter kueri param
* @param sql
* @kembali
* @melempar SQLException
* @melempar NamingException
*/
public static int queryDataCount(String sql, Objek... param)
melempar Pengecualian {
int jumlah data = 0;
Sambungan koneksi = null;
Pernyataan Disiapkan pstate = null;
HasilSet rs = null;
mencoba {
samb = getConnection();
sql = addCountSQL(sql);
pstate = samb.prepareStatement(sql);
setParameter(pstate, param);
rs = pstate.executeQuery();
if (rs.next()) {
dataCount = rs.getInt("dataCount");
}
} Akhirnya {
tolong kembali(sambungan, pstate, rs);
}
kembalikan dataCount;
}
/**
* Komentar pada kolom atribut, digunakan untuk menandai kolom database yang sesuai dengan atribut tersebut
* Misalnya:
* @Kolom(nama="nama_pengguna");
* String nama pengguna;
* Menunjukkan bahwa bidang database yang sesuai dengan atribut namapengguna adalah nama_pengguna
*
* Jika atribut benar-benar sesuai dengan kolom database, tidak perlu menandainya
* @penulis xueliang
*/
@Target({ ElementType.FIELD })
@Retensi(Kebijakan Retensi.RUNTIME)
Kolom @interface publik{
Nama string() default "";
}
}