现在的位置: 首页 > 综合 > 正文

模拟实现ORM框架

2012年05月18日 ⁄ 综合 ⁄ 共 2239字 ⁄ 字号 评论关闭

1 定义映射文件的XML格式。

//Students.xml
<?xml version="1.0"?>
<mapping>
	<class name="User" table="user">
		<property name="id" column="id">
		<property name="name" column="name">
         </class>
</mapping>

2. 获取XML中的值

把XML中class节点下的table赋值给tableName,把XML中property节点下的name和column放入Map类型的集合中。

//属性--字段<属性,字段>
	private Map<String,String> maps=new HashMap<String,String>();
	private String tableName;
	private String[] methodName;
	
	public Session() throws Exception
	{
		SAXReader reader=new SAXReader();
		File f=new File("Students.xml");
		Document doc=reader.read(f);
		
		Element root=doc.getRootElement();
		List list1=root.elements();
		for(int i=0;i<list1.size();i++)
		{
			Element node1=list1.get(i);
			tableName=node1.attributeValue("table");
			List list2=node1.elements();
			for(int j=0;j<list2.size();j++)
			{
				Element node2=(Element)list2.get(j);
				map.put(node2.attributeValue("name"),node2.attributeValue("column"));
				
			}
			methodNames=new String[map.size()];
		}

3. 生成prepareStatement需要的sql脚本,insert into 表名(字段1,字段2……)values(?,?……);

由insert语句模板,生成具体的sql脚本,如【insert into students(id,name)values(?,?);】,同时根据name构造getter方法。

实现方法:1,从xml文件

private String createSQL()
	{
		String s1="";
		String s2="";
		for(String key:maps.keySet())
		{
			String value=maps.get(key);
			s1+=value+",";
			methodName[index++]="get"+Character.toUpperCase(key.charAt(0))+key.substring(1);
			
		}
		s1=s1.substring(0,s1.length()-1);
		for(int i=0;i<maps.size();i++){
			s2+="?,";
		}
		s2=s2.substring(0,s1.length()-1);
		String sql="insert into "+tableName+"("+s1+")value("+s2+");"
	}
}

4. 利用反射,构造save方法。

1,创建insert的sql模板;2,建立数据库连接,获取prepareStatement对象;3,用反射调用传入对象的getter方法,获取对象的值;4,把获取的值利用setType传给prepareStatement;5,执行prepareStatement,关闭资源。

public void save(Students stu) throws Exception
{
	String sql=creatSQL();//创建插入SQL语句模板
	System.out.println(sql);//打印sql语句
	//创建数据库连接,执行sql语句
	Connection conn=null;
	PreparedStatement stmt=null
	Class.forName("com.mysql.jdbc.Driver");
	conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test");
	stmt=conn.prepareStatement(sql);

	for(int i=0;i<methodNames.length;i++){
		//根据方法名获取方法
		Method m=stu.getClass().getMethod(methodNames[i]);
		Class c=m.getReturnType();//获取对象类型
		if(c.getName().equals("java.lang.Integer")||c.getName().equals()){
			int value=(Integer)m.invoke(s);
			stmt.setInt(i+1,value)
		}
		if(c.getName().equals("java.lang.String")){
			String value=(String)m.invoke(s);
			stmt.setString(i+1,value)
		}
		stmt.executeUpdate();
		stmt.close();
		conn.close();
	}
}

抱歉!评论已关闭.