自己封装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. Python学习:Mysql(三)索引

    1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2.索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有 ...

  2. git常用命令与AndroidStudio常用快捷键

    git相关内容: 产生密钥:cd ~/.ssh (C:\Users\账户名称\.ssh)生成密钥:ssh-keygen -t rsa -C "your_email@youremail.com ...

  3. JAVA笔记:double四舍五入并保留两位小数的方法

    1.只要输出结果 double x1 = 0.026; System.out.println(String.format("%.2f", x1)); 2.数据转换 //方案一: g ...

  4. QSlider CSS样式

    QSlider::groove:horizontal{ border:0px; height:15px; background:#deffe5; } QSlider::sub-page:horizon ...

  5. Linux:服务器(CentOS)搭建FTP服务

    Vsftpd(very secure FTP deamon)是众多Linux发行版中默认的FTP服务器.本文以CentOS 8(腾讯云)服务器为例,使用vsftpd搭建Linux云服务器的FTP服务器 ...

  6. element ui 分页

    修改选中页码的样式: .el-pager .active{ color:red !important;//选中 } .el-pager .number:hover{ color:red !import ...

  7. Alfred 好用工具分享

    好用的mac工具分享 1.带历史记录的剪切板 根据快捷键切换选择保存的数据 2.创建热键工作流程 将常用的工具变为热键,快捷切换 如何创建: 设置热键 单击右键 创建actions 打开app 然后将 ...

  8. 攻防世界Web进阶篇——NewsCenter

    题目有一个搜索框,下面是搜索结果,最先考虑是sql注入 遇到sql注入,一般先用单引号,1,2尝试.先尝试构造输入为:sd' union select 1,2 #和sd' union select 1 ...

  9. 搭建 vue 项目

    前提  :  node 环境 也可以用 cnpm (淘宝镜像 npm install -g cnpm –registry=https://registry.npm.taobao.org) 全局安装vu ...

  10. sequelize的创建接口以及模糊查询

    第一步: 在routes里面复制index.js更改为xxx.js(例如arctile.js) res.json()返回的就是json文件 第二步: 在views里app.js引用路由 第三步:查找数 ...