手写orm

what?

orm->object -relation -mapping。

 

why?

减少代码冗余,提高代码的可复用性。

 

 

数据库配置文件ORM-DriverConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<Driver nsme="Mysql" state="true">
    <DriverName>com.mysql.jdbc.Driver</DriverName>
    <url>jdbc:mysql://localhost:3306/test</url>
    <userName>root</userName>
    <pwd>xuxie</pwd>
</Driver>

 

 

封装sql与映射

<?xml version="1.0" encoding="UTF-8"?>
<sql>
	<resultMap id="UserResult" class="com.aptech.orm.pojo.User" table="s_user">
		<result property="id" column="id" />
		<result property="name" column="name" />
		<result property="age" column="age" />
	</resultMap>

	<SQL id="SELECT_ALL" resultMap = "UserResult">select age,name from s_user</SQL>
	<SQL id="DELETE_ID">delete from s_user where id =?</SQL>
	<SQL id="INSERT_OBJECT">insert into s_user values(?,?,?,'')</SQL>
	<SQL id="SELECT_NAME">select * from s_user where name like "%"?"%"</SQL>
</sql>

 

pojo

package com.aptech.orm.pojo;

import java.sql.Blob;



public class User
{
	private int id;
	private String name;
	private int age;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	
}

 

工具类

package com.aptech.orm.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class ORMUtil {

	public static Document getDbDocument() {
		Document document = null;
		SAXBuilder builder = new SAXBuilder();
		FileInputStream fileInputStream = null;
		try {
			fileInputStream = new FileInputStream(new File(
					"./src/ORM-DriverConfig.xml"));
			document = builder.build(fileInputStream);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != fileInputStream) {
					fileInputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return document;
	}

	public static Document getSqlDocument() {
		Document document = null;
		SAXBuilder builder = new SAXBuilder();
		FileInputStream fileInputStream = null;
		try {
			fileInputStream = new FileInputStream(new File("./src/ORM-Sql.xml"));
			document = builder.build(fileInputStream);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != fileInputStream) {
					fileInputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return document;
	}

	public static Connection getConnection() {
		Connection con = null;
		try {
			Document document = getDbDocument();
			Element rootElement = document.getRootElement();
			String DriverName = rootElement.getChildText("DriverName");
			String url = rootElement.getChildText("url");
			String userName = rootElement.getChildText("userName");
			String pwd = rootElement.getChildText("pwd");
			Class.forName(DriverName);
			con = DriverManager.getConnection(url, userName, pwd);

		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;
	}

	public static List<Element> getSqlElement() {
		Document document = getSqlDocument();
		Element root = document.getRootElement();
		List<Element> children = root.getChildren("SQL");
		return children;
	}

	public static List<Element> getResultMapElement() {
		Document document = getSqlDocument();
		Element root = document.getRootElement();
		List<Element> children = root.getChildren("resultMap");
		return children;
	}

	public static List<Element> getResultElement(String id) {
		List resultElementList = null;
		List<Element> children = getResultMapElement();
		for (Element element : children) {
			if (id.equals(element.getAttributeValue("id"))) {
				resultElementList = element.getChildren();
				break;
			}
		}
		return resultElementList;
	}

	public static String getSQL(String id) {
		String sql = "";
		List<Element> sqlElement = getSqlElement();
		for (Element element : sqlElement) {
			if (id.equals(element.getAttributeValue("id"))) {
				sql = element.getText();
				break;
			}
		}
		return sql;
	}
	
	public static String getResultMap(String id) {
		String resultMap = "";
		List<Element> sqlElement = getSqlElement();
		for (Element element : sqlElement) {
			if (id.equals(element.getAttributeValue("id"))) {
				resultMap = element.getAttributeValue("resultMap");
				break;
			}
		}
		return resultMap;
	}
	

	public static void close(Connection con, Statement stmt, ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (con != null) {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public static Map getResultMap(ResultSet rs) {
		Map map = new HashMap();
		try {
			ResultSetMetaData meta = rs.getMetaData();
			int clos = meta.getColumnCount();
			while (rs.next()) {
				for (int i = 1; i <= clos; i++) {
					map.put(meta.getColumnName(i), rs.getObject(i));
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return map;
	}
	
	/**
	 * 
	 * 〈获取查询的数据字段〉
	 * @param [rs]     [结果集]
	 * @return  [字段集合]
	 * @Author  YangZhuan
	 */
	public static List getResultFields(ResultSet rs) {
		List list = new ArrayList();
		try {
			ResultSetMetaData meta = rs.getMetaData();
			int clos = meta.getColumnCount();
				for (int i = 1; i <= clos; i++) {
					list.add(meta.getColumnName(i));
				}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return list;
	}
	
	/**
	 * 
	 * 〈关系型数据映射为对象〉
	 * @param [rs]     [结果集]
	 * @param [id]     [对应的mapping]
	 * @return  [Object]
	 * @Author  YangZhuan
	 */
	public static Object getObject(ResultSet rs,String id) {
		//获取类路径
		String classPath = getClass(id);		
		Object object = null;
		try {

			//所有字段
			List fieldsList = getResultFields(rs);
			
			//类实例化
			object = Class.forName(classPath).newInstance();
			//当前类的方法数组
			Method[] methods = object.getClass().getMethods();
			//遍历方法数组
			for (int i = 0; i < methods.length; i++) {
				//方法名
				String methodName = methods[i].getName();
				//只处理以set开头的方法
				if(methodName.startsWith("set")){
					//字段名
					String field = methodName.substring(3).toLowerCase();
					
					//判断当前子段是否使用
					if(fieldsList.contains(field)) {
						
						//隐式的方法调用
						methods[i].invoke(object, rs.getObject(field));	
					}
					
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return object;
	}

	
	public static String getClass(String id) {
		String classPath = "";
		try {
			List<Element> children = getResultMapElement();
			for (Element element : children) {
				if (id.equals(element.getAttributeValue("id"))) {
					classPath = element.getAttributeValue("class");
					break;
				}
			}	
		} catch (Exception e) {
			e.printStackTrace();
		}
		return classPath;
	}

}

 

执行

package com.aptech.orm.manage;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.aptech.orm.pojo.User;
import com.aptech.orm.util.ORMUtil;

public class ORMProcess {


	public static List QueryForList(String str) {
		List list = new ArrayList();
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			String sql = ORMUtil.getSQL(str);
			con = ORMUtil.getConnection();
			ps = con.prepareStatement(sql);
			ps.execute();
			rs = ps.getResultSet();
			while(rs.next()){
				Object obj = ORMUtil.getObject(rs, ORMUtil.getResultMap(str));
				list.add(obj);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ORMUtil.close(con, ps, rs);
		}
		return list;
	}

	
	public static void main(String[] args) {
		List<User> list = QueryForList("SELECT_ALL");
		for (User user : list) {
			System.out.println("id:"+user.getId()+"name:"+user.getName()+"age:"+user.getAge());
		}
		
	}
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值