jdbc操作mysql(四):利用反射封装
前言
- 有了前面利用注解拼接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(四):利用反射封装的更多相关文章
- jdbc操作mysql(三):利用注解封装
案例五:利用注解封装 重复步骤 我们使用jdbc操作mysql时发现,操作不同表中数据,所写的方法基本相同:比如我们根据id向用户表添加数据,根据id删除商品表的数据,或者查询所有数据并用list集合 ...
- jdbc操作mysql
本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...
- jdbc操作mysql(一)
java.sql包 在使用jdbc之前,我们先看看有关操作jdbc会用到的几个类和接口,通过查看官方文档可知 DriverManager:用于管理一组JDBC驱动程序的基本服务,即管理数据库中的所有驱 ...
- Java使用Jdbc操作MySql数据库(一)
这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...
- 原生Jdbc操作Mysql数据库开发步骤
原生Jdbc操作Mysql数据库开发步骤 原生的Jdbc就是指,不使用任何框架,仅用java.sql包下的方法实现数据库查询等的操作. 下面是开发步骤: 1.导入数据库驱动包 ...
- JDBC操作MySQL数据库案例
JDBC操作MySQL数据库案例 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...
- [自动化专题]JDBC操作mysql时遇到的拦路虎
在挫折中成长,在错误中学习.聊聊我们在Selenium自动化中使用JDBC操作mysql数据库中遇到的那些拦路虎: 错误一:Can not issue data manipulation statem ...
- java数据库 JDBC操作MySQL数据库常用API 部门表和员工表 创建表 添加数据 查询数据
package com.swift.department; import java.sql.Connection; import java.sql.PreparedStatement; import ...
- JDBC操作MySQL(crud)
这两天复习了一下JDBC操作MySQL,把crud操作的例子记一下, 类库链接(mysql-connector-java-5.1.37-bin.jar):http://files.cnblogs.co ...
随机推荐
- 三分钟入门 InnoDB 存储引擎中的表锁和行锁
各位对 "锁" 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共享资源的并发访问,保证数 ...
- vue3 自学(一)基础知识学习和搭建一个脚手架
两年前曾自学过几天vue,那时候版本还是vue2,但后来项目中一直没用到,当时也觉得学习成本太高,便没有继续学习下去.初学者可以看下链接文章以前的吐槽~~ 学习 Vue ,从入门到放弃 最近部门决定升 ...
- node.js背后的引擎V8及优化技术
本文将挖掘V8引擎在其它方面的代码优化,如何写出高性能的代码,及V8的性能诊断工具.V8是chrome背后的javascript引擎,因此本文的相关优化经验也适用于基于chrome浏览器的javasc ...
- QLabel的使用
现在学习一个简单的控件Label. 第一步:打开designer.exe.拖动一个控件到主窗口,双击可以编辑文字. 第二步:设置字体大小 第三步:设置文字颜色 第四步:设置背景色 第五步:将文字居中 ...
- Java 在线/离线 文档
英文: Oracle 官网在线文档 Java SE 8 Oracle 官网在线文档 Java SE 9 & JDK 9 中文: Java 1.8: 中文 – 谷歌版 中文 – 有道版 中文 – ...
- vue keep-alive的实现原理和缓存策略
使用 <!-- 基本 --> <keep-alive> <component :is="view"></component> < ...
- Java中Arrays数组的定义与使用
初始化 Java中数组是固定长度,数组变量是个对象. NullPointerException 空指针异常. ArrayIndexOutOfBoundsException 索引值越界. 数组三种初始化 ...
- Salesforce Integration 概览(三) Remote Process Invocation—Fire and Forget(远程进程调用-发后即弃)
本篇参考:https://resources.docs.salesforce.com/sfdc/pdf/integration_patterns_and_practices.pdf 我们在上一篇讲了远 ...
- Java程序设计(2021春)——第四章接口与多态笔记与思考
Java程序设计(2021春)--第四章接口与多态笔记与思考 本章概览: 4.1 接口(接口的概念和声明接口.实现接口的语法) 4.2 类型转换 4.3 多态的概念 4.4 多态的应用 4.5 构造方 ...
- springboot整合javafx
原文(原码)参考地址: https://github.com/roskenet/springboot-javafx-support https://github.com/spartajet/javaf ...