自行封装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)提高系统的友好性 ...
随机推荐
- nginx+vite 项目打包及部署
项目打包及部署到服务器二级路由 例如:我希望将打包的项目部署到 http://localhost:8088/web/ 上 一. 项目配置及打包 项目部署到服务器二级路由需要配置基础路径base,即需要 ...
- docker命令自动补全
1.安装bash-completion yum install -y bash-completion 2.重新连接docker 服务器使docker补全命令生效,或者建立新的远程连接docker服务器 ...
- bootstrap-treeview手动修改源码添加与后台交互的id
bootstrap-treeview中只有自增的参数data-nodeid,没有id的参数,不方便后台交互,修改源码添加id. 1.图一为添加的自定义的node.Id; 2. 下图为添加的id 3.后 ...
- TypeScript 声明文件
TypeScript 声明文件 TypeScript 作为 JavaScript 的超集,在开发过程中不可避免要引用其他第三方的 JavaScript 的库.虽然通过直接引用可以调用库的类和方法,但是 ...
- jmeter非GUI模式运行-单节点
jmeter有自己的GUI页面,但是当线程数很多或者现在有很多的测试场景都是基于linux下进行压测,这时我们可以使用jmeter的命令行方式来执行测试,该篇文章介绍jmeter单节点命令运行方式. ...
- Jmeter进行服务器性能压力测试遇问题及解决方案
最近再给公司的一个项目进行服务器性能进行压测,要出一些报告图形展示,放弃了用boom工具我选择了用jmeter工具进行压测过程中遇到了一些问题下面将一一列出及解决方案希望帮助到你们!!! 1.装第三方 ...
- spark项目技术点整理
spark项目技术点整理 1.性能调优: 1>分配更多的资源:性能调优的王道就是分配和增加更多的资源.写完一个spark作业后第一个要是调节最优的资源配置,能够分配的资源达到你的能力范围的顶端后 ...
- JS篇(008)-require 与 import 的区别
答案:两者的加载方式不同.规范不同 第一.两者的加载方式不同,require 是在运行时加载,而 import 是在编译时加载 require('./a')(); // a 模块是一个函数,立即执行 ...
- Unity算法之A星- A*Pathfind Project插件的使用
先上效果图 首先上 插件地址 (如果没有积分可以评论区联系我) 1.下载完毕后导入unity 导入后可以在Component里面看到多了一个Pathfinding选项 2.场景搭建 首先新建两个层 ...
- swoole的使用场景
一.TCP服务器 二.UDP服务器 三.HTTP服务器 四.WebSocket服务器 五.物联网服务器 六.执行异步任务 七.协程