• 反射封装工具类-----零SQL插入


    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>
    
  • 相关阅读:
    执行 composer --version 命令的时候报 Your requirements could not be resolved to an installable set of packages. 错误
    Mac 解决每次新建终端 都要重新运行 source ~/.bash_profile问题
    mac 文件根据权限展示颜色
    Unable to negotiate with 180.101.**.*** port 22: no matching cipher found. Their offer: 3des-cbc,blowfish-cbc,arcfour,cast128-cbc,aes128-cbc,aes192-cbc,aes256-cbc
    带有git账户名称密码更改git推送拉取地址
    使用Java,实现图片与Base64编码互转的程序
    Spring事务管理:ACID的概念,Spring事务管理核心接口,基于XML方式的声明式事务、基于注解(Annotation)方式的声明式事务
    Spring,JDBC, JdbcTemplate的常用方法
    Spring,AOP,基于注解声明式ApsectJ
    养猫记
  • 原文地址:https://www.cnblogs.com/he-shao/p/6068309.html
Copyright © 2020-2023  润新知