База данных подключений Java: добавление, удаление, изменение, проверка класса инструмента
Инструменты работы с базами данных, поскольку условия подкачки в базе данных каждого производителя различны, в настоящее время поддерживают запросы подкачки Mysql, Oracle и Postgresql.
Он был протестирован в среде Postgresql, но не в других базах данных.
Операторы SQL должны быть в предварительно скомпилированной форме.
Скопируйте код кода следующим образом:
упакованныйb;
импортировать 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.
*
* @author Сюэлян
*
*/
общественный класс DBUtil {
частный статический строковый драйвер;
частный статический источник данных ds = null;
частная статическая строка URL = "jdbc:postgresql://192.168.56.101/db";
частный статический пользователь String = «тест»;
частный статический строковый пароль = «12345678»;
статический {
пытаться {
Class.forName("org.postgresql.Driver");
//ds = (DataSource)SpringContextUtil.getBean("dataSource");
} catch (Исключение е) {
е.printStackTrace();
}
}
/**
* Установить соединение
*
* @return с подключением
* @throwsException
*/
частное статическое соединение getConnection() выдает исключение {
Connection conn = DriverManager.getConnection(url, пользователь, пароль);
//Соединение conn = ds.getConnection();
Драйвер d = DriverManager.getDriver(conn.getMetaData().getURL());
драйвер = d.getClass().getName();
возврат соединения;
}
/**
* Закройте соединение
*
* @param конн
* @param stmt
* @param preStmt
* @param rs
* @throws SQLException
*/
Private static void replease(Connection conn, Statement stmt, ResultSet rs) выдает SQLException {
если (rs != ноль) {
рс.закрыть();
РС = ноль;
}
если (stmt != ноль) {
стмт.закрыть();
стмт = ноль;
}
если (conn != ноль) {
конн.закрыть();
конн = ноль;
}
}
/**
* Используйте регулярные выражения для получения имен столбцов в SELECT SQL.
*
* @param sql
* @возвращаться
*/
частный статический список <String> getColumnsFromSelect (String sql) {
List<String> colNames = новый ArrayList<String>();
// Удаляем часть имени столбца из sql
Шаблон p = Pattern.compile("(?i)select//s(.*?)//sfrom.*");
Сопоставитель m = p.matcher(sql.trim());
Строка [] tempA = ноль;
если (m.matches()) {
tempA = m.group(1).split(",");
}
если (tempA == ноль) {
вернуть ноль;
}
Строка 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
+ "||" + p5 + "||" + p6 + "||" + p7 + "||" + p8 + ")");
for (String temp : tempA) {
м = p.matcher(temp.trim());
если (!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
* @возвращаться
*/
частный статический список <String> getColumnsFromInsert (String sql) {
List<String> colNames = новый ArrayList<String>();
// Удаляем часть имени столбца из sql
Шаблон p = Pattern.compile("(?i)insert//s+into.*//((.*)//)//s+values.*");
Сопоставитель m = p.matcher(sql.trim());
Строка [] tempA = ноль;
если (m.matches()) {
tempA = m.group(1).split(",");
}
если (tempA == ноль) {
вернуть ноль;
}
Строка 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
+ "||" + p5 + "||" + p6 + "||" + p7 + "||" + p8 + ")");
for (String temp : tempA) {
м = p.matcher(temp.trim());
если (!m.matches()) {
продолжать;
}
for (int i = 1; i <= m.groupCount(); i++) {
if (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 = новый ArrayList<String>();
// Удаляем часть имени столбца из sql
Шаблон p = Pattern.compile("(?i)update(?:.*)set(.*)(?:from.*)*where(.*(and)*.*)");
Сопоставитель m = p.matcher(sql.trim());
Строка [] tempA = ноль;
если (m.matches()) {
tempA = m.group(1).split(",");
если (m.groupCount() > 1) {
String[] tmp = m.group(2).split("и");
String[] fina = новая строка[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);
for (String temp : tempA) {
м = p.matcher(temp.trim());
если (!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
* @возвращаться
*/
частная статическая строка addCountSQL (String sql) {
StringBuffer sb = новый StringBuffer();
sb.append(" select count(*) as dataCount from (");
sb.append(sql);
sb.append() как");
вернуть sb.toString();
}
/**
* Добавить код подкачки в sql
*
* @param sql
* @param начало
* ограничение @param
* @возвращаться
*/
частная статическая строка addPagingSQL (String sql, int start, int limit) {
StringBuffer sb = новый 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> list = getColumnsFromSelect(sql);
sb.append("выбрать");
for (Строка ул: список)
sb.append(str).append(", ");
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append(" from (").append(sql).append() as a");
sb.append(" где rownum между ").append(start == 0 ? 1: start).append(" и ").append(limit);
} else if ("com.ibm.db2.jdbc.app.DB2Driver".equals(драйвер)) {//DB2
} else if ("com.sybase.jdbc.SybDriver".equals(driver)) {//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 rs
* @param sql
* @return т
* @throwsException
*/
частный статический экземпляр <T> T (Class<T> t, ResultSet rs, String sql) выдает исключение {
Столбцы List<String> = getColumnsFromSelect(sql);
Т obj = t.newInstance();
for (String col: columns) {
пытаться{
Поле f = t.getDeclaredField(col);
f.setAccessible(истина);
Объект v = getValue(col, f.getType().getName(), rs);
f.set(объект, v);
}catch(NoSuchFieldException e){
Field[] поля = t.getDeclaredFields();
for (Поле f: поля) {
Столбец столбец = f.getAnnotation(Column.class);
if(столбец!= null && columns.name().equals(col)){
f.setAccessible(истина);
Объект v = getValue(col, f.getType().getName(), rs);
f.set(объект, v);
}
}
}
}
вернуть объект;
}
частный статический объект getValue (String columnsName, тип String, ResultSet rs) выдает SQLException {
Объект объект = ноль;
//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) выдает исключение {
if (params != null && params.length > 0) {
for (int i = 0; i <params.length; i++) {
Значение объекта = params[i];
интервал j = я + 1;
если (значение == ноль)
pstate.setString(j, "");
if (значение экземпляра строки)
pstate.setString(j, (String) значение);
иначе, если (значение экземпляра логического значения)
pstate.setBoolean(j, (Boolean) значение);
иначе, если (значение экземпляра даты)
pstate.setDate(j, (Дата) значение);
иначе, если (значение экземпляра Double)
pstate.setDouble(j, (Double) значение);
иначе, если (значение экземпляра с плавающей запятой)
pstate.setFloat(j, (Float) значение);
иначе, если (значение экземпляра целого числа)
pstate.setInt(j, (Целое) значение);
иначе, если (значение экземпляра Long)
pstate.setLong(j, (Long) значение);
else if (значение экземпляра Short)
pstate.setShort(j, (Short) значение);
иначе, если (значение экземпляра времени)
pstate.setTime(j, (Время) значение);
else if (значение экземпляра Timestamp)
pstate.setTimestamp(j, (Timestamp) значение);
еще
pstate.setObject(j, значение);
}
}
}
/**
* Добавьте параметры из param в pstate.
*
* @param pstate
* Столбцы @param
* @парам т
* @throws SQLException
*/
Private static <T> void setParameters(PreparedStatement pstate, List<String> columns, T t) выдает исключение {
if (столбцы != null && columns.size() > 0) {
for (int i = 0; i < columns.size(); i++) {
Строка attr = columns.get(i);
Значение объекта = ноль;
Класс<?> c = t.getClass();
пытаться{
Поле f = c.getDeclaredField(attr);
значение = f.get(т);
} catch (NoSuchFieldException e){
Field[] поля = c.getDeclaredFields();
for (Поле f: поля) {
Столбец столбец = f.getAnnotation(Column.class);
if(столбец!= null && columns.name().equals(attr))
значение = f.get(т);
}
}
интервал j = я + 1;
если (значение == ноль)
pstate.setString(j, "");
if (значение экземпляра строки)
pstate.setString(j, (String) значение);
иначе, если (значение экземпляра логического значения)
pstate.setBoolean(j, (Boolean) значение);
иначе, если (значение экземпляра даты)
pstate.setDate(j, (Дата) значение);
иначе, если (значение экземпляра Double)
pstate.setDouble(j, (Double) значение);
иначе, если (значение экземпляра с плавающей запятой)
pstate.setFloat(j, (Float) значение);
иначе, если (значение экземпляра целого числа)
pstate.setInt(j, (Целое) значение);
иначе, если (значение экземпляра Long)
pstate.setLong(j, (Long) значение);
else if (значение экземпляра Short)
pstate.setShort(j, (Short) значение);
иначе, если (значение экземпляра времени)
pstate.setTime(j, (Время) значение);
else if (значение экземпляра Timestamp)
pstate.setTimestamp(j, (Timestamp) значение);
еще
pstate.setObject(j, значение);
}
}
}
/**
* Выполнить операцию вставки
*
* @param sql предварительно скомпилированный оператор sql
* @param t параметры в sql
* @return Количество строк выполнения
* @throwsException
*/
public static <T> int Insert(String sql, T t) выдает исключение {
Соединение конн = ноль;
ReadedStatement pstate = null;
интервал обновленияCount = 0;
пытаться {
конн = getConnection();
Столбцы List<String> = getColumnsFromInsert(sql);
pstate = conn.prepareStatement(sql);
setParameters (pstate, столбцы, т);
updateCount = pstate.executeUpdate();
} окончательно {
повторите (conn, pstate, null);
}
вернуть обновлениеCount;
}
/**
* Выполнить операцию вставки
*
* @param sql предварительно скомпилированный оператор sql
* Параметр параметра @param
* @return Количество строк выполнения
* @throwsException
*/
public static <T> int Insert(String sql, Object... param) выдает исключение {
Соединение конн = ноль;
ReadedStatement pstate = null;
интервал обновленияCount = 0;
пытаться {
конн = getConnection();
pstate = conn.prepareStatement(sql);
setParameters (pstate, параметр);
updateCount = pstate.executeUpdate();
} окончательно {
повторите (conn, pstate, null);
}
вернуть updateCount;
}
/**
* Выполнить операцию обновления
*
* @param sql предварительно скомпилированный оператор sql
* @param t параметры в sql
* @return Количество строк выполнения
* @throwsException
*/
public static <T> int update(String sql, T t) выдает исключение {
Соединение конн = ноль;
ReadedStatement pstate = null;
интервал обновленияCount = 0;
пытаться {
конн = getConnection();
Столбцы List<String> = getColumnsFromUpdate(sql);
pstate = conn.prepareStatement(sql);
setParameters (pstate, столбцы, т);
updateCount = pstate.executeUpdate();
} окончательно {
повторите (conn, pstate, null);
}
вернуть обновлениеCount;
}
/**
* Выполнить операцию обновления
*
* @param sql
* Параметр параметра @param
* @return Количество строк выполнения
* @throwsException
*/
public static <T> int update (String sql, Object... param) выдает исключение {
Соединение конн = ноль;
ReadedStatement pstate = null;
интервал обновленияCount = 0;
пытаться {
конн = getConnection();
pstate = conn.prepareStatement(sql);
setParameters (pstate, параметр);
updateCount = pstate.executeUpdate();
} окончательно {
повторите (conn, pstate, null);
}
вернуть обновлениеCount;
}
/**
* Запрос объектов во множественном числе
*
* @param t Тип объекта, инкапсулированный результатом запроса.
* @param sql предварительно скомпилированный sql
* Условия запроса параметра @param
* @return Список<T>
* @throwsException
*/
public static <T> List<T> queryPlural(Class<T> t, String sql, Object... param) выдает исключение {
Соединение конн = ноль;
ReadedStatement stmt = null;
ResultSet rs = null;
List<T> list = новый ArrayList<T>();
пытаться {
конн = getConnection();
stmt = conn.prepareStatement(sql);
setParameters (STMT, параметр);
rs = stmt.executeQuery();
в то время как (rs.next()) {
list.add(экземпляр(t, rs, sql));
}
} окончательно {
повторите (conn, stmt, rs);
}
список возврата;
}
/**
* Пейджинговый запрос для множественных объектов.
*
* @param t Тип объекта, инкапсулированный результатом запроса.
* @param start стартовая страница
* @param ограничить размер страницы
* @param sql предварительно скомпилированный оператор sql
* Параметры запроса @param param
* @throwsException
*/
public static <T> List<T> queryPluralForPagged(Class<T> t, int start, int limit, String sql, Object... param) выдает исключение {
Соединение конн = ноль;
ReadedStatement stmt = null;
ResultSet rs = null;
List<T> list = новый ArrayList<T>();
пытаться {
конн = getConnection();
//Добавляем код страницы
sql = addPagingSQL (sql, start, limit);
stmt = conn.prepareStatement(sql);
setParameters (STMT, параметр);
rs = stmt.executeQuery();
в то время как (rs.next()) {
list.add(экземпляр(t, rs, sql));
}
} окончательно {
повторите (conn, stmt, rs);
}
список возврата;
}
/**
* Запрос одного объекта
*
* @param t объект результата запроса
* @param sql предварительно скомпилированный sql
* Параметры запроса @param param
* @return Т
* @throwsException
*/
public static <T> T querySingular(Class<T> t, String sql, Object... param) выдает исключение {
Т объект = ноль;
ResultSet rs = null;
Соединение конн = ноль;
ReadedStatement pstate = null;
пытаться {
конн = getConnection();
pstate = conn.prepareStatement(sql);
setParameters (pstate, параметр);
rs = pstate.executeQuery();
если (rs.next()) {
объект = экземпляр (т, rs, sql);
}
} окончательно {
повторите (conn, pstate, rs);
}
вернуть объект;
}
/**
*Объем данных запроса
*
* Параметры запроса @param param
* @param sql
* @возвращаться
* @throws SQLException
* @throws NamingException
*/
public static int queryDataCount (String sql, Object... param)
выдает исключение {
интервал данныхCount = 0;
Соединение конн = ноль;
ReadedStatement pstate = null;
ResultSet rs = null;
пытаться {
конн = getConnection();
sql = addCountSQL(sql);
pstate = conn.prepareStatement(sql);
setParameters (pstate, параметр);
rs = pstate.executeQuery();
если (rs.next()) {
dataCount = rs.getInt("dataCount");
}
} окончательно {
повторите (conn, pstate, rs);
}
вернуть данныеCount;
}
/**
* Комментарии к полям атрибута, используемые для обозначения полей базы данных, соответствующих атрибуту.
* Например:
* @Column(name="имя_пользователя");
* Строковое имя пользователя;
* Указывает, что поле базы данных, соответствующее атрибуту userName, имеет значение user_name.
*
* Если атрибут полностью соответствует полю базы данных, отмечать его не нужно.
* @author Сюэлян
*/
@Target({ТипЭлемента.ПОЛЕ})
@Retention(RetentionPolicy.RUNTIME)
публичный столбец @interface{
Имя строки() по умолчанию "";
}
}