最近正好在看一下apache dbutils的源码,做了点多表查询返回JAVABEAN,与类似hibernate 保存JAVABEAN的封装。
插入部分代码如下:
//定义了几个静态常量
private final static String insertSql = " insert into ";
//实现方法
/**
* 这个方法主要将拼接出来的SQL执行
* @param javabean
*/
public static void insertJavaBean(Object javaBean) {
int count=0;
StringBuilder bf = new StringBuilder();
if (null == javaBean) {
throw new RuntimeException("Bean 对像不能为空");
}
Connection conn=getConnection();
try {
conn.setAutoCommit(false);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
List l = iterator_BeanUtil(javaBean);
for (Object object : l) {
count++;
Object[] sqlVal = ((Object[]) object);
Stack sta = (Stack) sqlVal[0];
Object[] sqlv = ((List) sqlVal[1]).toArray();
for (int i = 0; i < sta.size(); i++) {
Object sql = sta.get(i);
bf.append(sql);
}
System.out.println(bf.toString());
System.out.println(sqlv[0]);
System.out.println(sqlv[1]);
try {
_g_runner.update(conn, bf.toString(), sqlv);
} catch (Exception e) {
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
finally
{
bf.delete(0, bf.length());
try {
if(count==l.size())
{
conn.commit();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
try {
if(conn!=null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bf=null;
l=null;
arrayList.clear();
}
/**
* 利用反射遍历JAVABEAN,回调嵌套bean
* @param javaBean
* @return list
*/
public static List iterator_BeanUtil(Object javaBean) {
Field fields[] = javaBean.getClass().getDeclaredFields();
List parm = new ArrayList();
Object[] sqlValue = new Object[2];
Stack list = get_SqlList(javaBean.getClass().getSimpleName());
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
field.setAccessible(true);
try {
if (!"serialVersionUID".equals((field.getName()))) {
parm.add((field.getAnnotation(JavaBean.class) != null ? field
.get(javaBean) : BeanUtils.getProperty(javaBean,
field.getName()))+"".trim());
list.addElement("?");
list.addElement(",");
}
//JavaBean 是个注解类,标志field字段
if (field.getAnnotation(JavaBean.class) != null) {
try {
iterator_BeanUtil(isValue_Bean(field, javaBean)); //回调,bean中嵌套了bean
} 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();
}
// }
}
if (",".equals(list.lastElement()))
list.remove(list.lastIndexOf(","));
list.addElement(")");
sqlValue[0] = list;
sqlValue[1] = parm;
arrayList.add(sqlValue);
return arrayList;
}
private static Object isValue_Bean(Field field, Object javaBean) {
Object childJavaBean = null;
try {
childJavaBean = field.get(javaBean);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (childJavaBean == null) {
throw new RuntimeException("发现JavaBean中有空对象值");
}
return childJavaBean;
}
private static Stack get_SqlList(Object javaBean) {
Stack stk = new Stack();
stk.addElement(insertSql);
stk.addElement(" " + javaBean + " ");
stk.addElement(insertSql_Value);
return stk;
}
//------------调用 设置如下两个JAVABEAN,对应的是两张表--------------------------------
Tu_MobileNum mu=new Tu_MobileNum();
mu.setMOBILENUM("77777");
Tu_M2 m2=new Tu_M2();
m2.setID("111");
m2.setNAME("小红");
mu.setM2(m2);
try {
QueryHelper.insertJavaBean(mu);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
----------------------------输出日志-----------------------
insert into tu_m2 values( ?,?)
[111,小红]
insert into Tu_mobilenum values( ?,?)
[77777,111]
--------------------单表的话比较简单------------------------------------------
Tu_M2 m2=new Tu_M2();
m2.setID("222");
m2.setNAME("小明");
QueryHelper.insertJavaBean(m2);
思路应该是正确的,就是反射与动态代理!