3、自己手写ORM框架之执行SQL语句

首先定义一个类去获取对象你的属性及其值

ObjectFields.java
package com.framework.betterorm.reflection;

import com.framework.betterorm.test.User;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class ObjectFields {
    private ObjectFields() {

    }

    /**
     * 获取属性名数组
     */
    public static String[] getFiledName(Object o) {
        Field[] fields = o.getClass().getDeclaredFields();
        String[] fieldNames = new String[fields.length];
        for (int i = 0; i < fields.length; i++) {
            fieldNames[i] = fields[i].getName();
        }
        return fieldNames;
    }

    /**
     * 根据属性名获取属性值
     */
    private static Object getFieldValueByName(String fieldName, Object o) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = o.getClass().getMethod(getter);
            o = method.invoke(o);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return o;
    }

    public static void setFieldValue(Object object, Map<String, Object> value) {
        try {

            Class clazz = object.getClass();
            String[] filedName= getFiledName(object);
            for (String str :filedName) {
                PropertyDescriptor pd = new PropertyDescriptor(str, clazz);
                Method setMethod = pd.getWriteMethod();
                if (setMethod != null) {
                    setMethod.invoke(object, value.get(str));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static Map<String, Object> getFieldValuesMap(Object o) {
        String[] fieldName = getFiledName(o);
        Map<String, Object> fieldValueMap = new HashMap<>();

        for (String str : fieldName) {
            fieldValueMap.put(str, getFieldValueByName(str, o));
        }
        return fieldValueMap;
    }

    public static void main(String[] args) {
        User user = new User("test", "test");
        System.out.println(getFieldValuesMap(user));
    }
}

在AbstractDataBaseOperationFactory类中定义两个方法分别去实现数据库查询与更新操作

代码如下

@Override
    public int update(String sql, Object object) {
        String sqlStr=sql;
        System.out.println("将要执行update方法");
        int colum = 0;
        //获取连接
        DataBaseManager.getDataBaseConnect();

        PreparedStatement preparedStatement;
        try {
            //设置事务为非自动提交
            conn.setAutoCommit(autoCommit);
            //去除特殊标记
            sql = PropertyParser.parse(sql);
            //获取参数列表
            List<String> parameter = PropertyParser.getParameter(sqlStr);
            //准备数据库操作对象
            preparedStatement = conn.prepareStatement(sql);
            int i = 1;
            //获取object对象属性值
            Map<String, Object> fieldValuesMap = ObjectFields.getFieldValuesMap(object);
            for (String str : parameter) {
                preparedStatement.setObject(i, fieldValuesMap.get(str));
                i++;
            }
            colum = preparedStatement.executeUpdate();
            commit(conn);
            preparedStatement.close();


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

        }

        return colum;
    }

    @Override
    public Object select(String sql, Object object) {
        String sqlStr=sql;
        System.out.println("将要执行select方法");

        DataBaseManager.getDataBaseConnect();
        PreparedStatement preparedStatement;

        try {
            conn.setAutoCommit(autoCommit);

            sql = PropertyParser.parse(sql);
            List<String> parameter = PropertyParser.getParameter(sqlStr);
            preparedStatement = conn.prepareStatement(sql);

            int i = 1;
            Map<String, Object> fieldValuesMap = ObjectFields.getFieldValuesMap(object);
            for (String str : parameter) {
                preparedStatement.setObject(i, fieldValuesMap.get(str));
                i++;
            }

            i=0;

            ResultSet resultSet = preparedStatement.executeQuery();

            String[] fieldNames = ObjectFields.getFiledName(object);
            Map<String, Object> valuesMap = new HashMap<>();
            //给对象属性赋值
            while (resultSet.next()) {
                valuesMap.put(fieldNames[i], resultSet.getObject(fieldNames[i]));
                valuesMap.put(fieldNames[i+1],resultSet.getObject(fieldNames[i+1]));
                i++;
            }

            ObjectFields.setFieldValue(object, valuesMap);
            preparedStatement.close();
        } catch (SQLException e) {
            rollback(conn);
            e.printStackTrace();
        }
        return object;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值