|
|
|
@ -19,7 +19,7 @@ public class SqliteClient {
|
|
|
|
|
private Statement statement;
|
|
|
|
|
private ResultSet resultSet;
|
|
|
|
|
private String dbFilePath;
|
|
|
|
|
private List<Class> obList = new ArrayList<>();
|
|
|
|
|
private Map<String, Class> classMap = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 构造函数
|
|
|
|
@ -31,10 +31,13 @@ public class SqliteClient {
|
|
|
|
|
*/
|
|
|
|
|
public SqliteClient(File dbFile, List<Class> classList) throws ClassNotFoundException, SQLException {
|
|
|
|
|
this.dbFilePath = dbFile.getAbsolutePath();
|
|
|
|
|
this.obList.addAll(classList);
|
|
|
|
|
for (Class aClass : classList) {
|
|
|
|
|
classMap.put(aClass.getName(), aClass);
|
|
|
|
|
}
|
|
|
|
|
if (!dbFile.exists()) {
|
|
|
|
|
connection = getConnection();
|
|
|
|
|
for (Class object : obList) {
|
|
|
|
|
for (String key : classMap.keySet()) {
|
|
|
|
|
Class object = classMap.get(key);
|
|
|
|
|
StringBuffer sql = new StringBuffer();
|
|
|
|
|
String name = object.getSimpleName();
|
|
|
|
|
|
|
|
|
@ -54,139 +57,192 @@ public class SqliteClient {
|
|
|
|
|
|
|
|
|
|
sql.replace(sql.length() - 1, sql.length(), "");
|
|
|
|
|
sql.append(")");
|
|
|
|
|
System.out.println(sql.toString());
|
|
|
|
|
System.out.println("SQL ==> " + sql.toString());
|
|
|
|
|
execute(sql.toString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public <T> void insert(T t) throws SQLException, ClassNotFoundException {
|
|
|
|
|
public <T> void insert(Class<T> poClass, T po) throws SQLException, ClassNotFoundException {
|
|
|
|
|
try {
|
|
|
|
|
for (Class aClass : obList) {
|
|
|
|
|
if (t.getClass() == aClass) {
|
|
|
|
|
StringBuffer sql = new StringBuffer();
|
|
|
|
|
String tableName = aClass.getSimpleName();
|
|
|
|
|
sql.append("INSERT INTO ");
|
|
|
|
|
sql.append(tableName.toUpperCase());
|
|
|
|
|
sql.append("(");
|
|
|
|
|
|
|
|
|
|
Map<String, Object> keyValues = new HashMap<>();
|
|
|
|
|
for (Field f : aClass.getDeclaredFields()) {
|
|
|
|
|
if (f.isAnnotationPresent(Varchar.class)) {
|
|
|
|
|
try {
|
|
|
|
|
f.setAccessible(true);
|
|
|
|
|
keyValues.put(f.getName().toUpperCase(), f.get(t));
|
|
|
|
|
} catch (IllegalAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Class aClass = classMap.get(poClass.getName());
|
|
|
|
|
if (aClass == null) {
|
|
|
|
|
System.err.println(poClass.getName() + " not found.");
|
|
|
|
|
} else {
|
|
|
|
|
StringBuffer sql = new StringBuffer();
|
|
|
|
|
sql.append("INSERT INTO ");
|
|
|
|
|
sql.append(aClass.getSimpleName().toUpperCase());
|
|
|
|
|
sql.append("(");
|
|
|
|
|
|
|
|
|
|
//获取字段列表
|
|
|
|
|
List<Field> fs = new ArrayList<>();
|
|
|
|
|
for (Field f : poClass.getDeclaredFields()) {
|
|
|
|
|
if (f.isAnnotationPresent(Varchar.class)) {
|
|
|
|
|
f.setAccessible(true);
|
|
|
|
|
fs.add(f);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StringBuffer fieldsSql = new StringBuffer();
|
|
|
|
|
StringBuffer valueSql = new StringBuffer();
|
|
|
|
|
StringBuffer fieldsSql = new StringBuffer();
|
|
|
|
|
StringBuffer valueSql = new StringBuffer();
|
|
|
|
|
|
|
|
|
|
List<String> argsList = new ArrayList<>();
|
|
|
|
|
for (String key : keyValues.keySet()) {
|
|
|
|
|
fieldsSql.append(key.toUpperCase());
|
|
|
|
|
fieldsSql.append(",");
|
|
|
|
|
for (int i = 0; i < fs.size(); i++) {
|
|
|
|
|
Field f = fs.get(i);
|
|
|
|
|
fieldsSql.append(f.getName().toUpperCase());
|
|
|
|
|
|
|
|
|
|
Object value = keyValues.get(key);
|
|
|
|
|
if (value instanceof String) {
|
|
|
|
|
valueSql.append("'");
|
|
|
|
|
valueSql.append(value);
|
|
|
|
|
valueSql.append("'");
|
|
|
|
|
} else {
|
|
|
|
|
valueSql.append(value);
|
|
|
|
|
}
|
|
|
|
|
valueSql.append(",");
|
|
|
|
|
}
|
|
|
|
|
String[] args = new String[argsList.size()];
|
|
|
|
|
argsList.toArray(args);
|
|
|
|
|
|
|
|
|
|
if (",".equals(fieldsSql.substring(fieldsSql.length() - 1, fieldsSql.length()))) {
|
|
|
|
|
fieldsSql.replace(fieldsSql.length() - 1, fieldsSql.length(), "");
|
|
|
|
|
Object value = f.get(po);
|
|
|
|
|
if (value instanceof String) {
|
|
|
|
|
valueSql.append("'");
|
|
|
|
|
valueSql.append(value);
|
|
|
|
|
valueSql.append("'");
|
|
|
|
|
} else {
|
|
|
|
|
valueSql.append(value);
|
|
|
|
|
}
|
|
|
|
|
if (",".equals(valueSql.substring(valueSql.length() - 1, valueSql.length()))) {
|
|
|
|
|
valueSql.replace(valueSql.length() - 1, valueSql.length(), "");
|
|
|
|
|
if (i != fs.size() - 1) {
|
|
|
|
|
fieldsSql.append(",");
|
|
|
|
|
valueSql.append(",");
|
|
|
|
|
}
|
|
|
|
|
sql.append(fieldsSql);
|
|
|
|
|
sql.append(") VALUES (");
|
|
|
|
|
sql.append(valueSql);
|
|
|
|
|
sql.append(")");
|
|
|
|
|
System.out.println(sql.toString());
|
|
|
|
|
executeUpdate(sql.toString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sql.append(fieldsSql);
|
|
|
|
|
sql.append(") VALUES (");
|
|
|
|
|
sql.append(valueSql);
|
|
|
|
|
sql.append(")");
|
|
|
|
|
System.out.println("SQL ==> " + sql.toString());
|
|
|
|
|
executeUpdate(sql.toString());
|
|
|
|
|
}
|
|
|
|
|
} catch (IllegalAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
} finally {
|
|
|
|
|
destroyed();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public <T> int delete(T t, String... wheres) throws SQLException, ClassNotFoundException {
|
|
|
|
|
for (Class aClass : obList) {
|
|
|
|
|
if (t.getClass() == aClass) {
|
|
|
|
|
public <T> int delete(Class<T> poClass, String... wheres) throws SQLException, ClassNotFoundException {
|
|
|
|
|
try {
|
|
|
|
|
Class aClass = classMap.get(poClass.getName());
|
|
|
|
|
if (aClass == null) {
|
|
|
|
|
System.err.println(poClass.getName() + " not found.");
|
|
|
|
|
} else {
|
|
|
|
|
StringBuffer sql = new StringBuffer();
|
|
|
|
|
sql.append("delete from ");
|
|
|
|
|
sql.append(aClass.getSimpleName());
|
|
|
|
|
sql.append("DELETE FROM ");
|
|
|
|
|
sql.append(aClass.getSimpleName().toUpperCase());
|
|
|
|
|
|
|
|
|
|
if (wheres.length > 0) {
|
|
|
|
|
sql.append(" where");
|
|
|
|
|
sql.append(" WHERE");
|
|
|
|
|
for (int i = 0; i < wheres.length; i++) {
|
|
|
|
|
String where = wheres[i];
|
|
|
|
|
sql.append(where);
|
|
|
|
|
sql.append(i != wheres.length ? " and " : "");
|
|
|
|
|
sql.append(i != wheres.length ? " AND " : "");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return executeUpdate(sql.toString());
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
destroyed();
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public <T> int update(T t, String... wheres) throws SQLException, ClassNotFoundException {
|
|
|
|
|
ArrayList<T> list = new ArrayList<>();
|
|
|
|
|
for (Class aClass : obList) {
|
|
|
|
|
if (t.getClass() == aClass) {
|
|
|
|
|
public <T> int update(Class<T> poClass, T po, String... wheres) throws SQLException, ClassNotFoundException {
|
|
|
|
|
try {
|
|
|
|
|
Class aClass = classMap.get(poClass.getName());
|
|
|
|
|
if (aClass == null) {
|
|
|
|
|
System.err.println(poClass.getName() + " not found.");
|
|
|
|
|
} else {
|
|
|
|
|
StringBuffer sql = new StringBuffer();
|
|
|
|
|
sql.append("update set ");
|
|
|
|
|
sql.append(aClass.getSimpleName());
|
|
|
|
|
sql.append("UPDATE ");
|
|
|
|
|
sql.append(aClass.getSimpleName().toUpperCase());
|
|
|
|
|
sql.append(" SET ");
|
|
|
|
|
|
|
|
|
|
//获取字段列表
|
|
|
|
|
List<Field> fs = new ArrayList<>();
|
|
|
|
|
for (Field f : poClass.getDeclaredFields()) {
|
|
|
|
|
if (f.isAnnotationPresent(Varchar.class)) {
|
|
|
|
|
f.setAccessible(true);
|
|
|
|
|
fs.add(f);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < fs.size(); i++) {
|
|
|
|
|
Field f = fs.get(i);
|
|
|
|
|
sql.append(f.getName());
|
|
|
|
|
sql.append(" = ");
|
|
|
|
|
|
|
|
|
|
Object value = f.get(po);
|
|
|
|
|
if (value instanceof String) {
|
|
|
|
|
sql.append("'");
|
|
|
|
|
sql.append(value);
|
|
|
|
|
sql.append("'");
|
|
|
|
|
} else {
|
|
|
|
|
sql.append(value);
|
|
|
|
|
}
|
|
|
|
|
if (i != fs.size() - 1) {
|
|
|
|
|
sql.append(",");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (wheres.length > 0) {
|
|
|
|
|
sql.append(" where");
|
|
|
|
|
sql.append(" WHERE");
|
|
|
|
|
for (int i = 0; i < wheres.length; i++) {
|
|
|
|
|
String where = wheres[i];
|
|
|
|
|
sql.append(where);
|
|
|
|
|
sql.append(i != wheres.length ? " and " : "");
|
|
|
|
|
sql.append(i != wheres.length ? " AND " : "");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
System.out.println(sql.toString());
|
|
|
|
|
System.out.println("SQL ==> " + sql.toString());
|
|
|
|
|
return executeUpdate(sql.toString());
|
|
|
|
|
}
|
|
|
|
|
} catch (IllegalAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
} finally {
|
|
|
|
|
destroyed();
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public <T> List<T> select(T t, String... wheres) throws SQLException, ClassNotFoundException {
|
|
|
|
|
public <T> List<T> select(Class<T> poClass, String... wheres) throws SQLException, ClassNotFoundException {
|
|
|
|
|
ArrayList<T> list = new ArrayList<>();
|
|
|
|
|
for (Class aClass : obList) {
|
|
|
|
|
if (t.getClass() == aClass) {
|
|
|
|
|
try {
|
|
|
|
|
Class aClass = classMap.get(poClass.getName());
|
|
|
|
|
if (aClass == null) {
|
|
|
|
|
System.err.println(poClass.getName() + " not found.");
|
|
|
|
|
} else {
|
|
|
|
|
StringBuffer sql = new StringBuffer();
|
|
|
|
|
sql.append("select * from ");
|
|
|
|
|
sql.append(aClass.getSimpleName());
|
|
|
|
|
sql.append("SELECT ");
|
|
|
|
|
|
|
|
|
|
//获取字段列表
|
|
|
|
|
List<Field> fs = new ArrayList<>();
|
|
|
|
|
for (Field f : poClass.getDeclaredFields()) {
|
|
|
|
|
if (f.isAnnotationPresent(Varchar.class)) {
|
|
|
|
|
fs.add(f);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < fs.size(); i++) {
|
|
|
|
|
Field f = fs.get(i);
|
|
|
|
|
sql.append(f.getName().toUpperCase());
|
|
|
|
|
if (i != fs.size() - 1) {
|
|
|
|
|
sql.append(",");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sql.append(" FROM ");
|
|
|
|
|
sql.append(aClass.getSimpleName().toUpperCase());
|
|
|
|
|
|
|
|
|
|
if (wheres.length > 0) {
|
|
|
|
|
sql.append(" where");
|
|
|
|
|
sql.append(" WHERE");
|
|
|
|
|
for (int i = 0; i < wheres.length; i++) {
|
|
|
|
|
String where = wheres[i];
|
|
|
|
|
sql.append(where);
|
|
|
|
|
sql.append(i != wheres.length ? " and " : "");
|
|
|
|
|
sql.append(i != wheres.length ? " AND " : "");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
System.out.println(sql.toString());
|
|
|
|
|
list.addAll(executeQuery(sql.toString(),t));
|
|
|
|
|
System.out.println("SQL ==> " + sql.toString());
|
|
|
|
|
list.addAll(executeQuery(sql.toString(), poClass));
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
destroyed();
|
|
|
|
|
}
|
|
|
|
|
return list;
|
|
|
|
|
}
|
|
|
|
@ -194,31 +250,31 @@ public class SqliteClient {
|
|
|
|
|
/**
|
|
|
|
|
* 执行select查询,返回结果列表
|
|
|
|
|
*
|
|
|
|
|
* @param sql sql select 语句
|
|
|
|
|
* @param t 结果集的行数据处理类对象
|
|
|
|
|
* @param sql sql select 语句
|
|
|
|
|
* @param poClass 结果集的行数据处理类对象
|
|
|
|
|
* @return
|
|
|
|
|
* @throws SQLException
|
|
|
|
|
* @throws ClassNotFoundException
|
|
|
|
|
*/
|
|
|
|
|
public <T> List<T> executeQuery(String sql, T t) throws SQLException, ClassNotFoundException {
|
|
|
|
|
public <T> List<T> executeQuery(String sql, Class<T> poClass) throws SQLException, ClassNotFoundException {
|
|
|
|
|
List<T> rsList = new ArrayList<T>();
|
|
|
|
|
try {
|
|
|
|
|
resultSet = getStatement().executeQuery(sql);
|
|
|
|
|
//2、获取字段列表
|
|
|
|
|
//获取字段列表
|
|
|
|
|
List<Field> fs = new ArrayList<>();
|
|
|
|
|
for (Field f : t.getClass().getDeclaredFields()) {
|
|
|
|
|
for (Field f : poClass.getDeclaredFields()) {
|
|
|
|
|
if (f.isAnnotationPresent(Varchar.class)) {
|
|
|
|
|
f.setAccessible(true);
|
|
|
|
|
fs.add(f);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
while (resultSet.next()) {
|
|
|
|
|
try {
|
|
|
|
|
T o = (T) t.getClass().newInstance();
|
|
|
|
|
T o = poClass.newInstance();
|
|
|
|
|
for (int i = 0; i < fs.size(); i++) {
|
|
|
|
|
Field field = fs.get(i);
|
|
|
|
|
field.setAccessible(true);
|
|
|
|
|
String string = resultSet.getString(field.getName());
|
|
|
|
|
field.set(o, string);
|
|
|
|
|
Field f = fs.get(i);
|
|
|
|
|
String string = resultSet.getString(f.getName());
|
|
|
|
|
f.set(o, string);
|
|
|
|
|
}
|
|
|
|
|
rsList.add(o);
|
|
|
|
|
} catch (InstantiationException e) {
|
|
|
|
@ -249,7 +305,7 @@ public class SqliteClient {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 执行多个sql更新语句
|
|
|
|
|
* 执行sql更新语句
|
|
|
|
|
*
|
|
|
|
|
* @param sqls
|
|
|
|
|
* @throws SQLException
|
|
|
|
@ -282,6 +338,9 @@ public class SqliteClient {
|
|
|
|
|
return connection;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取数据库Statement对象
|
|
|
|
|
*/
|
|
|
|
|
private Statement getStatement() throws SQLException, ClassNotFoundException {
|
|
|
|
|
if (null == statement) {
|
|
|
|
|
statement = getConnection().createStatement();
|
|
|
|
|