自己封装JDBCUtils

package com.javasm.util;

import com.javasm.bean.Emp;
import com.javasm.constants.JDBCConstants; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List; /**
* @Author:Zxb
* @Version:1.0
* @Date:2022/12/12-11:38
* @Since:jdk1.8
* @Description:
*/
public class JDBCUtils {
/**
* 获取数据库连接对象
*
* @return
*/
public static Connection getConnection() {
try {
//加载驱动(JDK1.8之后自动加载)
Class.forName(JDBCConstants.DRIVER);
//获取连接对象
return DriverManager.getConnection(JDBCConstants.URL,
JDBCConstants.USER, JDBCConstants.PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
} /**
* 判断连接是否成功
* @param connection
* @return
*/
public static boolean isConnection(Connection connection) {
try {
if (connection != null && !connection.isClosed()) {
// System.out.println("数据库连接成功!");
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
} /**
* 增删改的资源回收
* 回收顺序:先回收执行对象再断开连接
* @param connection
* @param statement
*/
public static void close(Connection connection,Statement statement){
//执行对象不为null,且执行对象连接就断开
try {
if(statement!=null&&!statement.isClosed()){
statement.close();
}
//是否连接,连接就断开
if(isConnection(connection)){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
} } /**
* 查询的资源回收
* 查询要显示结果集,
* 回收顺序:先回收结果集,再回收执行对象,最后断开连接
* @param connection
* @param statement
* @param resultSet
*/
public static void close(Connection connection, Statement statement, ResultSet resultSet){
try {
//结果集不为null,且结果集连接就断开
if(resultSet!=null&&!resultSet.isClosed()){
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
close(connection, statement);
} /**
* 执行增删改操作
* @param sql
* @param params
* @return
*/
public static int update(String sql,Object...params){
int n=0;
//获取连接对象
Connection connection =getConnection();
//执行对象
PreparedStatement statement = null;
//先判断
if(isConnection(connection)){
try {
//获取执行对象
statement=connection.prepareStatement(sql);
//解决参数
if(params!=null&&params.length>0){
for (int i = 0; i < params.length; i++) {
statement.setObject((i+1),params[i]);
}
}
//执行
n=statement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(connection,statement);
}
}
return n;
} /**
* 查询
* @param sql
* @param clazz
* @param params
* @param <T>
* @return
*/
public static <T>List<T> query(String sql,Class clazz,Object...params){
List<T> list = new ArrayList<>(10);
//获取数据库连接对象
Connection connection = getConnection();
//执行
PreparedStatement statement = null;
//结果集
ResultSet resultSet = null;
//先判断
if(isConnection(connection)){
try {
//获取执行对象
statement = connection.prepareStatement(sql);
//解决参数
if(params!=null&&params.length>0){
for (int i = 0; i < params.length; i++) {
statement.setObject((i+1),params[i]);
}
}
//执行查询
resultSet = statement.executeQuery();
//获取元数据
ResultSetMetaData metaData=resultSet.getMetaData();
//获取列的个数
int columnCount = metaData.getColumnCount();
//判断是否有下一行数据
while (resultSet.next()){//每一行
Object object = clazz.newInstance();
for (int i = 1; i <= columnCount; i++) {//每一列
//获取列名
String label = metaData.getColumnLabel(i);
//获取列对应的数据类型
String className=metaData.getColumnClassName(i);
//根据列名获取对应的值
Object value = resultSet.getObject(label);
//赋值
invoke(clazz,label,className,object,value);
}
//将对象存入到集合中
list.add((T) object);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} finally {
close(connection, statement, resultSet);
}
}
return list;
} /**
* 赋值
* @param clazz
* @param label
* @param className
* @param object
* @param value
*/
private static void invoke(Class clazz,String label,String className,Object object,Object value){
//获取方法名
String methodName = ClassUtils.getMethodName(label);
//获取方法的参数类型
Class aClass=ClassUtils.getClass(className);
try {
//通过反射获取反射方法对象
Method method = clazz.getMethod(methodName, aClass);
//赋值
method.invoke(object,value);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}

ClassUtils

package com.javasm.util;

/**
* @Author:Zxb
* @Version:1.0
* @Date:2022/12/13-11:36
* @Since:jdk1.8
* @Description:
*/
public class ClassUtils { /**
* 获取方法名
* @param labelName
* @return
*/
public static String getMethodName(String labelName){
//emp_id --> setEmpId
StringBuilder stringBuilder = new StringBuilder("set");
//根据_分割字符串 emp_id
String[] split = labelName.split("_");//emp id
for (String s : split) {//遍历每个单词
stringBuilder.append(Character.toUpperCase(s.charAt(0)));//分割后的第一个字母大写E /第二轮拼接 EmpI
stringBuilder.append(s.substring(1)); //截取索引1之后的数据mp,拼接Emp / EmpId
}
return stringBuilder.toString();
} /**
* 获取对应的类型
* @param className
* @return
*/
public static Class getClass(String className){
if(className.equals("java.sql.Date")||className.equals("java.sql.Timestamp")){
className="java.util.Date";
}
Class<?> aClass = null;
try {
aClass = Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return aClass;
}
}

JDBCConstants

package com.javasm.constants;

/**
* @Author:Zxb
* @Version:1.0
* @Date:2022/12/12-11:02
* @Since:jdk1.8
* @Description:
*/
public class JDBCConstants {
//账号和密码
public static final String USER = "root",PASSWORD="123456"; public static final String URL ="jdbc:mysql://localhost:3306/test_db?useSSL=false";//useSSL=false忽略版本
//数据库驱动地址
public static final String DRIVER="com.mysql.jdbc.Driver";
}

自行封装JDBCUtils的更多相关文章

  1. VUE 2.0 引入高德地图,自行封装组件

    1. 高德地图官网 申请帐号, 申请相应(JavaScript API)的 Key 2. 在项目中引入, 这里和其他的引入不同的是 直接在 index.html, 不是在 main.js 引入, 博主 ...

  2. 试试自行封装AJAX和jQuery中的ajax封装的基本使用

    封装的套路: 1.写一个相对比较完善的用例2.写一个空函数,没有形参,将刚刚的用例直接作为函数的函数体3.根据使用过程中的需求抽象函数 代码记录如下: <script> function ...

  3. Selenium里可以自行封装与get_attribute对应的set_attribute方法

    我们在做UI自动化测试的过程中,某些情况会遇到,需要操作WebElement属性的情况. 假设现在我们需要获取一个元素的title属性,我们可以先找到这个元素,然后利用get_attribute方法获 ...

  4. Vue自行封装常用组件-倒计时

    倒计时组件,比较复杂一点,大神勿调侃,精确到毫秒,因为项目中多次出现倒计时,所以拿出来分享下 使用方法:1.在父组件中引入"uni-countdown" //import uniC ...

  5. Vue自行封装常用组件-文本提示

    使用方法:1.在父组件中引入"toast.vue" //import toast from "./toast"; 2.在父组件中注册 toast //compo ...

  6. Vue自行封装常用组件-弹出框

    使用方法: 1.在父组件中引入"box.vue" //import popUpBox from "./box.vue";   2.在父组件中注册 popUpBo ...

  7. 通过jdbc完成单表的curd操作以及对JDBCUtils的封装

    概述:jdbc是oracle公司制定的一套规范(一套接口),驱动是jdbc的实现类,由数据库厂商提供.所以我们可以通过一套规范实现对不同的数据库操作(多态) jdbc的作用:连接数据库,发送sql语句 ...

  8. StackExchange.Redis帮助类解决方案RedisRepository封装(基础配置)

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫,请注明原文地址.http://www.cnblogs.com/tdws/p/5815735.html 写在前面 这不是教程,分享而已,也欢迎园友们多 ...

  9. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...

  10. [改善Java代码] 提倡异常的封装

    JavaAPI提供的异常都是比较低级别的,低级别是指只有开发人员才能看懂的异常.而对于终端用户来说基本上就是天书,与业务无关,是纯计算机语言的描述. 异常封装的三方面的好处: 1)提高系统的友好性   ...

随机推荐

  1. Vue3学习笔记

    为什么需要Composition API ? 主要原因:当一个组件的变得逻辑复杂的时候,痛点:多种逻辑代码被分散到组件的各个部分,比如代码的相关逻辑可能会在 data: {...},computed: ...

  2. vvv,具名插槽

    <!DOCTYPE html> <html> <head> <script src="a.js"></script> & ...

  3. FMC128-基于FMC 1路HD-SDI输入输出,1路复合视频输入输出子卡 工业图像输出 图像模拟源

    FMC128-基于FMC 1路HD-SDI输入输出,1路复合视频输入输出子卡 一.板卡概述       FMC板卡包含1路HD-SDI 输入输出,1路复合视频输入输出,用于高清.标清相机的产品测试及智 ...

  4. 加载Assetbundle

    using UnityEngine;using System.Collections;using UnityEngine.SceneManagement; /// <summary>/// ...

  5. 寻找进程ID

  6. (jmeter笔记)jmeter远程启用服务器(分布式)

    1.在负载机上安装jmeter,修改jmeter\bin\jmeter.properties配置: 1)server.rmi.ssl.disable=false 改 server.rmi.ssl.di ...

  7. vagrant用密码连接ssh

    1通过 ssh address连接 1:进去linux 2:修改配置文件信息 vi /etc/ssh/sshd_config 修改 passwordAuthentication no 改为 passw ...

  8. nebula命令行无法查看配置信息

    版本为nebula2.0.1 正在部署集群,节点数比较多,直接在一个节点配置好配置文件,分发到其他节点, 为了减少后续修改配置文件时再为配置文件添加--local_config=true,所以直接加上 ...

  9. 数据库负载均衡 happroxy 中间器(Nginx)容器的安装与配置

    docker  镜像中安装haproxy 1.下载并安装haproxy镜像 docker pull happroxy # docker pull haproxy:1.7 2.查看镜像 docker i ...

  10. 05 RDD练习:词频统计

    一.词频统计: 1.读文本文件生成RDD lines 2.将一行一行的文本分割成单词 words flatmap() 3.全部转换为小写 lower() 4.去掉长度小于3的单词 filter() 5 ...