前言

  • 有了前面利用注解拼接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. 微信小程序云开发-云存储-下载并打开文件文件(word/excel/ppt/pdf)

    一.wxml文件 1.写文本框,用来获取文件链接. 2.按钮,点击下载文件 <!-- 下载文件(word/excel/ppt/pdf等) --> <view class=" ...

  2. 第三十二篇 -- CreateFile、ReadFile、WriteFile

    一.CreateFile 这是一个多功能的函数,可打开或创建文件或者I/O设备,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道. 函数原型: HANDLE WIN ...

  3. Xshell 打开时,初始运行卡慢优化方法

    我使用的是Xshell 6免费版,有需要的同学可以去这个地址下载:https://www.netsarang.com/download/down_form.html?code=622 一开始安装完Xs ...

  4. Jenkins远程命令执行漏洞(CVE-2018-1000861)

    此漏洞没有回显,直接利用orange的exp执行命令反弹shell 工具地址https://github.com/orangetw/awesome-jenkins-rce-2019 web服务器下写1 ...

  5. JBoss JMXInvokerServlet 反序列化漏洞

    poc地址:https://cdn.vulhub.org/deserialization/DeserializeExploit.jar

  6. 快速上手pandas(下)

      和上文一样,先导入后面会频繁使用到的模块: In [1]: import numpy as np import pandas as pd import matplotlib.pyplot as p ...

  7. netty系列之:netty架构概述

    目录 简介 netty架构图 丰富的Buffer数据机构 零拷贝 统一的API 事件驱动 其他优秀的特性 总结 简介 Netty为什么这么优秀,它在JDK本身的NIO基础上又做了什么改进呢?它的架构和 ...

  8. 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.bat 徐晓亮 595076941@qq.com 2019年12月19日6点50分

    @Echo offRem 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.batRem 徐晓亮 595076941@qq.com 2019年12月19日6点50分 Rem 此批处理脚本源代码的 ...

  9. 解决移动端在IOS中input输入框光标过长

    在输入框样式中加入: line-height:20px;

  10. 04.委托Delegation

    1. 基本了解 1.1 委托简述 官方文档 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用,用于将方法作为参数传递给其他方法,可将任何可访问类或结构中与委托类型匹配的任何方法分配给委 ...