public class GenericDaoImpl<T extends Serializable, ID extends Serializable>
implements IGenericDao<T, ID> {
// 创建三个属性:属性用于接收T传入的类对象 属性用于获取datasource 属性用于创建QueryRunner
private Class<T> persistentClass;
private BasicDataSource dataSource;
private QueryRunner queryRunner;
// 创建该类的构造方法,同时在构造方法中实例化datasource对象,获取T泛型
@SuppressWarnings({ "unchecked", "static-access" })
public GenericDaoImpl() {
// 使用reflect反射机制实现自动获取泛型参数所要操作的实体类
this.persistentClass = (Class<T>) ((ParameterizedType) (this.getClass()
.getGenericSuperclass())).getActualTypeArguments()[0];
// 获取DataSourceProvider提供的DataSource对象
this.dataSource = DataSourceProvider.getInstance().getDataSource();
}
@Override
public int insert(T entity) {
// TODO Auto-generated method stub
// 步骤1:使用reflect获取操作的实体类名称
String className = this.persistentClass.getSimpleName();
// 步骤2:将步骤1获取的类名称小写化转化成数据表的名称(Oracle区分大小写)
String tableName = className.toLowerCase();
// 步骤3:使用reflect获取传入的实体类中已经声明过的属性数组
Field[] properties = this.persistentClass.getDeclaredFields();
// 步骤4:创建一个StringBuilder对象构建SQL基础语句
StringBuilder strSQL = new StringBuilder("insert into " + tableName
+ " values(");
// 创建一个空参数数组
Object[] params = new Object[properties.length];
// 步骤5:使用for循环遍历类中的属性数组
for (int i = 0; i < properties.length; i++) {
// 判断当前循环到的属性类型是否为日期类型
if (properties[i].getType().toString()
.equals("class java.util.Date")) {
strSQL.append("to_date(?, 'yyyy-MM-dd'), ");
} else {
strSQL.append("?, ");
}
// 使用反射获取属性的名称
String propertyName = properties[i].getName();
// 思考:如果出现相同字母如何处理
String methodName = "get"
+ propertyName.replaceFirst(propertyName.charAt(0) + "",
((char) (propertyName.charAt(0) - 32)) + "");
try {
// 使用反射获取指定方法并返回值
Object propertyValue = this.persistentClass.getDeclaredMethod(
methodName).invoke(entity);
// 将获取到的属性值装载到参数数组中
if (propertyValue instanceof java.util.Date) {
params[i] = new SimpleDateFormat("yyyy-MM-dd")
.format(propertyValue);
} else {
params[i] = propertyValue;
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException 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();
}
}
// 步骤6:截取最终循环产生的SQL语句
strSQL = strSQL.delete(strSQL.length() - 2, strSQL.length());
// 步骤7:补充SQL语句的结束括号
strSQL.append(")");
System.out.println("SQL:> " + strSQL.toString());
for (int i = 0; i < params.length; i++) {
System.out.print(params[i] + " ");
}
// 实例化QueryRunner对象
this.queryRunner = new QueryRunner(dataSource);
try {
return this.queryRunner.update(strSQL.toString(), params);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return -1;
}
}
}
用的是数据库连接池啊。相当于JDBC连接数据库
|