网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 955|回复: 0
打印 上一主题 下一主题

模拟mybatis实现sql的解析

[复制链接]

97

主题

98

帖子

447

积分

版主

Rank: 7Rank: 7Rank: 7

积分
447
跳转到指定楼层
楼主
发表于 2020-7-12 21:24:02 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
1、通过传入预执行sql和封装好的model,解析sql,实现类似mybatis的半自动化功能
2、代码:
public static boolean updateSql(String sql, Object value) {
        //解析#{xxx}字符串,其中xxx是JavaBean的字段,实现思路是解析里面的属性,通过反射获取value中的值

        int start = sql.indexOf("#{");
        int end = sql.indexOf("}");
        List<Object> vals = new ArrayList<Object>();
        while (start >-1 && end > start) {
            //#{userName} - ? #{userPw}
            //userName -> getUserName
            String wholeProp = sql.substring(start, end+1);
            String subProp = wholeProp.substring(2, wholeProp.length()-1);
            sql = sql.replace(wholeProp, " ? ");
            String methodName = "get" + subProp.substring(0,1).toUpperCase() + subProp.substring(1);
            Method method = null;
            try {
                method = value.getClass().getDeclaredMethod(methodName);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                vals.add(method.invoke(value));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            start = sql.indexOf("#{");
            end = sql.indexOf("}");
                    
        }
        Connection conn = DbUtils.getConnection();
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0 ; i < vals.size(); i++) {
                ps.setObject(i+1, vals.get(i));
            }
            ps.execute();
            return true;
        } catch (SQLException e) {
            return false;
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                }
            }
        }
    }
3、测试代码:
String sql = " update news set "
                + " title = #{title},"
                + " info = #{info} "
                + " where id = #{id}";
Object obj = DaoUtils.initEntity(News.class, request);
boolean result = DaoUtils.updateSql(sql, obj);


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2025-1-3 09:45 , Processed in 0.032505 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表