實現orm框架,類似hibernate功能


之前使用Hibernate時,覺得很不錯,但是自己平時做一些練習時都是一些小項目,所以自己想能不能自嘗試寫一個類似Hibernate的簡單功能呢?當然,本人水平不足,所以現在只能求形似。如果說的有錯希望給位前輩批評並指教。

以下是我的測試結果:

數據插入:

        User user = new User();
        user.setName("HHZoog");
        user.setPwd("HHZoog");
        user.setMusic_box("12");
        
        HibernateDao.save(user);

測試結果:

數據修改:

        User user = new User();
        user.setId(22);
        user.setName("HHZoog");
        user.setPwd("OOOOOO");
        user.setMusic_box("12");
HibernateDao.update(user);

測試結果:

數據刪除:

        User user = new User();
        user.setId(22);
        user.setName("HHZoog");
        user.setPwd("OOOOOO");
        user.setMusic_box("12");
        
        HibernateDao.delete(user);

測試結果:刪除成功

數據查找:get方法

        User user = (User)HibernateDao.get(User.class, 23);
        System.out.println(user.getId() + " | " +user.getName() + " | " +user.getPwd());

測試結果:

數據查找:find方法

        String sql = "select * from user where id = 23";
        List<Object> lists = HibernateDao.find(sql, User.class);
        for(int i = 0 ; i < lists.size(); i++)
        {
            User user = (User)lists.get(i);
            System.out.println(user.getId() + " | " +user.getName() + " | " +user.getPwd());
        }

測試結果:

 

下面介紹一下各個類的功能:

ResultSetToObject類事件數據庫操作返回的ResultSet結果集轉為List<Object>對象;

BaseOperatorDao類是基本的數據操作類,執行傳遞過來的Sql語句;

HibernateDao提供類似Hibernate簡單操作的功能;

User對應的實體類;

FunctionUtils類提供一些常用的方法;

ConnectDB類是連接數據庫的操作類:

***********************************************************************

一下是各個類的源代碼:

HibernateDao.java

View Code
public class HibernateDao
{ 
    
    /**
     * 保存對象
     * @param object
     */
    public static void save(Object object)
    {
        Class<?> objClass = object.getClass();       
        Field[] fields = objClass.getDeclaredFields();  
        
        /*構建SQL語句*/
        StringBuffer sql = new StringBuffer("insert into ");  
        StringBuffer values = new StringBuffer("values(");
        
        /*數據庫名稱*/
        Field tableName = null;
        
        try
        {
            /*根據實體類中的tableName屬性獲得數據庫名稱*/
            tableName = objClass.getDeclaredField("tableName");
            
            /*拼接SQL語句*/
            sql.append(tableName.get(object));
            sql.append("(");
            
            /*根據傳入的object對象獲取到屬性的值,並拼接到SQL語句中*/
            for(int i = 0 ; i < fields.length ; i++)
            {
                /*但object的屬性名為tableName,id,primaryKey時,則不將其拼接到SQL語句中*/
                if(fields[i].getName().equals("tableName") || fields[i].getName().equals("id") || fields[i].getName().equals("primaryKey"))
                {
                    
                }else
                {
                       sql.append(fields[i].getName());
                       sql.append(",");
                       
                       /*獲得object對應屬性的字段名的getXxxx()方法*/
                    Method method = objClass.getDeclaredMethod
                    ("get"+FunctionUtils.upInitial(fields[i].getName()));
                    
                    /*獲得此objec字段的值*/
                    Object value = method.invoke(object);
                    
                    /*如果值為空,則SQL語句中的值則為空*/
                    if(value == null)
                    {
                        values.append("null");
                        values.append(",");
                    }
                    
                    /*獲得此字段對應的數據類型*/
                    else if(fields[i].getType() == java.lang.String.class)
                    {
                        values.append("'");
                        values.append(value);
                        values.append("'");
                        values.append(",");
                    }else
                    {
                        values.append(value);
                        values.append(",");
                    }
                }
            }
            
        } catch (SecurityException e)
        {
            e.printStackTrace();
        } catch (NoSuchFieldException e)
        {
            e.printStackTrace();
        } catch (IllegalArgumentException e)
        {
            e.printStackTrace();
        } catch (IllegalAccessException e)
        {
            e.printStackTrace();
        } catch (NoSuchMethodException e)
        {
            e.printStackTrace();
        } catch (InvocationTargetException e)
        {
            e.printStackTrace();
        }
        
        /*刪除末尾一個逗號*/
        sql.delete(sql.length()-1, sql.length());
        sql.append(")");
        sql.append(" ");
        values.delete(values.length()-1, values.length());
        values.append(")");
        
        /*拼接成一條完整的SQL語句*/
        String resultSql = sql.toString() + values.toString();
        
        /*執行SQL語句操作*/
        BaseOperatorDao.delOrSaveOrUpdateData(resultSql);
        
        System.out.println(resultSql);
    }

    /**
     * 根據提供的SQL和實體類查找數據並返回List<Object>
     * @param sql
     * @param objClass
     * @return
     */
    public static List<Object> find(String sql,Class<?> objClass)
    {
        return ResultSetToObject.turnToObject(BaseOperatorDao.selectData(sql),objClass);
    }

    /*根據主鍵查找數據*/
    public static Object get(Class<?> objClass,Object key)
    {
        
        StringBuffer sql = new StringBuffer("select * from ");
        Object object = null;
        
        try
        {
            Field tableName = objClass.getDeclaredField("tableName");
            Field primaryKey = objClass.getDeclaredField("primaryKey");
            
            /*拼接數據庫名到SQL語句中*/
            sql.append(tableName.get(objClass));
            
            /*獲得主鍵數據類型,如果是string類型則加單引號*/
            if(primaryKey.getType().equals("java.lang.String.class"))
            {
                sql.append(" where "+primaryKey.get(objClass)+" ='"+key.toString()+"'");
            }else
            {
                sql.append(" where "+primaryKey.get(objClass)+" ="+key.toString());
            }

            System.out.println(sql.toString());
            
            /*執行SQL語句后返回List對象*/
            List<Object> listObjects = ResultSetToObject.turnToObject(BaseOperatorDao.selectData(sql.toString()),objClass);
            
            /*取得第一條記錄,即查找到數據*/
            object = listObjects.get(0);
            
        } catch (SecurityException e)
        {
            e.printStackTrace();
        } catch (NoSuchFieldException e)
        {
            e.printStackTrace();
        } catch (IllegalArgumentException e)
        {
            e.printStackTrace();
        } catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
        
        return object;
    }

    /**
     * 刪除記錄
     * @param object
     */
    public static void delete(Object object)
    {
        
        StringBuffer sql = new StringBuffer("delete from ");
        
        /*獲得對象的Class類型*/
        Class<?> objClass = object.getClass();
        
        /*對象申明的屬性*/
        Field filed;
        
        /*對象申明的方法*/
        Method method = null;
        
        try
        {
            /*獲得主鍵名稱*/
            Field primaryKey = objClass.getDeclaredField("primaryKey");
            String keyName = (String) primaryKey.get(objClass);
            
            /*將keyName首字母轉為大寫,並獲得主鍵的get方法*/
            method = objClass.getDeclaredMethod("get"+FunctionUtils.upInitial(keyName));
            
            /*獲得數據名稱,並拼接到SQL語句中*/
            filed = objClass.getDeclaredField("tableName");
            sql.append(filed.get(objClass));
            
            if(primaryKey.getType().equals("java.lang.String.class"))
            {
                sql.append(" where "+keyName+" = '"+method.invoke(object)+"'");
            }else
            {
                sql.append(" where "+keyName+" = "+method.invoke(object));
            }
            
            BaseOperatorDao.delOrSaveOrUpdateData(sql.toString());
        } catch (SecurityException e)
        {
            e.printStackTrace();
        } catch (NoSuchFieldException e)
        {
            e.printStackTrace();
        } catch (IllegalArgumentException e)
        {
            e.printStackTrace();
        } catch (IllegalAccessException e)
        {
            e.printStackTrace();
        } catch (NoSuchMethodException e)
        {
            e.printStackTrace();
        } catch (InvocationTargetException e)
        {
            e.printStackTrace();
        }
        
        System.out.println(sql.toString());
    }

    /**
     * 根據SQL刪除記錄
     * @param sql
     * @return
     */
    public static int delete(String sql)
    {
        return BaseOperatorDao.delOrSaveOrUpdateData(sql);
    }

    /**
     * 更新記錄
     * @param object
     */
    public static void update(Object object)
    {
        /*獲得對象的類型*/
        Class<?> objClass = object.getClass();
        
        /*待拼接SQL語句*/
        StringBuffer sql = new StringBuffer("update ");
        StringBuffer whereSql = new StringBuffer(" where ");
        
        /*獲得申明的屬性*/
        Field[] fields = objClass.getDeclaredFields();
        
        
        try
        {
            Field tableName = objClass.getDeclaredField("tableName");
            Field primaryKey = objClass.getDeclaredField("primaryKey");
            
            /*獲得主鍵的名稱*/
            String keyName = (String)primaryKey.get(objClass);
            
            /*將主鍵拼接到SQL語句中*/
            whereSql.append(keyName);
            whereSql.append("= ");
            sql.append(tableName.get(objClass));
            sql.append(" set ");
            
            for(int i = 0 ; i < fields.length; i++)
            {
                /*如果屬性名稱為tableName,primaryKey時則不拼接到SQL中*/
                if(fields[i].getName().equals("tableName") || fields[i].getName().equals("primaryKey"))
                {
                    
                }else
                {
                    /*獲得對應屬性的get方法*/
                    Method method = objClass.getDeclaredMethod("get"+FunctionUtils.upInitial(fields[i].getName()));
                    sql.append(fields[i].getName());
                    sql.append("=");
                    
                    /*獲得對應屬性的數據類型,如果是String類型則加單引號*/
                    if(fields[i].getType() == java.lang.String.class)
                    {
                        sql.append("'");
                        sql.append(method.invoke(object));
                        sql.append("'");
                        sql.append(",");
                    }else
                    {
                        sql.append(method.invoke(object));
                        sql.append(",");
                    }
                    
                    /*如果此屬性為主鍵*/
                    if(fields[i].getName().equals(keyName))
                    {
                        if(primaryKey.getType().equals("java.lang.String.class"))
                        {
                            whereSql.append("'");
                            whereSql.append(method.invoke(object));
                            whereSql.append("'");
                        }else
                        {
                            whereSql.append(method.invoke(object));
                        }
                    }
                }
            }
            
            /*刪除多余的逗號*/
            sql.delete(sql.length()-1, sql.length());
            
            /*執行操作,並返回作用的行數*/
            int count = BaseOperatorDao.delOrSaveOrUpdateData(sql.toString()+whereSql.toString());
            
            if(count == 0)
            {
                System.out.println("請確定數據庫中是否由此記錄");
            }
            
            System.out.println(sql.toString()+whereSql.toString());
            
        } catch (SecurityException e)
        {
            e.printStackTrace();
        } catch (NoSuchFieldException e)
        {
            e.printStackTrace();
        } catch (IllegalArgumentException e)
        {
            e.printStackTrace();
        } catch (IllegalAccessException e)
        {
            e.printStackTrace();
        } catch (NoSuchMethodException e)
        {
            e.printStackTrace();
        } catch (InvocationTargetException e)
        {
            e.printStackTrace();
        }
    }

FunctionUtils.java

View Code
public class FunctionUtils
{
    /**
     * 將首字母變為大寫
     * 
     * @param str
     * @return
     */
    public static String upInitial(String str)
    {
        char[] chars = str.toCharArray();
        chars[0] = Character.toUpperCase(chars[0]);
        return new String(chars);
    }

    /**
     * 字段的數據類型
     * 
     * @param str
     * @return
     */
    public static Class<?> paraTypeClass(String str)
    {
        if (str.equals("java.lang.String"))
        {
            return java.lang.String.class;
        } else if (str.equals("java.lang.Integer"))
        {
            return java.lang.Integer.class;
        } else if (str.equals("java.lang.Character"))
        {
            return java.lang.Character.class;
        } else if (str.equals("java.lang.Double"))
        {
            return java.lang.Double.class;
        } else if (str.equals("java.lang.Short"))
        {
            return java.lang.Short.class;
        } else if (str.equals("java.lang.Byte"))
        {
            return java.lang.Byte.class;
        } else if (str.equals("java.lang.Float"))
        {
            return java.lang.Float.class;
        } else if (str.equals("java.lang.Boolean"))
        {
            return java.lang.Boolean.class;
        } else if (str.equals("java.util.Date"))
        {
            return java.util.Date.class;
        }
        return null;
    }

}

ConnectionDB.java

View Code
public class ConnectDB
{
    /** 數據庫用戶名 */
    private static String DB_uName = "root";

    /** 數據庫用戶密碼 */
    private static String DB_uPwd = "mysqladmin";

    /** 數據庫驅動 */
    private static String DB_Driver = "com.mysql.jdbc.Driver";

    /** 數據庫連接路徑 */
    private static String DB_Url = "jdbc:mysql://localhost:3306/Pluto";
    
    /**數據庫連接對象*/
    public static Connection conn = null;

    private ConnectDB()
    {

    }

    /**
     * 加載數據庫驅動
     */
    static
    {
        try
        {
            Class.forName(DB_Driver);
        } catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 連接數據庫,並返回數據庫連接對象
     * @return
     */
    public static Connection connToDB()
    {
        try
        {
                conn = DriverManager.getConnection(DB_Url, DB_uName, DB_uPwd);

        } catch (SQLException e)
        {
            e.printStackTrace();
        }

        return conn;
    }

    /**
     * 關閉數據庫,釋放資源
     * @param resultSet
     * @param statement
     * @param conn
     */
    public static void releaseDB(ResultSet resultSet, Statement statement,
            Connection conn)
    {

        try
        {
            if (resultSet != null)
            {
                resultSet.close();
            }
        } catch (SQLException e)
        {
            e.printStackTrace();
        } finally
        {
            try
            {
                if(statement != null)
                {
                    statement.close();
                }
            } catch (SQLException e)
            {
                e.printStackTrace();
            } finally
            {
                try
                {
                    conn.close();
                } catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

User.java

View Code
public class User
{
    /**用戶編號*/
    private Integer id;
    
    /** 用戶名 */
    private String name;

    /** 用戶密碼 */
    private String pwd;

    /** 用戶音樂盒子 */
    private String music_box;
    
    /**對應數據庫名稱*/
    public static String tableName = "user";
    
    /**數據對應的主鍵*/
    public static String primaryKey = "id";

    /**
     * get,set方法
     * @return
     */
    public String getName()
    {
        return name;
    }

    public Integer getId()
    {
        return id;
    }

    public void setId(Integer id)
    {
        this.id = id;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getPwd()
    {
        return pwd;
    }
    
    public void setPwd(String pwd)
    {
        this.pwd = pwd;
    }

    public String getMusic_box()
    {
        return music_box;
    }

    public void setMusic_box(String musicBox)
    {
        music_box = musicBox;
    }
}

ResultSetToObject.java

public class ResultSetToObject
{
	public static List<Object> turnToObject(ResultSet resultSet,
			Class<?> objClass)
	{
		/** 存儲轉化后的實體類 */
		List<Object> listObjs = new ArrayList<Object>();

		/** resultSet數據表中的字段名稱 */
		String[] columnNames = null;

		/** resultSet數據表中對應字段的數據類型 */
		String[] columnTypes = null;

		try
		{
			if (resultSet == null)
			{
				return listObjs;
			} else
			{
				ResultSetMetaData metaResult = resultSet.getMetaData();
				int length = metaResult.getColumnCount();
				columnNames = new String[length];
				columnTypes = new String[length];
				for (int i = 0; i < columnNames.length; i++)
				{
					columnNames[i] = metaResult.getColumnName(i + 1);
					columnTypes[i] = metaResult.getColumnClassName(i + 1);
				}

				while (resultSet.next())
				{
					try
					{
						//實例化實體類 
						Object obj = objClass.newInstance();

						//根據字段名調用實體類中的set方法 
						for (int j = 0; j < columnNames.length; j++)
						{
							Method method = objClass.getDeclaredMethod("set"
									+ FunctionUtils.upInitial(columnNames[j]),
									FunctionUtils.paraTypeClass(columnTypes[j]));
							method.invoke(obj, resultSet
									.getObject(columnNames[j]));
						}

						listObjs.add(obj);
					} catch (InstantiationException e)
					{
						e.printStackTrace();
					} catch (IllegalAccessException e)
					{
						e.printStackTrace();
					} catch (SecurityException e)
					{
						e.printStackTrace();
					} catch (NoSuchMethodException e)
					{
						e.printStackTrace();
					} catch (IllegalArgumentException e)
					{
						e.printStackTrace();
					} catch (InvocationTargetException e)
					{
						e.printStackTrace();
					}
				}
			}

			//關閉結果集 
			ConnectDB.releaseDB(resultSet, null, ConnectDB.conn);

		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		return listObjs;
	}
}

  

BaseOperatorDao.java

public class BaseOperatorDao 
{
	private static Statement statement = null;

	/**
	 * 使用Statement對象對數據操作
	 * 主要是查詢
	 * @param sql
	 * @return
	 */
	public static ResultSet selectData(String sql) 
	{
		ResultSet resultSet = null;
		try 
		{
			    Connection conn =  ConnectDB.connToDB();
				statement = conn.createStatement();
				resultSet = statement.executeQuery(sql);
				
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		return resultSet;
	}
	
	/**
	 * 使用Statement對象操作數據
	 * 主要針對數據的增刪改
	 * @param sql
	 * @return
	 */
	public static int delOrSaveOrUpdateData(String sql)
	{
		int resultRow = 0;
		try 
		{
			statement = ConnectDB.connToDB().createStatement();
			resultRow = statement.executeUpdate(sql);
			ConnectDB.releaseDB(null, statement, ConnectDB.conn);
			
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		return resultRow;
	}
}

  

********************************************************

以下是此用法的使用一些限制:

1,此方法不適合復合主鍵
2,實體類的屬性名稱必須要與數據的字段名一致
3,此方法的對應實體類必須有public static tableName ="XXX" //代表的對應的數據庫名
public static primaryKey = "XXX" //代表對應的主鍵名稱

4,由於我進行測試的時候使用的主鍵是“id”且自增長,所以如果不是則需要做一下修改。

本人聯系方式qq:982925115  , 郵箱:zhong678@yeah.net

 

 

 

 

 

 

 

 

 

 

 

 

 

               User user = new User();
        user.setId(22);
        user.setName("HHZoog");
        user.setPwd("OOOOOO");
        user.setMusic_box("12");
        
        HibernateDao.delete(user);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM