前言

  • 有了前面利用注解拼接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. 在使用TCP协议进行消息发送时,对消息分帧

    成帧与解析 阅读 <java TCP/IP Socket 编程>第三章笔记 成帧技术(frame)是解决如何在接收端定位消息的首尾位置的问题.在进行数据收发时,必须指定消息接收者如何确定何 ...

  2. 三分钟入门 InnoDB 存储引擎中的表锁和行锁

    各位对 "锁" 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共享资源的并发访问,保证数 ...

  3. Leetcode:面试题68 - II. 二叉树的最近公共祖先

    Leetcode:面试题68 - II. 二叉树的最近公共祖先 Leetcode:面试题68 - II. 二叉树的最近公共祖先 Talk is cheap . Show me the code . / ...

  4. P2015

    二叉苹果树 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include< ...

  5. 第二篇 -- Django写一个接口并用Jmeter进行测试

    第一节学习了Jmeter的下载和安装,那么第二节就来看看具体怎么使用. 本篇介绍的是使用Jmeter进行http接口测试,那么接口程序使用Django开发的一个小接口. 一.Django编写接口 这一 ...

  6. 图文实例解析,InnoDB 存储引擎中行锁的三种算法

    前文提到,对于 InnoDB 来说,随时都可以加锁(关于加锁的 SQL 语句这里就不说了,忘记的小伙伴可以翻一下上篇文章),但是并非随时都可以解锁.具体来说,InnoDB 采用的是两阶段锁定协议(tw ...

  7. 洛谷P3052题解

    题面 看起来非常简单,但是细节多的一批的状压DP入门题. 我设 \(f_i\) 为 \(i\) 状态时最小分组数, \(g_i\) 为 \(i\) 状态时最后一组剩余空间. 对于每一个 \(i\) , ...

  8. C运算符(算数运算符)

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C 语言内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 1 //实列 2 3 ...

  9. Java线程基础及多线程的实现

    一.进程和线程 1.进程:正在运行的程序         是系统进行资源分配和调用的独立单位         每一个进程都有它自己的内存空间和系统资源 2.线程是进程中的单个顺序控制流,是一条执行路径 ...

  10. Java-Dubbo学习及整合SpringBoot

    Dubbo架构 Dubbo是Java的RPC框架,具有三大核心功能:面向接口的远程方法调用,智能容错和负载均衡,以及服务的自动注册和发现 Dubbo架构图: 节点角色说明: 节点 说明 Provide ...