V_1.0 需求:开发一个工具方法,辅助初级程序员在不需要掌握sql命令和JDBC的情况下,实现对数据库的插入操作。
V_4.0 实现0sql插入操作需要解决的问题.
1. 如何确认当前【陌生对象】关联的【表名】
2. 如何确认当前表中需要添加数据的字段
3. 如何将对象中数据和表中字段做一个一一对应
V_5.0 解决方案:
【实体类映射文件】描述某一个实体类与表的对象关系。
通过这个文件了解当前类关联的【表名称】
通过这个文件了解当前【表】和当前【对象】的字段和属性对应关系
工具类实现:
public class ReflectUtil {
/**
* 步骤:
* 1.将xml文件和实体类对象加载到内存中
* 2.将obj对象中数据,生成插入sql命令
* @param obj 实体对象
* @param xmlPath 实体对象和数据库表映射xml表
*/
public static void save(Object obj,String xmlPath) throws Exception{
//0.局部变量
String xPath = "";
Connection con =null;
PreparedStatement ps =null;
String sql="";
String sql_v="values (";
//1.将xml文件和实体类对象加载到内存中
SAXReader reader = new SAXReader();
Document doc =reader.read(xmlPath);
Class clazz =obj.getClass();
//2.将obj对象中数据,生成插入sql命令
//2.1 获得要插入的表名
xPath ="//@table";
Attribute e_table =(Attribute) doc.selectSingleNode(xPath);
String tableName =e_table.getValue();
//2.2 jdbc连接数据库
Class.forName("com.mysql.jdbc.Driver");
con= DriverManager.getConnection("jdbc:mysql://localhost:3306/databases", "root", "root");
sql ="insert into "+tableName+"(";
Field[] fields =clazz.getDeclaredFields();
//拼接sql语句
for(int i=0;i<fields.length;i++){
Field fieldObj = fields[i];
String fieldName =fieldObj.getName();
//从xml中查找该field对应的数据类型
xPath = "//property[@name='"+fieldName+"']";
Element ele_f =(Element) doc.selectSingleNode(xPath);
String colName =ele_f.attribute("colName").getValue();
if(i==fields.length-1){
sql+=colName+")";
sql_v+="?)";
}else{
sql+=colName+",";
sql_v+="?,";
}
}
sql+=sql_v;
//预编译
ps=con.prepareStatement(sql);
//预编译对象赋值
for(int i=0;i<fields.length;i++){
Field fieldObj = fields[i];
String fieldName =fieldObj.getName();
//从xml中查找该field对应的数据类型
xPath = "//property[@name='"+fieldName+"']";
Element ele_f =(Element) doc.selectSingleNode(xPath);
//获得列对应的数据类型
String colType =ele_f.attribute("colType").getValue();
//获取权限
fieldObj.setAccessible(true);
//从实体类对象中获得值
Object valueObj = fieldObj.get(obj);
if("int".equals(colType)){
ps.setInt(i+1, (Integer)valueObj);
}else if("varchar".equals(colType)){//String
ps.setString(i+1, (java.lang.String)valueObj);
}else if("double".equals(colType)){
ps.setDouble(i+1, (Double)valueObj);
}else if("date".equals(colType)){
//mysql中支持将一个字符串赋值给日期类
Date data = (Date)valueObj;
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
ps.setString(i+1, sdf.format(data));
}
}
int count =ps.executeUpdate();
}
}
表和实体类映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean classPath="com.xiehe.entily.DeptVO" table="dept">
<property name="deptNo" type="int" colName="DEPTNO" colType ="int"></property>
<property name="dName" type="java.lang.String" colName="DNAME" colType="varchar"></property>
<property name="loc" type="java.lang.String" colName="LOC" colType="varchar"></property>
</bean>
</beans>