自己封装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. HTML学习笔记6----链接

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  2. drf从入门到飞升仙界 06

    模型类准备 from django.db import models # 图书跟作者:多对多,需要建立中间表,但是我们可以通过ManyToManyField自动生成,写在哪里都行 # 图书跟出版社:一 ...

  3. QCheckBox CSS样式

    QCheckBox:!hover { color:white; border-radius:10px; border:1px solid rgb(170, 170, 127); background- ...

  4. ASP.NET Core3.1 中使用MongoDB基本操作

    1.安装驱动包 install-package MongoDB.Driver -version 2.11.7 2.配置文件帮助类 ConfigHelper public static class Co ...

  5. 备份是个好习惯 bugku

      题目描述: 解题思路: 1.查看网页源码只显示一行字符,有点像16进制,但经过解码并不是,也不是base64等编码 2.根据题目,应该和备份相关,默认页面一般都是 index.php或者index ...

  6. Profiler中WaitForTargetFPS详解【转】

    WaitForTargetFPS 该参数一般出现在 CPU开销过低,且通过设定了目标帧率的情况下(Application.targetFrameRate).当上一帧低于目标帧率时,将会在本帧产生一个W ...

  7. mysql 1130报错只允许localhost登录解决方法

    提示:这些方法会改变登录权限,如果是生产服务器端谨慎操作!!! mysql出现错误码1130的解决办法: 错误描述: 错误代码:1130Host ***.***.***.*** is not allo ...

  8. vue3 vite等笔记

    1.脚手架 vue-cli基于webpack封装,生态非常强大,可配置性也非常高,几乎能够满足前端工程化的所有要求.缺点就是配置复杂,甚至有公司有专门的webpack工程师专门做配置,另外就是webp ...

  9. nginx 白名单配置

    方法一. iptables [root@root~]# vim /etc/sysconfig/iptables .... -A INPUT -s 白名单IP -p tcp -m state --sta ...

  10. bzoj 4407

    莫比乌斯反演 还是推式子: 设$f(n)=n^{k}$ 那就是上一道题了 推的过程如下: $\sum_{i=1}^{a}\sum_{j=1}^{b}f(gcd(i,j))$ $\sum_{i=1}^{ ...