自己写的一个hibernate简单实现

package cn.util;

import java.beans.BeanInfo;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;

import cn.po.Dep;
import cn.vo.DepForm;
import cn.vo.UserForm;

public class JdbcUtil {
	/**
	 * 
	 * @param obj
	 * @param objForm
	 * @return
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * 它返回应该是PO对象 。
	 */
	public static Object trans(Object obj,Object objForm) throws IllegalAccessException, InvocationTargetException{
		/*
		 * BeanUtils.copyProperties(emp, empForm);
		 *   * 作用用于属性间的赋值
		 *   * 第一参数:目标javaBean
		 *   * 第二参数:源javaBean
		 *   * 条件:两个javaBean中的属性的名称要相同,类型可以不同。
		 *         主要是名称要相同,才能复制,否则不能复制
		 *         
		 *       
		 */
		BeanUtils.copyProperties(obj, objForm);
		return obj;
	}
	
	
	
	/**
	 * 
	 * @param obj-----它应该是一个PO对象。
	 * @return
	 * vo中的对象,po中的对象 ,以及数据库中的字段名称必须一致,以及po中的类名要与数据库
	 * 中的表名相同,我数据库中的所有字段和表名全部变成小写。
	 */
	public static boolean save(Object obj){
		try {
			Connection connection = JdbcConn.getConnection();
			
			Statement st = null;
			
			ResultSet rs = null;
			
			Class clazz = obj.getClass();
			
			//表名
			String tableName = clazz.getSimpleName().toLowerCase();
			System.out.println("表名:"+tableName);
			
			//以下我们不再使用反射,获取每个方法名,而是直接使用内省
			BeanInfo beanInfo = java.beans.Introspector.getBeanInfo(obj.getClass(),Object.class);
			//获取所有的描述信息
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
			
			StringBuilder sql = new StringBuilder("insert into ");
			
			sql.append(tableName+"(");
			
			//用于存储字段的实际内容 
			String res = "";
			
			for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
				System.out.println(propertyDescriptor.getDisplayName());
				
				String field = propertyDescriptor.getDisplayName();
				
				//获取get方法,是为了获取对象中的值。
				Method method = propertyDescriptor.getReadMethod();
				//得到返回值的类型
				Class type = method.getReturnType();
				
				System.out.println("返回类型:"+type.getName());
				
				if(type.getName().equals("java.lang.String")){
					res += "'"+ method.invoke(obj, null)+"',";
				}else if (type.getName().equals("int")) {
					res += method.invoke(obj, null)+",";
				}else if(type.getName().equals("java.sql.Date")){
					res += "'"+method.invoke(obj, null)+"',";
				}
				
				
				System.out.println("res:"+res);
				
				sql.append(field.toLowerCase()+",");
			}
			
			String res2 = res.substring(0,res.lastIndexOf(","));
			
			System.out.println(res2);
			
			String sql2 = sql.substring(0, sql.lastIndexOf(","));
			
			StringBuilder finalSql = new StringBuilder(sql2).append(")");
			
			finalSql.append("values(");
			
			finalSql.append(res2);
			
			finalSql.append(");");
			//拼接成功
			System.out.println("insert sql:"+finalSql);
			
			//开始进行数据库插入
			st = connection.createStatement();
			
			st.executeUpdate(finalSql.toString());
			
			JdbcConn.realase(connection, st, rs);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	
	
	/**
	 * 查询方法。
	 * @param obj
	 * @return
	 * 传过来一个实体实体名称 然后把表里面的所有数据取出来。相当于是指明是找哪张表。
	 */
	public static List query(Object obj){
		try {
			Connection connection = JdbcConn.getConnection();
			
			Statement st = null;
			
			ResultSet rs = null;
			
			Class clazz = obj.getClass();
			
			//表名
			String tableName = clazz.getSimpleName().toLowerCase();
			System.out.println("表名:"+tableName);
			
			/**
			 * Introspector.getBeanInfo()可以获得某个Bean的信息。
			 * 而这个对象通过beanInfo.getPropertyDescriptors()可以获得所有的属性数组,包括成员、方法等。
			 * 例如:一个bean里面有三个成员,那么那数组的长度就为三,每个数组里面是一个propertyDescriptors对象,
			 * 这个propertyDescriptors可以获得这成员的名字,set get 方法,就相当于这是一个成员的一套东西,放在
			 * 一个propertyDescriptors属性描述对象里面。
			 */
			//以下我们不再使用反射,获取每个方法名,而是直接使用内省
			BeanInfo beanInfo = java.beans.Introspector.getBeanInfo(obj.getClass(),Object.class);
			//获取所有的描述信息
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
			
			StringBuilder sql = new StringBuilder("select * from ");
			
			sql.append(tableName+";");
			
			System.out.println("query sql:"+sql);
			
			System.out.println("开始查询");
			
			st = connection.createStatement();
			
			rs = st.executeQuery(sql.toString());
			
			List list = new ArrayList();
			
			/**
			 * 根据结果集,获得列名 的方法,估计低层用的也是反射。
			 */
			ResultSetMetaData rsmd = rs.getMetaData();
			
			int count = rsmd.getColumnCount();
			
			for (int i = 1; i <= count; i++) {
				System.out.println("列名:"+rsmd.getColumnName(i));
			}
			
			while(rs.next()){
				
				Object entity  = clazz.newInstance();;
				for(PropertyDescriptor propertyDescriptor : propertyDescriptors){
						//每次创建一个对象,把所有的成员存储进去 ,最后把这个实体封装到一个集合里面。
						
						Method method = propertyDescriptor.getWriteMethod();
						
						System.out.println(method.getName()+":"+rs.getObject(propertyDescriptor.getDisplayName()));
						
						method.invoke(entity, rs.getObject(propertyDescriptor.getDisplayName()));
				}
				if(entity!=null){
					
					list.add(entity);
				}
			}
			return list;
		}catch(Exception e){
			e.printStackTrace();
		}
		return null;
		
	}
	
	
	/**
	 * 
	 * @param obj
	 * @return
	 * 根据实体的id删除。
	 */
	public static boolean delete(Object obj){
		try {
			Connection connection = JdbcConn.getConnection();
			
			Statement st = null;
			
			ResultSet rs = null;
			
			Class clazz = obj.getClass();
			
			//表名
			String tableName = clazz.getSimpleName().toLowerCase();
			
			System.out.println("表名:"+tableName);
			
			StringBuilder sql = new StringBuilder("delete from "+tableName+" where id=");
			
			int id = 0;
			
			BeanInfo beanInfo = java.beans.Introspector.getBeanInfo(obj.getClass(), Object.class);
			
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
			
			for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
				
				if (propertyDescriptor.getDisplayName().equals("id")) {
					
					Method method = propertyDescriptor.getReadMethod();
					
					id = (Integer) method.invoke(obj, null);
				}
			}
			
			sql.append(id);
			
			System.out.println("开始删除");
			
			st = connection.createStatement();
			
			int res = st.executeUpdate(sql.toString());
			
			if (res>0) {
				System.out.println("suc");
			}else {
				System.err.println("erro");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
	/**
	 * 
	 * @param obj
	 * @return
	 * 根据实体的id更新数据。
	 */
	public static boolean update(Object obj){
		try{
			Connection connection = JdbcConn.getConnection();
			
			Statement st = null;
			
			ResultSet rs = null;
			
			Class clazz = obj.getClass();
			
			//表名
			String tableName = clazz.getSimpleName().toLowerCase();
			
			System.out.println("表名:"+tableName);
			//基本表结构
			StringBuilder sql = new StringBuilder("update "+tableName+" set ");
			
			
			BeanInfo beanInfo = java.beans.Introspector.getBeanInfo(obj.getClass(),Object.class);
			//获取所有的描述信息
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
			
			//拼接要更新的内容
			
			
			for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
				
				//字段名
				String field = propertyDescriptor.getDisplayName();
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
	public static void main(String[] args) throws Exception {
/************************测试插入*************************************************************/		
	/*	DepForm df = new DepForm();
		df.setDepFunc("培训");
		df.setDepName("imya");
		df.setId("3");
		df.setCreateDate("2011-11-12");
		
		Dep d = new Dep();
		
		BeanUtils.copyProperties(d, df);
		
		System.out.println(d);
		
		save(d);*/
/*************************************************************************************/	
		
		
/*********************测试查询****************************************************************/		
//		Dep d = new Dep();
//		List list = query(d);
//		
//		for (Object object : list) {
//			System.out.println(object.toString());
//		}
		
/*************************************************************************************/		
		
		
/*******************测试删除******************************************************************/
		Dep d2 = new Dep();
		
		List list2 = query(d2);
		
		for (Object object : list2) {
			System.out.println("删除前"+object.toString());
		}
		
		d2.setId(3);
		delete(d2);
		
		List list = query(d2);
		
		for (Object object : list) {
			System.out.println("删除后"+object.toString());
		}
		
		
/*************************************************************************************/		
				
	}
}

 
  
package cn.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
 * 
 * @author Administrator
 *	工具类的功能:获取数据库链接、释放资源
 */
public class JdbcConn {
	private static String driver = null;
	private static String url = null;
	private static String username = null;
	private static String password = null;

	//静态代码块,每次类加载时间执行,而且只执行一次。
	static{
		
		try{
			
			InputStream inputStream = JdbcConn.class.getClassLoader().getResourceAsStream("db.properties");
			
			Properties properties = new Properties();
			
			properties.load(inputStream);
			
			driver = properties.getProperty("driver");
			
			url = properties.getProperty("url");
			
			username = properties.getProperty("username");
			
			password = properties.getProperty("password");
			//加载驱动
			Class.forName(driver);
		}catch(Exception e){
			new ExceptionInInitializerError(e);
		}
	}
	/**
	 * 
	 * @return
	 * 获取数据库链接
	 * @throws Exception 
	 */
	public static Connection getConnection() throws Exception{
		
		return DriverManager.getConnection(url, username, password);
	}
	
	public static void realase(Connection conn,Statement st,ResultSet rs){
		
		if (conn!=null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			conn = null;
		}
		
		if (st!=null) {
			try {
				st.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			st = null;
		}
		
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			rs = null;
		}
	}

	
}

 
 
  

你可能感兴趣的:(Hibernate)