如今框架横行,很多人用的得心应手,可是很多人都没有了解过底层的东西,导致往后去学习别的框架的时候就不会那么顺利。就比如我们平时在写代码时,都会用MyBatis或者JPA,但是你了解过他们是怎么匹配字段的吗?如果突然不让使用框架,你还能那么轻松的写出来吗。
在原生JDBC的场景下,我们如何将查询的字段自动封装到对象中呢?就是通过Java的反射实现,这是一个很实用的技术。我们看一下下面的代码
这是一个数据库表对应的类,其中使用有驼峰命名

@Data
@TableName("t_admin")
public class Admin implements Serializable {@TableId("username")private String username;//用户名private String nickName;//用户昵称private String password;//用户密码private String email;//用户邮箱private String avatar;//用户头像private String qq;private String weChat;private String weChatQrCode;//微信收款码private String authorImage;//管理员主页图private String alipayQrCode;//管理员主页图private String weChatCode;//微信二维码private Integer type;//用户类型
}

对于这样一个类或者数据库,我们当然没有感觉它有多繁琐,可是当不同的类和数据表,或者表很多表或者类时,那将会怎么样呢?是不是觉得不好写,而且不容易维护,一旦程序出现变动,整个映射都需要重新更改。那么我们来看一下如何通过反射实现字段映射封装。

//可以封装起来,传入class或者对象
Admin admin;try {//这里可以通过反射创建admin = new Admin();String regex = "[A-Z]";//匹配驼峰规则Class.forName("com.mysql.cj.jdbc.Driver");Connection conn = DriverManager.getConnection(url, root, passwd);PreparedStatement ps = conn.prepareStatement("select * from t_admin where username = ? and password = ?");ps.setString(1, username);ps.setString(2, MyConfig.md5Code(password));ResultSet rs = ps.executeQuery();Class<? extends Admin> aClass = admin.getClass();Field[] fields = aClass.getDeclaredFields();//获得class中的属性StringBuilder sb = new StringBuilder();while (rs.next()) {//替换驼峰字符for (int i = 0; i < fields.length; i++) {for (int j = 0; j < fields[i].getName().length(); j++) {char ch = fields[i].getName().charAt(j);if ((ch + "").matches(regex)) {sb.append("_" + (ch + "").toLowerCase());} else {sb.append(ch);}}//破坏私有属性fields[i].setAccessible(true);//这里可以根据字段进行判断,因为数据库字段是string和integer,所以只判断两个类//这句代码的意思是判断两个类型是否是一个类型,可以根据自己的数据库进行编写(注意原始数据类型即可)boolean b = String.class.isAssignableFrom(fields[i].getType());if (b) {fields[i].set(admin, rs.getString(sb.toString()));} else {fields[i].set(admin, rs.getInt(sb.toString()));}//重置sb(StringBuilder线程不安全,如果在多线程下请使用StringBuffer)sb.setLength(0);}}rs.close();ps.close();conn.close();System.out.println(admin);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} catch (IllegalAccessException e) {throw new RuntimeException(e);}

注意需要导入mysql驱动

是不是觉得很简单

Java实现自动映射原生JDBC查询出的数据库字段相关推荐

  1. SprigData-JPA之Query进行复杂查询并映射到自定对象(非数据库字段用@Transient注解)

    场景介绍 有时候用JPA的时候,想拥有mybatis如此轻松的映射,将一堆复杂场景的sql语句映射到一个java类来返回.而JPA本身是很坑的,Query之支持简单查询,复杂查询需要去构造Specif ...

  2. mybatis多条件查询处理方案(查询条件为数据库字段非传递参数)

    问题说明     关于多条件查询,大部分遇到的场景是根据传递参数的不同查询符合参数字段的数据信息.mybatis中使用频率最高的是if标签.但if标签中的test属性只支持传递参数进行判断是否相等,不 ...

  3. java 带横杠或下划线_的数据库字段变驼峰,比如ID_CARD_INFO_TITLE转换成idCardInfoTitle

    有个需求需要将数据库字段转换成驼峰字段,在网上找了一会这方面的工具, 写代码嘛,有现成的最好,但发现都写的乱七八糟, 有的各种引用工具类,有的是正则匹配来匹配去最后给出的结果还不对. 于是自己写了一个 ...

  4. mysql ip地址查询 优化_mysql数据库字段(ip地址,时间)优化

    ip的存储不要用char型 用mysql函数 inet_aton 转换成int型存储,select的时候 inet_ntoa(ip) 转义出来 时间不要用char 而是用 int 时间戳的形式,uni ...

  5. 使用 JPQL 和原生 SQL 查询 JPA 实体(转)

    使用 JPQL 和原生 SQL 查询 JPA 实体(转) 博客分类: EJB3.JPA及其相关 SQL JPA 企业应用 数据结构 C#  作者:Yuli Vasiliev 了解如何利用 Java 持 ...

  6. java.sql.Types,数据库字段类型,java数据类型的对应关系

    原文地址为: java.sql.Types,数据库字段类型,java数据类型的对应关系 以下转自:http://kummy.itpub.net/post/17165/172850 本文在原文基础上有增 ...

  7. JDBC连接自定义sqlserver数据库实例名(多个实例)

    JDBC连接自定义sqlserver数据库实例名(多个实例) 2012年06月07日 12:14:48 阅读数:18097 java语言中,通过jdbc访问sqlserver2005(2008)数据库 ...

  8. 双表查询java代码_什么是JDBC?Java数据库连接性简介

    JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...

  9. 使用java反射写一个通用的jdbc查询

    在后端开发中,我们经常和数据库打交道.从最开始的使用jdbc进化到框架(mybatis)我们的开发效率提升了很多,但是不知道你没有思考过框架是如何在日常的开发中帮助我们的? 在我之前的博客中,讨论过 ...

  10. 用java查询excel表格_如何把java查询出的内容导入到excel表格

    展开全部 java查询出的内容导入到excel表格 /**导出数据为XLS格式 * @param fos * @param bo */ public void writeExcelBo(FileOut ...

最新文章

  1. 打造线下版元宇宙!机器人VR助力远程做核酸,登上Science子刊
  2. 第一范式、第二范式、第三范式
  3. python3 实现 php bin2hex 函数
  4. 简述泛型的上界和下界?
  5. python如何调用文件进行换位加密_python 换位密码算法的实例详解
  6. 健康管理-健康管理特点
  7. 接待顾客接待久了,发现大家讨价还价的方式基本三种
  8. extjs2.0 ie8 下拉树_extjs2下拉树选项框comboxWithTree(支持异步加载子节点)
  9. 在Mac电脑上如何将TXT文本转成PDF?
  10. 计算机网络面试需要掌握的知识点汇总
  11. wi7计算机桌面删除,如何删除win7系统桌面IE图标|win7删除桌面IE图标的方法
  12. 【发布】哔哩哔哩bilibili替换旧版播放(稍后再看)
  13. vue element上传额外参数
  14. iptables结合ipset禁止国外IP进行访问
  15. BottomBarLayout——方便快捷地实现底部导航栏
  16. 【单片机笔记】运放电流检测实用电路
  17. 王者的荣耀--Monza后记
  18. 贷款买二手房 这4笔钱你都准备好了么?
  19. 把Apple ID 账号改成QQ邮箱教程
  20. Hive中的四种排序

热门文章

  1. java 仓库管理_Java仓库管理系统(一)
  2. 蓝宝石rx470d原版bios_小白福利教程:关于显卡BIOS的一些信息的讲解
  3. html表单验证元素必填,JavaScript 表单验证
  4. 20个经典模拟电路(详细图文)
  5. ascll编码表图片_ASCLL编码表
  6. 用计算机关闭无线网络连接,我的DELL笔记本电脑无线网络已关闭,怎么进行再连接?...
  7. 计算机专业考研入坑详解(持续更新)
  8. 【Tomcat优化篇】如何让你的Tomcat性能更加优越
  9. (转)【JSON工具】一个JSON格式化查看工具——HIJSON
  10. html登录页面验证码代码怎么写,js实现登录验证码