自行封装JDBCUtils
自己封装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&¶ms.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&¶ms.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的更多相关文章
- VUE 2.0 引入高德地图,自行封装组件
1. 高德地图官网 申请帐号, 申请相应(JavaScript API)的 Key 2. 在项目中引入, 这里和其他的引入不同的是 直接在 index.html, 不是在 main.js 引入, 博主 ...
- 试试自行封装AJAX和jQuery中的ajax封装的基本使用
封装的套路: 1.写一个相对比较完善的用例2.写一个空函数,没有形参,将刚刚的用例直接作为函数的函数体3.根据使用过程中的需求抽象函数 代码记录如下: <script> function ...
- Selenium里可以自行封装与get_attribute对应的set_attribute方法
我们在做UI自动化测试的过程中,某些情况会遇到,需要操作WebElement属性的情况. 假设现在我们需要获取一个元素的title属性,我们可以先找到这个元素,然后利用get_attribute方法获 ...
- Vue自行封装常用组件-倒计时
倒计时组件,比较复杂一点,大神勿调侃,精确到毫秒,因为项目中多次出现倒计时,所以拿出来分享下 使用方法:1.在父组件中引入"uni-countdown" //import uniC ...
- Vue自行封装常用组件-文本提示
使用方法:1.在父组件中引入"toast.vue" //import toast from "./toast"; 2.在父组件中注册 toast //compo ...
- Vue自行封装常用组件-弹出框
使用方法: 1.在父组件中引入"box.vue" //import popUpBox from "./box.vue"; 2.在父组件中注册 popUpBo ...
- 通过jdbc完成单表的curd操作以及对JDBCUtils的封装
概述:jdbc是oracle公司制定的一套规范(一套接口),驱动是jdbc的实现类,由数据库厂商提供.所以我们可以通过一套规范实现对不同的数据库操作(多态) jdbc的作用:连接数据库,发送sql语句 ...
- StackExchange.Redis帮助类解决方案RedisRepository封装(基础配置)
本文版权归博客园和作者吴双本人共同所有,转载和爬虫,请注明原文地址.http://www.cnblogs.com/tdws/p/5815735.html 写在前面 这不是教程,分享而已,也欢迎园友们多 ...
- StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...
- [改善Java代码] 提倡异常的封装
JavaAPI提供的异常都是比较低级别的,低级别是指只有开发人员才能看懂的异常.而对于终端用户来说基本上就是天书,与业务无关,是纯计算机语言的描述. 异常封装的三方面的好处: 1)提高系统的友好性 ...
随机推荐
- Vue3学习笔记
为什么需要Composition API ? 主要原因:当一个组件的变得逻辑复杂的时候,痛点:多种逻辑代码被分散到组件的各个部分,比如代码的相关逻辑可能会在 data: {...},computed: ...
- vvv,具名插槽
<!DOCTYPE html> <html> <head> <script src="a.js"></script> & ...
- FMC128-基于FMC 1路HD-SDI输入输出,1路复合视频输入输出子卡 工业图像输出 图像模拟源
FMC128-基于FMC 1路HD-SDI输入输出,1路复合视频输入输出子卡 一.板卡概述 FMC板卡包含1路HD-SDI 输入输出,1路复合视频输入输出,用于高清.标清相机的产品测试及智 ...
- 加载Assetbundle
using UnityEngine;using System.Collections;using UnityEngine.SceneManagement; /// <summary>/// ...
- 寻找进程ID
- (jmeter笔记)jmeter远程启用服务器(分布式)
1.在负载机上安装jmeter,修改jmeter\bin\jmeter.properties配置: 1)server.rmi.ssl.disable=false 改 server.rmi.ssl.di ...
- vagrant用密码连接ssh
1通过 ssh address连接 1:进去linux 2:修改配置文件信息 vi /etc/ssh/sshd_config 修改 passwordAuthentication no 改为 passw ...
- nebula命令行无法查看配置信息
版本为nebula2.0.1 正在部署集群,节点数比较多,直接在一个节点配置好配置文件,分发到其他节点, 为了减少后续修改配置文件时再为配置文件添加--local_config=true,所以直接加上 ...
- 数据库负载均衡 happroxy 中间器(Nginx)容器的安装与配置
docker 镜像中安装haproxy 1.下载并安装haproxy镜像 docker pull happroxy # docker pull haproxy:1.7 2.查看镜像 docker i ...
- 05 RDD练习:词频统计
一.词频统计: 1.读文本文件生成RDD lines 2.将一行一行的文本分割成单词 words flatmap() 3.全部转换为小写 lower() 4.去掉长度小于3的单词 filter() 5 ...