前言

  • 有了前面利用注解拼接sql语句,下面来看一下利用反射获取类的属性和方法
  • 不过好像有一个问题,数据库中的表名和字段中带有下划线该如何解决呢

实践操作

  • 工具类:获取connection对象
public class JDBCUtil {
public static Connection getConnection() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost/jdbctest";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
return connection;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
  • 拼接sql语句,利用反射封装
public interface BaseMapper<T> {
/**
* default关键字,修饰接口中的方法时,方法可以拥有方法体
* 拼接sql语句,例如向user表插入数据:insert into user (id, username, age, sex, password) value (?, ?, ?, ?, ?);
*/
default int insert(T t) throws Exception {
StringBuilder sb = new StringBuilder("insert into "); // 动态构建
sb.append(t.getClass().getSimpleName()); // 获取类名
sb.append("(");
Method[] methods = t.getClass().getDeclaredMethods();
int i = 0;
for(Method m : methods) {
if(m.getName().startsWith("get")) { // startsWith方法用于判断是否以指定前缀开头
Object o = m.invoke(t, null); // 将获取的方法名参数化
if(o != null) {
sb.append(m.getName().substring(3));
sb.append(",");
i ++;
}
}
}
//截取掉最后一个逗号,添加一个右括号
String s = sb.substring(0, sb.length() -1) + ")";
StringBuilder sb1 = new StringBuilder(s);
sb1.append(" values(");
for(int j = 0; j < i; j++) {
sb1.append("?,");
}
//截取掉最后一个逗号,添加一个右括号
String sql = sb1.substring(0, sb1.length()-1) + ")";
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
int j = 1;
for(Method m : methods) {
if(m.getName().startsWith("get")) {
Object o = m.invoke(t, null);
if(o != null) {
ps.setObject(j, o); // 注入对应的参数
j++;
}
}
}
int insert = ps.executeUpdate();
return insert;
} /**
* 获取表中所有数据
* 例如获取user表中的所有数据:select * from user;
*/
default List<T> getAll(Class<T> t) throws Exception {
String sql = "select * from " + t.getSimpleName();
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
List<T> lists = new ArrayList<T>();
while(rs.next()) {
T t1 = t.newInstance();
Method[] methods = t1.getClass().getMethods();
for(Method m : methods) {
if(m.getName().startsWith("set")) { // getName().substring(3) 获取属性名
m.invoke(t1, rs.getObject(m.getName().substring(3))); // 这里是按列名获取完一个对象后 初始化,再获取下一个对象的值
}
}
lists.add(t1); // 将对象添加到list集合
}
return lists;
}
}

jdbc操作mysql(四):利用反射封装的更多相关文章

  1. jdbc操作mysql(三):利用注解封装

    案例五:利用注解封装 重复步骤 我们使用jdbc操作mysql时发现,操作不同表中数据,所写的方法基本相同:比如我们根据id向用户表添加数据,根据id删除商品表的数据,或者查询所有数据并用list集合 ...

  2. jdbc操作mysql

    本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...

  3. jdbc操作mysql(一)

    java.sql包 在使用jdbc之前,我们先看看有关操作jdbc会用到的几个类和接口,通过查看官方文档可知 DriverManager:用于管理一组JDBC驱动程序的基本服务,即管理数据库中的所有驱 ...

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

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

  5. 原生Jdbc操作Mysql数据库开发步骤

    原生Jdbc操作Mysql数据库开发步骤 原生的Jdbc就是指,不使用任何框架,仅用java.sql包下的方法实现数据库查询等的操作. 下面是开发步骤:        1.导入数据库驱动包       ...

  6. JDBC操作MySQL数据库案例

    JDBC操作MySQL数据库案例 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  7. [自动化专题]JDBC操作mysql时遇到的拦路虎

    在挫折中成长,在错误中学习.聊聊我们在Selenium自动化中使用JDBC操作mysql数据库中遇到的那些拦路虎: 错误一:Can not issue data manipulation statem ...

  8. java数据库 JDBC操作MySQL数据库常用API 部门表和员工表 创建表 添加数据 查询数据

    package com.swift.department; import java.sql.Connection; import java.sql.PreparedStatement; import ...

  9. JDBC操作MySQL(crud)

    这两天复习了一下JDBC操作MySQL,把crud操作的例子记一下, 类库链接(mysql-connector-java-5.1.37-bin.jar):http://files.cnblogs.co ...

随机推荐

  1. P5471- K-D tree优化建图-弹跳

    P5471- K-D tree优化建图-弹跳 优化建图是一种思想. 题意 有\(n\)个城市分布在小鸟岛上,有\(m\)个弹弓分布在这些城市里.因为弹弓体积大,固定麻烦,所以每个弹弓只能把小鸟弹飞到一 ...

  2. JS进度条顺滑版实现

    进度条不顺滑 相信大多前端同学都自己写过音频.视频播放器,实现并不复杂.最近在小程序里,做了一个类似微博刷视频的需求.其中有一部分功能需要实现自定义进度条,在做完第一版之后发现进度条不顺滑,而后想查查 ...

  3. MySQL 优化【转】

    MySQL常见的优化手段分为下面几个方面: SQL优化.设计优化,硬件优化等,其中每个大的方向中又包含多个小的优化点 下面我们具体来看看~ SQL优化 此优化方案指的是通过优化 SQL 语句以及索引来 ...

  4. C++11 noexcept 关键字用法学习

    最近学习和写了一个 mint 的板子 ,其中用到了 noexcept 关键字,对这个关键字不太熟悉,便学习一下刘毅学长的文章. C++98 中的异常规范(Exception Specification ...

  5. 聊聊 PC 端自动化最佳方案 - WinAppDriver

    1. 前言 大家好,我是安果! 一提到自动化,可能大家想到的是 App 端的 Appium.Airtest.AutoJS,亦或是 Selenium.Puppeteer.Cypress 等 Web 端的 ...

  6. 乘风破浪,遇见Android Jetpack之Compose声明式UI开发工具包,逐渐大一统的原生UI绘制体系

    什么是Android Jetpack https://developer.android.com/jetpack Android Jetpack是一个由多个库组成的套件,可帮助开发者遵循最佳做法.减少 ...

  7. 保存Total Commander的列宽

    Total Commander的默认列宽经常显示不全内容,需要手工调整,用"Menu -> Configuration -> Save Position"可以永久保存列 ...

  8. PrismWPF网盘

    技术点 文件分片上传与下载 Vue 正在努力中.... 客户端 采用 WPF:Net5+Prism8+RestSharp 客户端基本结构如下 模块说明 Model: 主要放置Prism模块 ZFile ...

  9. 从零开始的Java RASP实现(二)

    目录 2 RASP-demo 2.1 类加载机制 双亲委派 BootStrap ClassLoader 2.2 Instrumentation介绍 Instrumentation类中常用方法 Inst ...

  10. ViewPager2 使用说明书

    ViewPager2 使用说明书 零.Demo 项目源码 演示 apk 如果对你有用,希望能给个 star,谢谢. 一.功能 官方关于使用 ViewPager2 创建滑动视图的说明: Swipe vi ...