1. 对jdbc做一个简单的封装,select可以返回一个javabean对象,而不是resultset。主要用了反射。这是我之前写的代码,做了简单的修改。

  实现功能:a.对数据库的基本操作 增删改查

       b.对查询的单条记录返回一个指定类型的javabean对象,利用java反射,jdbc ResultSet类和ResultSetMetaData类

       c. 对查到的结果集返回一个List, 泛型

  数据源:用到的 数据库连接池是我自己简单实现的一个连接池:【java】简单实现数据库连接池,主要为了后续实现事务的简单实现

  用到的java知识 : 反射,泛型,jdbc

        

import com.yeyeck.noob.ConnectionPollImpl;
import com.yeyeck.noob.IConnectionPool;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 DBUtil {public static int excuteUpdate(String sql, Object... objects) {IConnectionPool connectionPool = ConnectionPollImpl.getInstance();Connection connection = connectionPool.getConnection();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) {IConnectionPool connectionPool = ConnectionPollImpl.getInstance();Connection connection = connectionPool.getConnection();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 | IllegalAccessException | InstantiationException| NoSuchFieldException | NoSuchMethodException | 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) {IConnectionPool connectionPool = ConnectionPollImpl.getInstance();Connection connection = connectionPool.getConnection();PreparedStatement preparedStatement = null;ResultSet resultSet = null;List<T> list = new ArrayList<>();try {preparedStatement = getStateMent(connection, sql, objects);resultSet = getResultSet(preparedStatement);while (resultSet.next()) {//调用 invokeObject方法,把一条记录封装成一个对象,添加到list中
                list.add(invokeObject(resultSet, clazz));}} catch (SQLException | IllegalAccessException | InstantiationException| NoSuchFieldException | NoSuchMethodException | InvocationTargetException e) {e.printStackTrace();}  finally {close(preparedStatement, resultSet);}return list.size() > 0 ? list : null;}private static void close(PreparedStatement preparedStatement, ResultSet resultSet) {try {if(resultSet != null) {resultSet.close();}if (preparedStatement != null) {preparedStatement.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 把数据库中的一条记录通过反射包装成相应的Bean* @param resultSet* @param clazz* @param <T>* @return* @throws IllegalAccessException* @throws InstantiationException* @throws SQLException* @throws NoSuchFieldException* @throws NoSuchMethodException* @throws InvocationTargetException*/private static <T> T invokeObject(ResultSet resultSet, Class<T> clazz) throws IllegalAccessException, InstantiationException,SQLException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {T object = clazz.getDeclaredConstructor().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);            //根据字段名获取fieldString 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 {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);}
}

其中用到的StringUtil的几个方法

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());}
}

测试

1.测试用到的表

 CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) DEFAULT NULL,`age` int(11) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |

初始数据

测试代码

import java.util.List;public class DBUtilTest {public static void main(String[] args) {List<User> users1 = DBUtil.queryForList("select * from t_user", User.class);System.out.println(users1);User user = new User();user.setUsername("刘能");user.setAge(12);String sql1 = "insert into `t_user`(username, age) values (?, ?)";System.out.println("insert 语句测试返回结果:" + DBUtil.excuteUpdate(sql1, user.getUsername(), user.getAge()));List<User> users2 = DBUtil.queryForList("select * from t_user", User.class);System.out.println(users2);String sql2 = "delete from t_user where id = ?";System.out.println("delete 语句测试返回结果:" + DBUtil.excuteUpdate(sql2, 3));String sql3 = "update t_user set age = ? where id = ?";System.out.println("update 语句测试返回结果:" + DBUtil.excuteUpdate(sql3, 100, 1));String sql4 = "select * from t_user where id = ?";User user2 = DBUtil.queryForObject(sql4, User.class, 2);System.out.println("select 语句测试返回结果: " + user2 );List<User> users3 = DBUtil.queryForList("select * from t_user", User.class);System.out.println(users3);}}

测试结果

[User{id=1, username='小明', age=100}, User{id=2, username='小红', age=15}, User{id=4, username='小二', age=12}, User{id=5, username='刘能', age=12}]
insert 语句测试返回结果:1
[User{id=1, username='小明', age=100}, User{id=2, username='小红', age=15}, User{id=4, username='小二', age=12}, User{id=5, username='刘能', age=12}, User{id=6, username='二蛋', age=99}]
delete 语句测试返回结果:1
update 语句测试返回结果:1
select 语句测试返回结果: User{id=2, username='小红', age=15}
[User{id=1, username='小明', age=20}, User{id=2, username='小红', age=15}, User{id=4, username='小二', age=12}, User{id=6, username='二蛋', age=99}]

数据库数据

【java】对jdbc操作结果简单的映射封装相关推荐

  1. Java使用Jdbc操作MySql数据库(一)

    这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...

  2. java完整JDBC操作数据库

    java使用JDBC操作数据库的包含以下7个主要步骤: 1.加载JDBC驱动程序 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的 ...

  3. Java注解初体验(简单ORM映射框架)

    2019独角兽企业重金招聘Python工程师标准>>> Java学了很久了,始终没有深入学习过注解反射这些高级特性,晚上花时间研究了一下,其实还挺有意思的,貌似也搞清楚了像Hiber ...

  4. Java通过JDBC操作Hive

    http://www.cnblogs.com/netbloomy/p/6688670.html 0.概述 使用的都是CLI或者hive –e的方式仅允许使用HiveQL执行查询.更新等操作.然而Hiv ...

  5. java和jdbc操作数据库MySQL

    大家初学java连接数据库一定遇到不少问题吧,我遇到这些问题也很头痛,所以我我把我初学jdbc连接数据库写的代码直接分享给大家.最后有完整代码可以直接复制运行 建表语句 CREATE TABLE `c ...

  6. java jdbc 操作_Java:JDBC操作

    内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如: DriverManager类 Connection接口 Statement接口 ResultSet接口 1.Clas ...

  7. jdba访问mysql_Java中JDBC操作数据库的步骤

    Java中JDBC操作数据库的步骤,今天给喜欢Java开发或者是想要参加Java培训学习的小伙伴们分享一些Java技能干货,那就是Java阐述jdba操作数据库的步骤,废话不多说了,随小编一起来看一下 ...

  8. idea如何给oracle添加数据_intelij idea下使用java和JDBC连接oracle数据库及简单的SQL操作...

    intelij idea下使用java和JDBC连接oracle数据库及简单的SQL操作 发布时间:2018-07-04 10:09, 浏览次数:2532 , 标签: intelij idea jav ...

  9. 【Java数据库】使用JDBC操作MySQL数据库、Batch批处理 、事务的概念

    MySQL 数据库的命令行操作 登陆操作mysql -hlocalhost –uroot –p123456 退出操作exit 数据库操作建库:create database 库名; 卸载库:drop ...

最新文章

  1. 钢结构节点输出软件_BIM助力桥梁钢结构设计施工一体化建设
  2. oracle-rman-list命令收集
  3. python django-forbidden-csrf-cookie-not-set问题
  4. mysql 全文检索 教程_MySQL:详细说明MySQL全文检索图文详细教程
  5. 删除或修改本地Git保存的账号密码
  6. 在WildFly和OpenShift上的WebSocket聊天
  7. kafka学习_Kafka 学习笔记01
  8. 图解ZooKeeper的典型应用场景(转载)
  9. GDI+中的图片处理类Image或Bitmap
  10. Rufus制作USB启动盘
  11. 【教程】安卓7.0-11.0高版本 fiddler抓包失败的解决方案
  12. Builder模式创建实体类
  13. 【Markdown简单语法练习】
  14. ffmpeg的使用笔记
  15. 网络传输大端序_大端 小端和网络字节序说明
  16. 第一天之导入Vuetify的坑
  17. win 10 hosts 文件位置
  18. DDR SDRAM原理介绍
  19. 精诚CRMPM系统应该要有哪些销售功能
  20. 扫地机器人扫水泥地板有用吗_哪位知道扫地机器人水泥地可以使用吗

热门文章

  1. oracle跨表空间报错ORA00942,解决oracle报错ora-00704 ora-00604 ora-00942 启动不了数据库...
  2. Android开发实战《手机安全卫士》——7.“高级工具”模块结尾 小火箭动画
  3. 在oracle中创建一个序列,Oracle(创建序列)
  4. php htaccess 伪静态,.htaccess伪静态实例分享
  5. JVM——成为Java GC专家(1)
  6. 如何投资建设智慧养殖场
  7. 应届生上培训班就能轻松找到好工作吗?
  8. 信号与系统学习笔记(1)
  9. MySQL数据库行级锁之行锁
  10. 过渡效果实战3:鼠标悬浮发生翻盖效果