表名为 t_XXXX. 若表明没有以 t_ 开头的,则报错.这样在后面大量的数据表中的就不需要再写那么多麻烦的代码量了.
不过单一的数据查询,则可以用到代码,多表查询的情况下则需要另行再写.
package com.demo.dao;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
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.Properties;
public abstract class ABaseDao {
protected java.sql.Connection conn;
protected PreparedStatement pstmt;
private String uri;
private String drivername;
private String username;
private String pwd;
public ABaseDao() {
// 1.读取配置文件
java.util.Properties config = new Properties();
try {
config.load(this.getClass().getClassLoader()
.getResourceAsStream("dbconfig.prop"));
uri = config.getProperty("DBURI");
drivername = config.getProperty("DRIVERNAME");
username = config.getProperty("USERNAME");
pwd = config.getProperty("DBPWD");
// System.out.println(uri);
// 2.加载驱动
Class.forName(drivername);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void checkConn() {
try {
if (conn == null || conn.isClosed()) {
conn = DriverManager.getConnection(uri, username, pwd);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void closeDB() {
try {
if (conn != null && !conn.isClosed()) {
if (pstmt != null && !pstmt.isClosed()) {
pstmt.close();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 查询的方法 变参
protected ResultSet query(String sql, Object... objects) {
checkConn();
try {
pstmt = conn.prepareStatement(sql);
if (objects != null) {
// 设置参数
for (int i = 0; i < objects.length; i++) {
pstmt.setObject(i + 1, objects[i]);
}
}
return pstmt.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// 通过反射去自动封装POJO的方法
private Object autoSetter(ResultSet rs) {
Object result = null;
Object val = null;
// 取得自己 XXXDao
Class daoClz = this.getClass();
// 取得自己对应的pojo
try {
Class pojoClz = Class.forName(daoClz.getName()
.replace("dao", "pojo").replace("Dao", ""));
// 生成实例
result = pojoClz.newInstance();// pojo必须要有默认参构造器
// 取得pojo中的全部属性
Field[] fields = pojoClz.getDeclaredFields();
Method setter = null;
for (Field field : fields) {
// 通过Field取得对应的setter方法名--->取得方法
setter = pojoClz
.getMethod("set"
+ field.getName().substring(0, 1).toUpperCase()
+ field.getName().substring(1), field.getType());
// 动态调用设置
if ("oracle.jdbc.driver.OracleDriver".equals(drivername)) {
if (field.getType().equals(java.lang.Integer.class)) {
val = rs.getInt(field.getName());
} else if (field.getType().equals(Double.class)) {
val = rs.getDouble(field.getName());
} else if (field.getType().equals(java.util.Date.class)) {
val = rs.getDate(field.getName());
} else {
val = rs.getObject(field.getName());
}
} else {
val = rs.getObject(field.getName());
}
if (val != null) {
// System.out.println(field.getName()+":"+val.getClass());
setter.invoke(result, val);
}
}
// System.out.println(pojoClz);
return result;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// 更新的方法 merge合并
protected int merge(String sql, Object... objects) {
checkConn();
try {
pstmt = conn.prepareStatement(sql);
if (objects != null) {
for (int i = 0; i < objects.length; i++) {
pstmt.setObject(i + 1, objects[i]);
}
}
return pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
protected Object findOne(String sql, Object... objects) {
ResultSet rs = query(sql, objects);
Object rslt = null;
try {
if (rs.next()) {
rslt = autoSetter(rs);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
closeDB();
return rslt;
}
// 通用的返回多值的方法
public List findSome(String sql, Object... objects) {
ResultSet rs = query(sql, objects);
Object tmp = null;
List rslt = new ArrayList();
try {
while (rs.next()) {
tmp = autoSetter(rs);
rslt.add(tmp);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
closeDB();
return rslt;
}
public int save(Object pojo) {
try {
// 取得DAO自己
Class daoClz = this.getClass();
// 取得自己对应的pojo
Class pojoClz = Class.forName(daoClz.getName()
.replace("dao", "pojo").replace("Dao", ""));
// 构建sql
StringBuilder sql = new StringBuilder("insert into t_");
sql.append(pojoClz.getName().substring(
pojoClz.getName().indexOf("pojo") + 5));
Field[] fields = pojoClz.getDeclaredFields();
sql.append("(");
// ID 是自增长的.所以I为1.若为0则显示有ID
for (int i = 1; i < fields.length; i++) {
sql.append(fields[i].getName());
sql.append(",");
}
sql.delete(sql.length() - 1, sql.length());
sql.append(")");
sql.append("values (");
// 生成参数
Object[] agrs = new Object[fields.length - 1];
for (int i = 1; i < fields.length; i++) {
sql.append("?");
sql.append(",");
// 通过pojo的getter方法取值
String a = "get"
+ fields[i].getName().substring(0, 1).toUpperCase()
+ fields[i].getName().substring(1);
System.out.println(a);
agrs[i - 1] = pojoClz.getMethod(
"get"
+ fields[i].getName().substring(0, 1)
.toUpperCase()
+ fields[i].getName().substring(1)).invoke(
pojo, null);
System.out.println(agrs[i - 1]);
}
sql.delete(sql.length() - 1, sql.length());
sql.append(")");
System.out.println(sql);
return this.merge(sql.toString(), agrs);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
closeDB();
}
return -1;
}
// 通用的删除方法
public int delete(Integer id) {
try {
// 取得dao自己
Class daoClz = this.getClass();
// 取得对应的pojo
Class pojoClz = Class.forName(daoClz.getName()
.replace("dao", "pojo").replace("Dao", ""));
// 生成实例
Object result = pojoClz.newInstance();// pojo必须要有默认参构造器
// 取得pojo中的全部属性
Field[] fields = pojoClz.getDeclaredFields();
// 构建sql
return merge(
"delete t_"
+ pojoClz.getName().substring(
pojoClz.getName().indexOf("pojo") + 5)
+ " where " + fields[0].getName() + "=?", id);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
// 通用的更新的方法
public int update(Object pojo) {
try {
// 取得dao自己
Class daoClz = this.getClass();
// /取得自己对应的pojo
Class pojoClz = Class.forName(daoClz.getName()
.replace("dao", "pojo").replace("Dao", ""));
// 构建sql
StringBuilder sql = new StringBuilder("update t_");
sql.append(pojoClz.getName().substring(
pojoClz.getName().indexOf("pojo") + 5));
// 取得pojo中的全部属性
Field[] flieds = pojoClz.getDeclaredFields();
sql.append(" set ");
// 跳过ID
for (int i = 1; i < flieds.length; i++) {
sql.append(flieds[i].getName());
sql.append("=?,");
}
sql.delete(sql.length() - 1, sql.length()); // 删除最后一个“,”
sql.append(" where ");
sql.append(flieds[0].getName());
sql.append("=? ");
// System.out.println(sql);
// /生成参数
Object[] agrs = new Object[flieds.length];
for (int i = 1; i < flieds.length; i++) {
// 通过pojo的getter方法取值
agrs[i - 1] = pojoClz.getMethod(
"get"
+ flieds[i].getName().substring(0, 1)
.toUpperCase()
+ flieds[i].getName().substring(1)).invoke(
pojo, null);
// System.out.println(agrs[i-1]);
}
// where id=?
agrs[flieds.length - 1] = pojoClz.getMethod(
"get" + flieds[0].getName().substring(0, 1).toUpperCase()
+ flieds[0].getName().substring(1)).invoke(pojo,
null);
return this.merge(sql.toString(), agrs);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
}