إضافة قاعدة بيانات اتصال Java وحذفها وتعديلها والتحقق من فئة الأداة
أدوات تشغيل قاعدة البيانات، نظرًا لاختلاف شروط الترحيل لكل قاعدة بيانات خاصة بالشركة المصنعة، تدعم حاليًا استعلامات الترحيل الخاصة بـ Mysql وOracle وPostgresql
لقد تم اختباره في بيئة Postgresql، ولكن ليس في قواعد البيانات الأخرى.
يجب أن تكون عبارات SQL في شكل مترجم مسبقًا
انسخ رمز الكود كما يلي:
packagedb;
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;
استيراد java.sql.Connection؛
استيراد java.sql.Date؛
استيراد java.sql.Driver؛
استيراد java.sql.DriverManager؛
import java.sql.PreparedStatement;
import java.sql.ResultSet;
استيراد java.sql.SQLException؛
استيراد java.sql.Statement؛
استيراد java.sql.Time؛
استيراد java.sql.Timestamp؛
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
* أدوات الاستعلام عن قاعدة البيانات
* استخدم SQL المترجمة مسبقًا
*
* @ المؤلف شيويه ليانغ
*
*/
الطبقة العامة DBUtil {
برنامج تشغيل سلسلة ثابت خاص؛
مصدر بيانات ثابت خاص ds = null;
عنوان URL لسلسلة ثابتة خاصة = "jdbc:postgresql://192.168.56.101/db";
مستخدم سلسلة ثابتة خاصة = "اختبار"؛
كلمة مرور سلسلة ثابتة خاصة = "12345678"؛
ثابت {
يحاول {
Class.forName("org.postgresql.Driver");
//ds = (DataSource)SpringContextUtil.getBean("dataSource");
} قبض (الاستثناء ه) {
printStackTrace();
}
}
/**
* إنشاء اتصال
*
* @return con اتصال
* @throwsException
*/
اتصال ثابت خاص getConnection() يلقي استثناء {
اتصال conn = DriverManager.getConnection(url, user,password);
//اتصال conn = ds.getConnection();
Driver d = DriverManager.getDriver(conn.getMetaData().getURL());
driver = d.getClass().getName();
العودة كون؛
}
/**
* أغلق الاتصال
*
* @param كون
* @param stmt
* @param preStmt
* @param روبية
* @ يلقي SQLException
*/
إعادة الرجاء باطل ثابت خاص (اتصال conn، بيان stmt، ResultSet rs) يلقي SQLException {
إذا (RS ! = فارغة) {
rs. Close();
rs = null;
}
إذا (ستمت!= فارغة) {
stmt. Close();
stmt = null;
}
إذا (كون ! = فارغة) {
conn.Close();
كون = فارغ؛
}
}
/**
* استخدم التعبيرات العادية للحصول على أسماء الأعمدة في SELECT SQL
*
* @param sql
* @يعود
*/
قائمة ثابتة خاصة <String> getColumnsFromSelect(String sql) {
List<String> colNames = new ArrayList<String>();
// أخرج جزء اسم العمود في SQL
Pattern p = Pattern.compile("(?i)select//s(.*?)//sfrom.*");
Matcher m = p.matcher(sql.trim());
String[] tempA = null;
إذا (م.ماتشز ()) {
tempA = m.group(1).split("،");
}
إذا (درجة الحرارة == فارغة) {
عودة فارغة؛
}
سلسلة 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 = Pattern.compile("(?:" + p1 + "||" + p2 + "||" + p3 + "||" + p4
+ "||" + ص5 + "||" + ص6 + "||" + ص7 + "||" + ص8 + ")");
لـ (درجة حرارة السلسلة: درجة الحرارة) {
m = p.matcher(temp.trim());
إذا (!m.matches()) {
يكمل؛
}
for (int i = 1; i <= m.groupCount(); i++) {
إذا (m.group(i) == null || "".equals(m.group(i))) {
يكمل؛
}
colNames.add(m.group(i));
}
}
إرجاع أسماء الأعمدة؛
}
/**
* استخدم التعبيرات العادية للحصول على أسماء الأعمدة في INSERT SQL
*
* @param sql
* @يعود
*/
قائمة ثابتة خاصة <String> getColumnsFromInsert(String sql) {
List<String> colNames = new ArrayList<String>();
// أخرج جزء اسم العمود في SQL
Pattern p = Pattern.compile("(?i)insert//s+into.*//((.*)//)//s+values.*");
Matcher m = p.matcher(sql.trim());
String[] tempA = null;
إذا (م.ماتشز ()) {
tempA = m.group(1).split("،");
}
إذا (درجة الحرارة == فارغة) {
عودة فارغة؛
}
سلسلة 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 = Pattern.compile("(?:" + p1 + "||" + p2 + "||" + p3 + "||" + p4
+ "||" + ص5 + "||" + ص6 + "||" + ص7 + "||" + ص8 + ")");
لـ (درجة حرارة السلسلة: درجة الحرارة) {
m = p.matcher(temp.trim());
إذا (!m.matches()) {
يكمل؛
}
for (int i = 1; i <= m.groupCount(); i++) {
إذا (m.group(i) == null || "".equals(m.group(i))) {
يكمل؛
}
colNames.add(m.group(i));
}
}
إرجاع أسماء الأعمدة؛
}
/**
* استخدم التعبيرات العادية للحصول على أسماء الأعمدة في UPDATE SQL، بما في ذلك عبارات WHERE
*
* @param sql
* @يعود
*/
قائمة ثابتة خاصة <String> getColumnsFromUpdate(String sql) {
List<String> colNames = new ArrayList<String>();
// أخرج جزء اسم العمود في SQL
Pattern p = Pattern.compile("(?i)update(?:.*)set(.*)(?:from.*)*where(.*(and)*.*)");
Matcher m = p.matcher(sql.trim());
String[] tempA = null;
إذا (م.ماتشز ()) {
tempA = m.group(1).split("،");
إذا (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 = فينا;
}
}
إذا (درجة الحرارة == فارغة) {
عودة فارغة؛
}
String p1 = "(?i)(//w+)(?://s*//=//s*.*)";
String p2 = "(?i)(?://w+//.)(//w+)(?://s*//=//s*.*)";
p = Pattern.compile(p1 + "||" + p2);
لـ (درجة حرارة السلسلة: درجة الحرارة) {
m = p.matcher(temp.trim());
إذا (!m.matches()) {
يكمل؛
}
for (int i = 1; i <= m.groupCount(); i++) {
إذا (m.group(i) == null || "".equals(m.group(i))) {
يكمل؛
}
colNames.add(m.group(i));
}
}
إرجاع أسماء الأعمدة؛
}
/**
* إضافة كود الإحصائيات إلى SQL
*
* @param sql
* @يعود
*/
سلسلة ثابتة خاصة addCountSQL(String sql) {
StringBuffer sb = new StringBuffer();
sb.append("حدد العد(*) كعدد بيانات من (");
sb.append(sql);
sb.append(") كـ");
إرجاع sb.toString();
}
/**
* إضافة رمز الترحيل إلى SQL
*
* @param sql
* @param البداية
* @param حد
* @يعود
*/
سلسلة ثابتة خاصة addPagingSQL(String sql, int start, int Limit) {
StringBuffer sb = new StringBuffer();
إذا ("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(start);
sb.append("،");
sb.append(limit);
} else if ("Oracle.jdbc.driver.OracleDriver".equals(driver)) {//Oracle8/8i/9i/10g قاعدة البيانات (الوضع الرفيع)
List<String> list = getColumnsFromSelect(sql);
sb.append("حدد");
لـ (سلسلة: قائمة)
sb.append(str).append("، ");
sb.deleteCharAt(sb.lastIndexOf("،"));
sb.append(" from (").append(sql).append(") كـ");
sb.append("حيث يكون الصف بين ").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("الحد");
sb.append(limit);
sb.append("إزاحة");
sb.append(start);
}
إرجاع sb.toString();
}
/**
* إنشاء كائن RusultSet في كائن T
*
* @param <T>
* @param t
* @param روبية
* @param sql
* @return ر
* @throwsException
*/
مثيل <T> T ثابت خاص (Class<T> t، ResultSet rs، String sql) يطرح الاستثناء {
List<String> columns = getColumnsFromSelect(sql);
T obj = t.newInstance();
لـ (سلسلة العمود: الأعمدة) {
يحاول{
الحقل f = t.getDeclaredField(col);
f.setAccessible(true);
Object v = getValue(col, f.getType().getName(), rs);
f.set(obj, v);
}catch(NoSuchFieldException e){
الحقل[] الحقول = t.getDeclaredFields();
لـ (الحقل و: الحقول) {
عمود العمود = f.getAnnotation(Column.class);
إذا (عمود!= فارغ && column.name().equals(col)){
f.setAccessible(true);
Object v = getValue(col, f.getType().getName(), rs);
f.set(obj, v);
}
}
}
}
كائن الإرجاع؛
}
كائن ثابت خاص getValue (اسم عمود السلسلة، نوع السلسلة، ResultSet rs) يطرح SQLException {
كائن obj = فارغ؛
//System.out.println("name="+f.getName()+", type="+f.getType().getName() );
إذا ("java.lang.Integer".equals(type) || "int".equals(type)) {
obj = rs.getInt(columnName);
}else if("java.lang.Long".equals(type) || "long".equals(type)) {
obj = rs.getLong(columnName);
}else if("java.lang.Short".equals(type)||"short".equals(type)) {
obj = rs.getShort(columnName);
}else if("java.lang.Float".equals(type)||"float".equals(type)) {
obj = rs.getFloat(columnName);
}else if("java.lang.Double".equals(type)||"double".equals(type)) {
obj = rs.getDouble(columnName);
}else if("java.lang.Byte".equals(type)||"byte".equals(type)) {
obj = rs.getByte(columnName);
}else if("java.lang.Boolean".equals(type)||"boolean".equals(type)) {
obj = rs.getBoolean(columnName);
}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 pstate
* @أعمدةparam
* @ يلقي SQLException
*/
خاص ثابت <T> void setParameters(PreparedStatement pstate, Object... params) يطرح استثناء {
إذا (params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
قيمة الكائن = المعلمات[i]؛
إنت ي = أنا + 1؛
إذا (القيمة == فارغة)
pstate.setString(j, "");
إذا (مثيل قيمة السلسلة)
pstate.setString(j, (String) value);
وإلا إذا (مثيل القيمة المنطقية)
pstate.setBoolean(j, (Boolean) value);
آخر إذا (قيمة مثيل التاريخ)
pstate.setDate(j, (Date) value);
وإلا إذا (قيمة مثيل مزدوج)
pstate.setDouble(j, (Double) value);
وإلا إذا (مثيل قيمة Float)
pstate.setFloat(j, (Float) value);
وإلا إذا (مثيل قيمة عدد صحيح)
pstate.setInt(j, (Integer) value);
وإلا إذا (مثيل القيمة طويل)
pstate.setLong(j, (Long) value);
وإلا إذا (مثيل القيمة القصيرة)
pstate.setShort(j, (Short) value);
آخر إذا (قيمة مثيل الوقت)
pstate.setTime(j, (Time) value);
وإلا إذا (مثيل قيمة الطابع الزمني)
pstate.setTimestamp(j, (Timestamp) value);
آخر
pstate.setObject(j, value);
}
}
}
/**
* إضافة المعلمات في المعلمة إلى pstate
*
* @param pstate
* @أعمدةparam
* @param t
* @ يلقي SQLException
*/
مجموعة خاصة ثابتة <T> باطلة (PreparedStatement pstate، List<String> columns، T t) throws Exception {
إذا (الأعمدة!= فارغة && columns.size() > 0) {
لـ (int i = 0; i < columns.size(); i++) {
String attr = columns.get(i);
قيمة الكائن = فارغة؛
Class<?> c = t.getClass();
يحاول{
الحقل f = c.getDeclaredField(attr);
القيمة = f.get(t);
} التقاط (NoSuchFieldException e){
الحقل[] الحقول = c.getDeclaredFields();
لـ (الحقل و: الحقول) {
عمود العمود = f.getAnnotation(Column.class);
إذا (عمود!= فارغ && column.name().equals(attr))
القيمة = f.get(t);
}
}
إنت ي = أنا + 1؛
إذا (القيمة == فارغة)
pstate.setString(j, "");
إذا (مثيل قيمة السلسلة)
pstate.setString(j, (String) value);
وإلا إذا (مثيل قيمة منطقية)
pstate.setBoolean(j, (Boolean) value);
آخر إذا (قيمة مثيل التاريخ)
pstate.setDate(j, (Date) value);
وإلا إذا (قيمة مثيل مزدوج)
pstate.setDouble(j, (Double) value);
وإلا إذا (مثيل قيمة Float)
pstate.setFloat(j, (Float) value);
وإلا إذا (مثيل قيمة عدد صحيح)
pstate.setInt(j, (Integer) value);
وإلا إذا (مثيل القيمة طويل)
pstate.setLong(j, (Long) value);
وإلا إذا (مثيل القيمة القصيرة)
pstate.setShort(j, (Short) value);
آخر إذا (قيمة مثيل الوقت)
pstate.setTime(j, (Time) value);
وإلا إذا (مثيل قيمة الطابع الزمني)
pstate.setTimestamp(j, (Timestamp) value);
آخر
pstate.setObject(j, value);
}
}
}
/**
* إجراء عملية الإدراج
*
* @param sql عبارة SQL المترجمة مسبقًا
*param t المعلمات في SQL
*return عدد خطوط التنفيذ
* @throwsException
*/
ثابت عام <T> int Insert(String sql, T t) يطرح استثناء {
اتصال كون = فارغ؛
PreparedStatement pstate = null;
int updateCount = 0;
يحاول {
كون = getConnection();
List<String> columns = getColumnsFromInsert(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, columns, t);
updateCount = pstate.executeUpdate();
} أخيراً {
replease(conn, pstate, null);
}
إرجاع UpdateCount؛
}
/**
* إجراء عملية الإدراج
*
* @param sql عبارة SQL المترجمة مسبقًا
* @param المعلمة المعلمة
*return عدد خطوط التنفيذ
* @throwsException
*/
عام ثابت <T> int Insert(String sql, Object...param) يطرح استثناء {
اتصال كون = فارغ؛
PreparedStatement pstate = null;
int updateCount = 0;
يحاول {
كون = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
updateCount = pstate.executeUpdate();
} أخيراً {
replease(conn, pstate, null);
}
إرجاع UpdateCount؛
}
/**
* إجراء عملية التحديث
*
* @param sql عبارة SQL المترجمة مسبقًا
*param t المعلمات في SQL
*return عدد خطوط التنفيذ
* @throwsException
*/
التحديث العام الثابت <T> int (String sql، T t) يطرح الاستثناء {
اتصال كون = فارغ؛
PreparedStatement pstate = null;
int updateCount = 0;
يحاول {
كون = getConnection();
List<String> columns = getColumnsFromUpdate(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, columns, t);
updateCount = pstate.executeUpdate();
} أخيراً {
replease(conn, pstate, null);
}
إرجاع UpdateCount؛
}
/**
* إجراء عملية التحديث
*
* @param sql
* @param المعلمة المعلمة
*return عدد خطوط التنفيذ
* @throwsException
*/
التحديث العام الثابت <T> int (String sql، Object... param) يطرح استثناء {
اتصال كون = فارغ؛
PreparedStatement pstate = null;
int updateCount = 0;
يحاول {
كون = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
updateCount = pstate.executeUpdate();
} أخيراً {
replease(conn, pstate, null);
}
إرجاع UpdateCount؛
}
/**
* الاستعلام عن كائنات الجمع
*
* @param t نوع الكائن المغلف بنتيجة الاستعلام
* @param SQL المترجمة مسبقًا
* @param شروط الاستعلام المعلمة
* @قائمة الإرجاع<T>
* @throwsException
*/
قائمة <T> ثابتة عامة <T> queryPlural(Class<T> t, String sql, Object...param) throws Exception {
اتصال كون = فارغ؛
PreparedStatement stmt = null;
ResultSet rs = null;
List<T> list = new ArrayList<T>();
يحاول {
كون = getConnection();
stmt = conn.prepareStatement(sql);
setParameters(stmt, param);
rs = stmt.executeQuery();
بينما (rs.next()) {
list.add(instance(t, rs, sql));
}
} أخيراً {
إعادة الرجاء (conn، stmt، rs)؛
}
قائمة العودة؛
}
/**
* الاستعلام عن الترحيل لكائنات الجمع
*
* @param t نوع الكائن المغلف بنتيجة الاستعلام
* @param ابدأ صفحة البداية
* @param يحدد حجم الصفحة
* @param sql عبارة SQL المترجمة مسبقًا
* @param معلمات الاستعلام
* @throwsException
*/
قائمة <T> ثابتة عامة <T> queryPluralForPaging(Class<T> t, int start, int Limit, String sql, Object... param) throws Exception {
اتصال كون = فارغ؛
PreparedStatement stmt = null;
ResultSet rs = null;
List<T> list = new ArrayList<T>();
يحاول {
كون = getConnection();
// أضف رمز الترحيل
sql = addPagingSQL(sql, start, Limit);
stmt = conn.prepareStatement(sql);
setParameters(stmt, param);
rs = stmt.executeQuery();
بينما (rs.next()) {
list.add(instance(t, rs, sql));
}
} أخيراً {
إعادة الرجاء (conn، stmt، rs)؛
}
قائمة العودة؛
}
/**
* الاستعلام عن كائن واحد
*
* @param t كائن نتيجة الاستعلام
* @param SQL المترجمة مسبقًا
* @param معلمات الاستعلام
* @عودة ت
* @throwsException
*/
عام ثابت <T> T querySingular(Class<T> t, String sql, Object...param) throws Exception {
T obj = null;
ResultSet rs = null;
اتصال كون = فارغ؛
PreparedStatement pstate = null;
يحاول {
كون = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
rs = pstate.executeQuery();
إذا (rs.next()) {
obj = مثيل(t, rs, sql);
}
} أخيراً {
إعادة الرجاء (conn، pstate، rs)؛
}
كائن الإرجاع؛
}
/**
* حجم بيانات الاستعلام
*
* @param معلمات الاستعلام
* @param sql
* @يعود
* @ يلقي SQLException
* @throws NamingException
*/
int public static queryDataCount(String sql, Object...param)
يلقي استثناء {
عدد البيانات int = 0;
اتصال كون = فارغ؛
PreparedStatement pstate = null;
ResultSet rs = null;
يحاول {
كون = getConnection();
sql = addCountSQL(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
rs = pstate.executeQuery();
إذا (rs.next()) {
dataCount = rs.getInt("dataCount");
}
} أخيراً {
إعادة الرجاء (conn، pstate، rs)؛
}
إرجاع عدد البيانات؛
}
/**
* التعليقات على حقول السمات المستخدمة لتحديد حقول قاعدة البيانات المقابلة للسمة
* على سبيل المثال:
* @Column(name="user_name");
* اسم المستخدم سلسلة؛
* يشير إلى أن حقل قاعدة البيانات المطابق لسمة userName هو user_name
*
* إذا كانت السمة متوافقة تمامًا مع حقل قاعدة البيانات، فلا داعي لوضع علامة عليها
* @ المؤلف شيويليانغ
*/
@Target({ ElementType.FIELD })
@الاحتفاظ(سياسة الاحتفاظ.RUNTIME)
عام @ واجهة العمود {
اسم السلسلة () الافتراضي ""؛
}
}