瞎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封装第二版之数据层的封装的更多相关文章
- angular开发中对请求数据层的封装
代码地址如下:http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项目 ...
- JDBC连接数据库方法的封装,以及查询数据方法的封装
(在上一篇文章中,我们详细的介绍了连接数据库的方法,以及eclipse操作数据库信息的相关方法,在这里我们将主要讲封装.) 主要内容: 一般的连接数据库测试 把连接数据库的方法封装成一个类和测试 一个 ...
- 瞎j8封装第二版之用xml文件来代理dao接口
也是重新整理了之前的那篇 模仿Mybatis用map per.xml实现Dao层接口的功能 话不多说直接上代码 首先是结构 依赖pom.xml <?xml version="1.0&q ...
- 瞎j8封装第二版之数据库连接池
写得很蛋疼,本来想支持多线程的,奈何对多线程和连接池理解着实太菜: 所以,起码是能拿到连接了... 但是还是不太懂这个连接池 我也是半抄别人的,以后再搞一搞这个吧. 先是配置文件 理想是很丰满的,奈何 ...
- python数据分析第二版:数据加载,存储和格式
一:读取数据的函数 1.读取csv文件 import numpy as np import pandas as pd data = pd.read_csv("C:\\Users\\Admin ...
- 计算器-- 利用re模块 利用函数封装 第二版
import re remove_parentheses = re.compile('\([^()]+\)') def Remove_Parentheses(obj, s): # 找到内层的括号并且返 ...
- 【类库】私房干货.Net数据层方法的封装
[类库]私房干货.Net数据层方法的封装 作者:白宁超 时间:2016年3月5日22:51:47 摘要:继上篇<Oracle手边常用70则脚本知识汇总>文章的发表,引起很多朋友关注.便促使 ...
- 手把手封装数据层之DButil数据库连接的封装
最近这段时间一直在用SSM框架做增删改查,突然想把以前还不会用框架的时候,综合百度和各种资料结合API文档抄袭而来的数据层的封装分享给大家.这边先封装一个DButil. 我这个封装就是烂大街的那种,没 ...
- 一只菜鸟的瞎J8封装系列的目录
因为这是一个系列...也就是我们所说的依赖关系.后面很多方法都是基于我前面封装的工具来进行的,所以我列一个目录供大家参考... 一只菜鸟的瞎J8封装系列 一.手把手封装数据层之DButil数据库连接 ...
随机推荐
- STM32F030如何正确配置IO口的复用功能
本文所使用的单片机型号为STM32F030C8T6. 在030系列的单片机中,PA2引脚除了作为普通的IO引脚用作输入输出功能以外,还可以作为内部外设串口1,串口2,定时器15通道1这三个外设的功能引 ...
- python3学习笔记(3)
一.内置函数补充1.callable()检测传递的参数是否可以被调用.def f1() pass可以被调用f2 = 123不可以被调用2.chr()和ord()chr()将ascii码转换成字符,or ...
- Science发表的超赞聚类算法
作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚类算法, 可以识别各种形状的类簇, 并且其超参数很容易确定. 算法思想 该算法的假设是类簇的中心由一些局部 ...
- csv格式订单下载,完成后伴随邮件通知下载
前言 功能开发中会遇到大量订单下载,而服务器的请求响应时间又配置的很短,导致下载时候请求超时. 这篇文章主要思路:异步查询数据,生成csv文件,放入email中并发送给用户.(异步部分本文不做介绍,配 ...
- 【Android开发学习笔记之一】5大布局方式详解
Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...
- 算法帖——用舞蹈链算法(Dancing Links)求解俄罗斯方块覆盖问题
问题的提出:如下图,用13块俄罗斯方块覆盖8*8的正方形.如何用计算机求解? 解决这类问题的方法不一而足,然而核心思想都是穷举法,不同的方法仅仅是对穷举法进行了优化 用13块不同形状的俄罗斯方块(每个 ...
- 日志的艺术(The art of logging)
程序员学习每一门语言都是从打印“hello world”开始的,日志也是新手程序员学习.调试程序的一大利器.当项目上线之后,也会有各种各样的日志,比如记录用户的行为.服务器的状态.异常情况等等.打印日 ...
- Python测试开发之函数
对于初学者而言,感觉函数还是不是很好理解,尤其是当写一个脚本,或者是写一个算法,认为可能for循环就已经可以解决的问题为什么还要用函数来实现呢? 今天就来说一下函数的优点,其实函数的最大优点就是可重用 ...
- ubuntu14.04 升级mysql到5.7版本
Ubuntu14.04默认安装的是mysql5.5,由于开发需要支持utf8mb4,因此需要升级到mysql5.7 默认情况下,apt是无法直接升级到mysql5.7的,因此需要额外设置 首先,备份数 ...
- JAVA-----基于POI实现对Excel导入
在日常项目开发中, 数据录入和导出是十分普遍的需求,因此,导入导出也成为了开发中一个经典的功能.数据导出的格式一般是excel或者pdf,而批量导入的信息一般是借助excel来减轻工作量,提高效率. ...