JdbcUtil类,jdbcl连接Oracle数据库,封装增删改查方法

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

/**

  • @author 超伟

  • @2019年5月29日 下午3:48:26

  • @博客:https://blog.csdn.net/MacWx

*/

public class JdbcUtil {

public static DataSource ds;

public static final ThreadLocal tl = new ThreadLocal();

// 把流操作提取到静态代码块里面。

static {

InputStream in = null;

// 创建连接池对象

try {

// 创建出Properties对象

Properties prop = new Properties();

in = JdbcUtil.class.getResourceAsStream(“/druid.properties”);

// 读取文件中的数据

prop.load(in);

// 创建连接池对象

ds = DruidDataSourceFactory.createDataSource(prop);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

throw new RuntimeException(e);

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

throw new RuntimeException(e);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

if (in != null) {

try {

in.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

/**

  • @return

*/

public static Connection getConnection() {

//优先从线程中获取连接

Connection conn = tl.get();

// 如果没有拿到这个线程,就说明是业务类在调用

//如果从线程中获取失败,则再新建和数据库的连接

if (conn == null) {

try {

// 用数据库连接池来获取数据库连接

conn = ds.getConnection();

tl.set(conn);

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

throw new RuntimeException(e);

}

}

return conn;

}

/**

  • @param conn

  • @param ps

  • @param rs

*/

public static void toClose(Connection conn, PreparedStatement ps,

ResultSet rs) {

try {

// 代码不用改,但是含义改变了,把这个连接归还给数据库连接池

// //为了代码的健壮性,需要增加非空判断

if (rs != null) {

rs.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// 释放ps对象,关闭资源的时候需要注意顺序,后创建的对象,要先关闭。

try {

if (ps != null) {

ps.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

if (conn != null) {

conn.close();

//关闭连接,要从线程中移除

tl.remove();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

  • 使用jdbc对于增删改方法的封装

  • 对于增删改方法,仍有大部分的冗余代码,但在这些冗余代码中又有一些是不同的

  • 例如sql语句,以及传入的参数,所以可把相同的代码封装,不同的代码抽取

  • 这只是代码的简化,并不是程序的优化

  • @param sql 对于sql语句的抽取

  • @param obj 可变长参数

  • 可变长参数必须是最后一个形参,也只能有一个这样的形参

  • 在该方法内部,将obj当成一个数组使用。

  • @throws SQLException

*/

public static void update(String sql,Object…obj) throws SQLException{

Connection conn = null;

PreparedStatement ps = null;

try{

//调用本类中的获取连接方法

conn = getConnection();

ps = conn.prepareStatement(sql);

//再判断传入的参数是否为空

if (obj != null) {

//如果不为空则挨个赋值

for (int i = 0; i < obj.length; i++) {

ps.setObject(i+1, obj[i]);

}

}

ps.executeUpdate();

//这里不用catch异常是因为要在dao中去处理

}finally{

//这里的conn连接不要关,在services层中去关闭!在services中处理事务!

toClose(null, ps, null);

}

}

/*

  • 反射:

  • 什么是类对象和类的对象?

  • Student s = new Student();

s是类的对象,是某一个类创建出来的对象,这个类是Student

//1.在运行期加载一个类到虚拟机中

Class c = Class.forName(“com.macw.Student”);

//c就是Student的类对象

//2. 通过反射创建Student类的对象

Object o = c.newInstance();

//o 是Student类的对象

//3.获取Student类指定的方法 和 获取所有的方法

Method method = c.getMethod(“方法名”,形参类型);

//method指某一个方法

method.invoke(对象,实参); //动态调用该方法

Method[] methods = c.getMethods();

//methods指类中所有的方法

*/

/**

  • 查询多条

  • 是用来规范泛型的,

  • @throws SQLException

  • @throws IllegalAccessException

  • @throws InstantiationException

  • @throws InvocationTargetException

  • @throws IllegalArgumentException

*/

public static List select(String sql,Class clz,Object…obj) throws SQLException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

List list = null;

try {

conn = getConnection();

// 1,预加载SQL语句

ps = conn.prepareStatement(sql);

// 2,设置占位符

if (obj != null) {

for (int i = 0; i < obj.length; i++) {

ps.setObject(i+1, obj[i]);

}

}

// 3,执行SQL语句

rs = ps.executeQuery();

// 获取查询结果集中的元数据

// 元数据可以理解为查询结果中的列名

ResultSetMetaData md = rs.getMetaData();

// 获取查询到的列的个数;

int columnCount = md.getColumnCount();

// System.out.println(columnCount);

list = new ArrayList<>();

T t = null;

while(rs.next()){//while每循环一次,代表一行数据。

//clz代表实体类对象,

// 创建实体类的对象

t = clz.newInstance();

for (int i = 0; i < columnCount; i++) {//一行数据有几列就循环几次

// 根据下标获取列名

String columnName = md.getColumnName(i+1);

// 再根据列名获取对应列的值

Object value = rs.getObject(columnName);

// 要将每一列的值赋值给t对象的属性,要要求表中的列名和实体类属性名必须一致!

// 这是通过字符串拼接成 setName();方法

String methodName = “set” + columnName.substring(0, 1).toUpperCase()+

columnName.substring(1).toLowerCase();

// 获取当前实体类中传递过来的所有方法

Method[] methods = clz.getMethods();

// 进行for循环获取所有的set方法

for (Method m : methods) {

// 判断所有的方法中有没有查询结果列名拼成的set方法

// 获取实体类中所有的方法名用:m.getName()方法

if (m.getName().equals(methodName)) {

// Oracle中的number类型对应java中的java.math.BigDecimal类型

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

最后,强调几点:

  • 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
  • 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
  • 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。

面试答案

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;

  • 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。

面试答案

[外链图片转存中…(img-ldwk43wV-1713318068422)]

[外链图片转存中…(img-Jg7UePbU-1713318068423)]

[外链图片转存中…(img-owMDFojp-1713318068423)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 28
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为语言模型,我无法提供完整的代码实现。但是,我可以给出一个jdbcutil的模板,您可以根据需要进行修改和完善。 ```java import java.sql.*; public class JdbcUtil { private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/test"; private static final String USERNAME = "root"; private static final String PASSWORD = "password"; private Connection conn; private PreparedStatement pstmt; private ResultSet rs; public JdbcUtil() { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } // 获取数据库连接 public Connection getConnection() { try { conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (SQLException e) { e.printStackTrace(); } return conn; } // 关闭数据库连接 public void closeConnection() { try { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } // 增加操作 public boolean add(String sql, Object... params) { conn = getConnection(); try { pstmt = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } int count = pstmt.executeUpdate(); return count > 0; } catch (SQLException e) { e.printStackTrace(); return false; } finally { closeConnection(); } } // 删除操作 public boolean delete(String sql, Object... params) { conn = getConnection(); try { pstmt = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } int count = pstmt.executeUpdate(); return count > 0; } catch (SQLException e) { e.printStackTrace(); return false; } finally { closeConnection(); } } // 修改操作 public boolean update(String sql, Object... params) { conn = getConnection(); try { pstmt = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } int count = pstmt.executeUpdate(); return count > 0; } catch (SQLException e) { e.printStackTrace(); return false; } finally { closeConnection(); } } // 查询操作 public ResultSet query(String sql, Object... params) { conn = getConnection(); try { pstmt = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } rs = pstmt.executeQuery(); return rs; } catch (SQLException e) { e.printStackTrace(); return null; } } } ``` 使用示例: ```java JdbcUtil jdbcUtil = new JdbcUtil(); String sql = "INSERT INTO user(name, age) VALUES(?, ?)"; Object[] params = {"张三", 20}; boolean result = jdbcUtil.add(sql, params); if (result) { System.out.println("添加成功"); } else { System.out.println("添加失败"); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值