package com.mz.jdbc.util;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import com.mz.jdbc.util.ValueBuilder.TagHolder;
/**
* HG工具模型
*
* @author HG
*
*/
public class HGBuilder implements IHGBuilder {
/**
* 获取条件配置
*
* @param obj
* @return
*/
private WhereBuilder getConfig(Object obj) {
Field[] fields = obj.getClass().getDeclaredFields();
WhereBuilder builder = new WhereBuilder();
String fieldTypeName = "";
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
if (Modifier.toString(fields[i].getModifiers()).contains("static")
|| Modifier.toString(fields[i].getModifiers()).contains("final")) {
continue;
}
fieldTypeName = fields[i].getType().getSimpleName().toLowerCase(Locale.getDefault());
switch (fieldTypeName) {
case "int":
case "integer":
case "string":
case "short":
case "long":
case "boolean":
case "float":
case "double":
if (i == 0) {
try {
builder.where(fields[i].getName(), "=", fields[i].get(obj) + "");
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
try {
builder.and(fields[i].getName(), "=", fields[i].get(obj) + "");
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
break;
default:
break;
}
}
return builder;
}
/**
* 获取数据库连接
*
* @return
*/
public Connection getConnection() {
Connection con = null;
try {
Class.forName(HGConfig.DRIVER_CLASS);
con = DriverManager.getConnection(HGConfig.CONNECTION);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
/**
* 查询所有数据
*
* @param clazz
* @return
*/
@Override
public <T> List<T> findAll(Class<T> clazz) {
return findAll(clazz, null);
}
/**
* 按条件 查询所有数据
*
* @param clazz
* @param builder
* @return
*/
@Override
public <T> List<T> findAll(Class<T> clazz, WhereBuilder builder) {
Connection con = getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
List<T> result = new ArrayList<T>();
T obj = null;
String className = clazz.getSimpleName();
String sql = "SELECT * FROM " + className;
if (builder != null) {
sql = sql + builder.getSql();
}
try {
ps = con.prepareStatement(sql);
if (builder != null) {
int i = 0;
Object value = "";
for (com.mz.jdbc.util.WhereBuilder.TagHolder tag : builder.getTag()) {
if (!tag.key.equals("ORDER BY") && !tag.key.equals("LIMIT")) {
value = builder.getTag().get(i).value;
if ("true".equals(value)) {
ps.setObject(i + 1, "1");
} else if ("false".equals(value)) {
ps.setObject(i + 1, "0");
} else {
ps.setObject(i + 1, value);
}
} else {
break;
}
i++;
}
}
rs = ps.executeQuery();
Field[] fields = clazz.getDeclaredFields();
String fieldTypeName = "";
while (rs.next()) {
obj = (T) clazz.newInstance();
for (Field field : fields) {
field.setAccessible(true);
if (Modifier.toString(field.getModifiers()).contains("static")
|| Modifier.toString(field.getModifiers()).contains("final")) {
continue;
}
fieldTypeName = field.getType().getSimpleName().toLowerCase(Locale.getDefault());
switch (fieldTypeName) {
case "int":
case "integer":
field.set(obj, rs.getInt(field.getName()));
break;
case "string":
field.set(obj, rs.getString(field.getName()));
break;
case "short":
field.set(obj, rs.getShort(field.getName()));
break;
case "long":
field.set(obj, rs.getLong(field.getName()));
break;
case "boolean":
field.set(obj, rs.getBoolean(field.getName()));
break;
case "float":
field.set(obj, rs.getFloat(field.getName()));
break;
case "double":
field.set(obj, rs.getDouble(field.getName()));
break;
default:
break;
}
}
result.add(obj);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
try {
con.close();
ps.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 查询第一条数据
*
* @param clazz
* @return
*/
@Override
public <T> T findFirst(Class<T> clazz) {
return findFirst(clazz, null);
}
/**
* 按条件 查询第一条数据
*
* @param clazz
* @param builder
* @return
*/
@Override
public <T> T findFirst(Class<T> clazz, WhereBuilder builder) {
Connection con = getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
T obj = null;
String className = clazz.getSimpleName();
String sql = "SELECT * FROM " + className;
if (builder != null) {
builder.limit(1, 1);
sql = sql + builder.getSql();
}
try {
ps = con.prepareStatement(sql);
if (builder != null) {
int i = 0;
Object value = "";
for (com.mz.jdbc.util.WhereBuilder.TagHolder tag : builder.getTag()) {
if (!tag.key.equals("ORDER BY") && !tag.key.equals("LIMIT")) {
value = builder.getTag().get(i).value;
if ("true".equals(value)) {
ps.setObject(i + 1, "1");
} else if ("false".equals(value)) {
ps.setObject(i + 1, "0");
} else {
ps.setObject(i + 1, value);
}
} else {
break;
}
i++;
}
}
rs = ps.executeQuery();
Field[] fields = clazz.getDeclaredFields();
String fieldTypeName = "";
if (rs.next()) {
obj = (T) clazz.newInstance();
for (Field field : fields) {
field.setAccessible(true);
if (Modifier.toString(field.getModifiers()).contains("static")
|| Modifier.toString(field.getModifiers()).contains("final")) {
continue;
}
fieldTypeName = field.getType().getSimpleName().toLowerCase(Locale.getDefault());
switch (fieldTypeName) {
case "int":
case "integer":
field.set(obj, rs.getInt(field.getName()));
break;
case "string":
field.set(obj, rs.getString(field.getName()));
break;
case "short":
field.set(obj, rs.getShort(field.getName()));
break;
case "long":
field.set(obj, rs.getLong(field.getName()));
break;
case "boolean":
field.set(obj, rs.getBoolean(field.getName()));
break;
case "float":
field.set(obj, rs.getFloat(field.getName()));
break;
case "double":
field.set(obj, rs.getDouble(field.getName()));
break;
default:
break;
}
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
try {
con.close();
ps.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return obj;
}
/**
* 删除所有数据
*
* @param clazz
* @return
*/
@Override
public <T> boolean delete(Class<T> claz