看了以前写的代码,对就是下面这个

手把手封装数据层之DataUtil数据库操作的封装

觉得以前写的代码好烂啊!!!,重新理了一下思路,写得更规范和简练,应该效率也会高很多,用了一下下午写的连接池(半废品。。。)

瞎j8封装第二版之数据库连接池

下面直接上代码,代码很好理解,就是用了简单的反射,注解的部分我都写了注释

package jdbc;

import util.StringUtil;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class DataUtil {

    public static int excuteUpdate(String sql, Object... objects) {
        Connection connection = ConnectionPool.getInstance().getCurrentConnection();
        PreparedStatement preparedStatement = null;
        try {
            preparedStatement = getStateMent(connection, sql, objects);
            return preparedStatement.executeUpdate(); //执行sql并返回结果
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
        return 0;
    }

    /**
     * 查询单挑记录
     *
     * @param sql  查询语句
     * @param clazz 返回对象的class
     * @param objects 需要的参数,必须跟sql占位符的位置一一对应
     * @param <T>   泛型返回
     * @return      返回单个对象
     */
    public static <T> T queryForObject(String sql, Class<T> clazz, Object... objects) {
        Connection connection = ConnectionPool.getInstance().getCurrentConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        T object = null;
        try {
            preparedStatement = getStateMent(connection, sql, objects);
            resultSet = getResultSet(preparedStatement);
            if (resultSet.next()) {
                object = invokeObject(resultSet, clazz);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } finally {
            close(preparedStatement, resultSet); //记得关闭
        }
        return object;
    }

    /**
     *查询多条记录
     *
     * @param sql  查询语句
     * @param clazz 返回对象的class
     * @param objects 需要的参数,必须跟sql占位符的位置一一对应
     * @param <T>   泛型返回
     *
     * @return list
     */
    public static <T> List<T> queryForList(String sql, Class<T> clazz, Object... objects) {
        Connection connection = ConnectionPool.getInstance().getCurrentConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<T> list = new ArrayList<T>();
        try {
            preparedStatement = getStateMent(connection, sql, objects);
            resultSet = getResultSet(preparedStatement);
            while (resultSet.next()) {
                list.add(invokeObject(resultSet, clazz));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } finally {
            close(preparedStatement, resultSet);
        }

        return list.size() > 0 ? list : null;

    }

    private static void close(PreparedStatement preparedStatement, ResultSet resultSet) {
        try {
            if (preparedStatement != null) {
                preparedStatement.close();
                resultSet.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static <T> T invokeObject(ResultSet resultSet, Class<T> clazz) throws IllegalAccessException, InstantiationException,
            SQLException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
        T object = clazz.newInstance();
        ResultSetMetaData metaData = resultSet.getMetaData();
        for (int i = 0, count = metaData.getColumnCount(); i < count; i++) {
            String columnName = metaData.getColumnName(i + 1);     //数据库返回结果的列名
            String fieldName = StringUtil.camelName(columnName); //去掉列名中的下划线“_”并转为驼峰命名
            Field field = clazz.getDeclaredField(fieldName);            //根据字段名获取field
            String methName = setMethodName(fieldName);         //拼set方法名
            Class type = field.getType();                       //获取字段类型
            Method setMethod = clazz.getDeclaredMethod(methName, field.getType());
            Object value = resultSet.getObject(i + 1);            //获取字段值
            setMethod.invoke(object, type.cast(value));       //强转并且赋值
        }
        return object;
    }

    private static PreparedStatement getStateMent(Connection connection, String sql, Object... objects) throws SQLException {
        if (connection == null) {
            return null;
        }
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        for (int i = 0, len = objects.length; i < len; i++) {
            preparedStatement.setObject(i + 1, objects[i]);  //给sql每个?占位符填上数据
        }
        return preparedStatement;
    }

    private static ResultSet getResultSet(PreparedStatement statement) throws SQLException {
        if (statement == null) {
            return null;
        } else {
            return statement.executeQuery();
        }
    }

    private static String setMethodName(String str) {
        return "set" + StringUtil.firstUpperCase(str);
    }

}

用到了几个简单的字符串处理方法

package util;

public class StringUtil {

    /**
     * 转为驼峰命名
     * @param str
     * @return string
     */
    public static String camelName(String str) {
        if (!isEmpty(str)) {
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0, len = str.length(); i < len; i++) {
                if (str.charAt(i) == '_') {
                    while (str.charAt(i + 1) == '_') {
                        i++;
                    }
                    stringBuilder.append(("" + str.charAt(++i)).toUpperCase());
                } else {
                    stringBuilder.append(str.charAt(i));
                }
            }
            return stringBuilder.toString();
        }
        return str;
    }

    /**
     * 判断是否为空串
     *
     * @param str
     * @return
     */
    public static boolean isBlank(String str) {
        if (str != null && str.length() > 0) {
            for (int i = 0, len = str.length(); i < len; i++) {
                if (!Character.isSpaceChar(str.charAt(i))) {
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * 判断是否为空串 ?!!! 我怎么又写了个一样的方法?!!!
     * @param str
     * @return
     */
    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }

    /**
     * 将第一个字母替换为大写
     * @param str
     * @return
     */
    public static String firstUpperCase(String str) {
        return str.substring(0, 1).toUpperCase() + str.substring(1, str.length());
    }

}

下面开始是测试了

首先数据库

然后测试类,跟表结构对应的

package po;

import java.util.Date;

public class User {

    private Integer id;
    private Integer age;
    private String name;
    private Double score;
    private Date createTime;
    private Date updateTime;

   //set、get 方法均省略了,但是这个是必须的
}

测试代码

import java.util.List;

public class Test {

    public static void main(String[] args) {
        String sql = "select * from t_user";
        List<User> list = DataUtil.queryForList(sql,User.class);
        System.out.println("查询多条记录:" + list);
        System.out.println("******************************************************************");

        sql = "select * from t_user where id = ?";
        User user = DataUtil.queryForObject(sql,User.class,1);
        System.out.println("查询单条记录:" + user);
        System.out.println("******************************************************************");

        sql = "insert into t_user(name,score,create_time,update_time) values(?,?,now(),now())";
        int t = DataUtil.excuteUpdate(sql,"大牛",66.66);
        System.out.println("执行插入操作结果:"+t);

    }
}

测试结果

太晚了,先到这了,有空把我的mybatis和ioc容器也瞎j8重写一下

转载请注明出处:

大王让我写代码   00:12:24

瞎j8封装第二版之数据层的封装的更多相关文章

  1. angular开发中对请求数据层的封装

    代码地址如下:http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项目 ...

  2. JDBC连接数据库方法的封装,以及查询数据方法的封装

    (在上一篇文章中,我们详细的介绍了连接数据库的方法,以及eclipse操作数据库信息的相关方法,在这里我们将主要讲封装.) 主要内容: 一般的连接数据库测试 把连接数据库的方法封装成一个类和测试 一个 ...

  3. 瞎j8封装第二版之用xml文件来代理dao接口

    也是重新整理了之前的那篇 模仿Mybatis用map per.xml实现Dao层接口的功能 话不多说直接上代码 首先是结构 依赖pom.xml <?xml version="1.0&q ...

  4. 瞎j8封装第二版之数据库连接池

    写得很蛋疼,本来想支持多线程的,奈何对多线程和连接池理解着实太菜: 所以,起码是能拿到连接了... 但是还是不太懂这个连接池 我也是半抄别人的,以后再搞一搞这个吧. 先是配置文件 理想是很丰满的,奈何 ...

  5. python数据分析第二版:数据加载,存储和格式

    一:读取数据的函数 1.读取csv文件 import numpy as np import pandas as pd data = pd.read_csv("C:\\Users\\Admin ...

  6. 计算器-- 利用re模块 利用函数封装 第二版

    import re remove_parentheses = re.compile('\([^()]+\)') def Remove_Parentheses(obj, s): # 找到内层的括号并且返 ...

  7. 【类库】私房干货.Net数据层方法的封装

    [类库]私房干货.Net数据层方法的封装 作者:白宁超 时间:2016年3月5日22:51:47 摘要:继上篇<Oracle手边常用70则脚本知识汇总>文章的发表,引起很多朋友关注.便促使 ...

  8. 手把手封装数据层之DButil数据库连接的封装

    最近这段时间一直在用SSM框架做增删改查,突然想把以前还不会用框架的时候,综合百度和各种资料结合API文档抄袭而来的数据层的封装分享给大家.这边先封装一个DButil. 我这个封装就是烂大街的那种,没 ...

  9. 一只菜鸟的瞎J8封装系列的目录

    因为这是一个系列...也就是我们所说的依赖关系.后面很多方法都是基于我前面封装的工具来进行的,所以我列一个目录供大家参考... 一只菜鸟的瞎J8封装系列  一.手把手封装数据层之DButil数据库连接 ...

随机推荐

  1. Java IO(1)基础知识——字节与字符

    正所谓怕什么来什么,这是知名的“墨菲定律”.Java基础涵盖各个方面,敢说Java基础扎实的人不是刚毕业的学生,就是工作N年的程序员.工作N年的程序员甚至也不敢人人都说Java基础扎实,甚至精通,往往 ...

  2. 一个Win32API Trace Tool的设计与实现

    用VC编程也有不短的时间了,对kernel32.advapi32.user32.gdi32等动态库里的API多数都已经很熟悉了.API是操作系统提供给应用程序的一组服务,很久以前就想要做个小工具,用来 ...

  3. Docker技术浅谈:私有化部署的优势以及在顶象内部的应用实践

    顶象全景式业务安全风控体系基于新一代风控体系构建,并采用Docker技术进行私有云和公有云部署.本文主要和大家分享下Docker容器技术和顶象风控系统私有化部署的优势以及Docker容器技术在顶象内部 ...

  4. 乐呵乐呵得了 golang入坑系列

    开场就有料,今天返回去看了看以前的文章,轻松指数有点下降趋势.一琢磨,这不是我的风格呀.一反思,合着是这段时间,脑子里杂七杂八的杂事有点多,事情一多,就忘了快乐.古话说得好:愁也一天,乐也一天,只要还 ...

  5. 关于Unity里动态加载图片

    Resources.Load 使用该方法可以动态加载资源 过程: 1.首先需要在Project面板里创建一个名为Resources的文件夹(名字必须是这个 不能写错啊) 2.把要加载的游戏对象放到该目 ...

  6. Wannafly挑战赛3 record

    B 遇见 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 65536K,其他语言131072K64bit IO Format: %lld题目描述A和B在同一条路上,他们之间的距离为 k ...

  7. 使用tail命令实时查看日志文件

    [Shell] 纯文本查看 复制代码 ? 1 tail -f /日志文件 好了.就这样用.简单吧    退出ctrl+C

  8. Linux磁盘分区(一):添加

    ***********************************************声明************************************************ 原创 ...

  9. javaScript 验证码 倒计时60秒

    <input type="button" id="btn" value="免费获取验证码" /> <script type ...

  10. java使用普通算法实现99乘法表,使用递归实现99乘法表

    public class recursionTest { public static void main(String[] args) { //jiujiu(); m(9); } /* * for循环 ...