反射實現數據庫增刪改查DAO及DAOImpl源代碼(一)


這是DAO層,第一次嘗試,如有bug希望能即使反饋,我們共同進步。具體的用法和實現原理我會在前面幾篇博客中補充更新。配置文件及項目目錄結構會在下一篇中貼出!

package com.javasm.supermarket.dao;

import java.util.List;
import java.util.Map;

public interface DAO {
	// 增加
	void addObject(Object o);
	// 刪除
//	void deleteObject(Object o);
	// 修改
	void updateObject(Object o);
	/**
	 * 查詢,可實現多查詢或單一查詢
	 * @param params
	 * @param tableName
	 * @return
	 */
	List<?> queryObject();
	
	void deleteObject();
}

DAOImpl層源碼

package com.javasm.supermarket.impl;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import com.javasm.supermarket.dao.DAO;
import com.javasm.supermarket.db.DBConnection;

public class DAOImpl implements DAO {
	private static Properties objectConfigPath = new Properties();
	private static Properties objectConfig = new Properties();
	private static String className;
	private static Class<?> objectClass;
	private static Field[] fields;
	private static String tableName;
	private static String queryBuilder;
	private static String deleteBuilder;
	/**
	 * 
	 * 加載配置文件,從配置文件中獲取bean和bean對應的表明
	 * 
	 */
	static {
		try {
			DAOImpl.class.getClassLoader();
			InputStream objectConfigPathInputStream = ClassLoader
					.getSystemResourceAsStream("objectConfigPath.properties");
			objectConfigPath.load(objectConfigPathInputStream);
			InputStream objectConfigInputStream = ClassLoader
					.getSystemResourceAsStream(objectConfigPath
							.getProperty("objectConfigPath"));
			objectConfig.load(objectConfigInputStream);
			className = objectConfig.getProperty("className");
			tableName = objectConfig.getProperty("tableName");
			queryBuilder = objectConfig.getProperty("queryBuilder");
			deleteBuilder = objectConfig.getProperty("deleteBuilder");

			objectClass = Class.forName(className);
			fields = objectClass.getDeclaredFields();

		} catch (IOException | ClassNotFoundException e) {
			e.printStackTrace();
			System.err.println("配置文件加載失敗!");
		}
	}

	/**
	 * 插入數據
	 */
	@Override
	public void addObject(Object object) {
		StringBuilder sql = new StringBuilder("INSERT " + tableName
				+ " VALUES(");
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		// 用於存放傳入的對象的參數,默認將id值(主鍵)的key設為0,方便條件設置
		Map<Integer, Object> fieldsValues = new HashMap<Integer, Object>();
		try {
			for (int i = 0; i < fields.length; i++) {
				fields[i].setAccessible(true);
				fieldsValues.put(i, fields[i].get(object));
				sql.append("?");
				if (i < (fields.length - 1))
					sql.append(", ");

			}
			sql.append(")");
			connection = DBConnection.getConnection();

			preparedStatement = connection.prepareStatement(sql.toString());
			Class<?> fieldClass = null;
			for (int i = 1; i <= fieldsValues.size(); i++) {
				/**
				 * 獲取存入map中對象的參數的類類型,根據類類型選擇preparedStatement的set方法
				 */
				if (fieldsValues.get(i - 1) != null) {
					fieldClass = fieldsValues.get(i - 1).getClass();
					// 如果類類型為String.class,則執行setString
					if (fieldClass.equals(String.class)) {
						preparedStatement.setString(i,
								(String) fieldsValues.get(i - 1));
					}
					// 如果類類型為Float.class,則執行setString
					if (fieldClass.equals(Float.class)) {
						preparedStatement.setFloat(i,
								(Float) fieldsValues.get(i - 1));
					}
					// 如果類類型為Integer.class,則執行setString
					if (fieldClass.equals(Integer.class)) {
						preparedStatement.setInt(i,
								(Integer) fieldsValues.get(i - 1));
					}
					// 如果類類型為Timestamp.class,則執行setString
					if (fieldClass.equals(Timestamp.class)) {
						preparedStatement.setTimestamp(i, new Timestamp(
								((Date) fieldsValues.get(i - 1)).getTime()));
					}

				} else {
					preparedStatement.setObject(i, null);
				}

			}
			// 執行sql語句,返回更新參數
			int columnsCount = preparedStatement.executeUpdate();
			System.out.println("有" + columnsCount + "條數據被更新!");

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(connection, preparedStatement, null);
		}

	}

	/**
	 * 
	 * 刪除數據,條件列表為空時刪除所有數據
	 */
	@Override
	public void deleteObject() {
		StringBuilder sql = new StringBuilder(
				"DELETE FROM order_info WHERE 1=1 ");
		List<Map<String, Object>> params = builder(deleteBuilder);
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		try {
			connection = DBConnection.getConnection();
			if (params != null && params.size() > 0) {
				for (int i = 0; i < params.size(); i++) {
					Map<String, Object> map = params.get(i);
					sql.append(" AND  " + map.get("name") + " "
							+ map.get("rela") + " " + map.get("value") + " ");
				}
			}
			connection = DBConnection.getConnection();
			preparedStatement = connection.prepareStatement(sql.toString());
			preparedStatement.executeLargeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("刪除失敗!");
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(connection, preparedStatement, null);
		}

	}

	/**
	 * 
	 * 修改數據
	 * 
	 */
	@Override
	public void updateObject(Object object) {
		StringBuilder sql = new StringBuilder("UPDATE " + tableName + " SET ");
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		// 用於存放傳入的對象的參數,默認將id值(主鍵)的key設為0,方便條件設置
		Map<Integer, Object> fieldsValues = new HashMap<Integer, Object>();
		try {
			for (int i = 0; i < fields.length; i++) {
				fields[i].setAccessible(true);

				if (i == 0) {
					fieldsValues.put(fields.length - 1, fields[i].get(object));
					continue;
				}
				sql.append(fields[i].getName());
				sql.append("=?");
				fieldsValues.put(i - 1, fields[i].get(object));
				if (i < (fields.length - 1))
					sql.append(", ");
				if (i == (fields.length - 1)) {
					sql.append(" WHERE ");
					sql.append(fields[0].getName());
					sql.append("=?");
				}

			}
			connection = DBConnection.getConnection();

			preparedStatement = connection.prepareStatement(sql.toString());
			Class<?> fieldClass = null;
			for (int i = 1; i <= fieldsValues.size(); i++) {
				/**
				 * 獲取存入map中對象的參數的類類型,根據類類型選擇preparedStatement的set方法
				 */
				fieldClass = fieldsValues.get(i - 1).getClass();
				// 如果類類型為String.class,則執行setString
				if (fieldClass.equals(String.class)) {
					preparedStatement.setString(i,
							(String) fieldsValues.get(i - 1));
				}
				// 如果類類型為Float.class,則執行setString
				if (fieldClass.equals(Float.class)) {
					preparedStatement.setFloat(i,
							(Float) fieldsValues.get(i - 1));
				}
				// 如果類類型為Integer.class,則執行setString
				if (fieldClass.equals(Integer.class)) {
					preparedStatement.setInt(i,
							(Integer) fieldsValues.get(i - 1));
				}
				// 如果類類型為Timestamp.class,則執行setString
				if (fieldClass.equals(Timestamp.class)) {
					preparedStatement.setTimestamp(i, new Timestamp(
							((Date) fieldsValues.get(i - 1)).getTime()));
				}

			}
			// 執行sql語句,返回更新參數
			int columnsCount = preparedStatement.executeUpdate();
			System.out.println("有" + columnsCount + "條數據被更新!");

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(connection, preparedStatement, null);
		}

	}

	/**
	 * 
	 * 數據查詢,查詢條件列表為空時查詢所有數據
	 * 
	 */
	@Override
	public List<?> queryObject() {
		List<Map<String, Object>> params = builder(queryBuilder);
		List<Object> objectList = new ArrayList<Object>();
		StringBuilder sql = new StringBuilder("SELECT * FROM " + tableName
				+ " WHERE 1=1");
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;

		try {
			connection = DBConnection.getConnection();
			if (params != null && params.size() > 0) {
				for (int i = 0; i < params.size(); i++) {
					Map<String, Object> map = params.get(i);
					sql.append(" AND  " + map.get("name") + " "
							+ map.get("rela") + " " + map.get("value") + " ");
				}
			}
			preparedStatement = connection.prepareStatement(sql.toString());

			resultSet = preparedStatement.executeQuery();
			ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
			// 獲取數據列數
			int columnsCount = resultSetMetaData.getColumnCount();
			Field field = null;
			Object object = null;
			while (resultSet.next()) {
				/**
				 * 獲取實例化對象
				 */
				object = objectClass.newInstance();

				String columnName = null;
				String columnTypeName = null;
				String columnValue = null;

				for (int i = 1; i <= columnsCount; i++) {
					columnName = resultSetMetaData.getColumnName(i);
					columnTypeName = resultSetMetaData.getColumnTypeName(i);
					columnValue = resultSet.getString(i);
					field = object.getClass().getDeclaredField(columnName);
					field.setAccessible(true);
					switch (columnTypeName) {
					case "INT":
						field.set(object, Integer.parseInt(columnValue));
						break;
					case "TINYINT":
						field.set(object, Integer.parseInt(columnValue));
						break;
					case "VARCHAR":
						field.set(object, columnValue);
						break;
					case "FLOAT":
						field.set(object, Float.parseFloat(columnValue));
						break;
					case "DATETIME":
						SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
								"yyyy-MM-dd HH:mm:ss");
						field.set(object, simpleDateFormat.parse(columnValue));
						break;
					}

				}
				objectList.add(object);

			}

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(connection, preparedStatement, resultSet);
		}
		return objectList;
	}

	/**
	 * 從配置文件中提取刪除或查詢條件,如果傳入的builder為null,則返回空列表
	 * 
	 * @param builder
	 * @return
	 */
	private List<Map<String, Object>> builder(String builder) {
		List<Map<String, Object>> paramList = new ArrayList<Map<String, Object>>();
		if (builder.equals("null")) {
			paramList = null;
		} else {
			Map<String, Object> param = null;
			String[] values = null;
			System.out.println(builder.contains(";"));
			if (builder.contains(";")) {
				String[] mapValue = builder.split(";");
				for (String string : mapValue) {
					values = string.split(",");
					param = new HashMap<String, Object>();
					param.put("name", values[0]);
					param.put("rela", values[1]);
					param.put("value", values[2]);
					paramList.add(param);
				}
			} else {
				values = builder.split(",");
				param = new HashMap<String, Object>();
				param.put("name", values[0]);
				param.put("rela", values[1]);
				param.put("value", values[2]);
				paramList.add(param);
			}
		}
		return paramList;
	}

}



免責聲明!

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



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