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

} 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类型

/**

  • rs.getInt(“id”); 那么number类型就被转换成了int类型;

  • rs.getDouble(“price”);那么number类型就转换成了double类型

  • rs.getObject(“列名”); 那么返回的实际类型是java.math.BigDecimal;

  • Bigdecimal 没有精度损失,多用户银行等的金融计算;

*/

// value如果是Bigdecimal类型,意味着在数据库中是number类型

// 所以需要强转成int或者double类型

if (value == null) {//如果有空的数据,不再强转直接跳过

continue;

}

else if (value instanceof BigDecimal) {

Class<?> c2 = m.getParameterTypes()[0];

if (c2.getName().equals(“java.lang.Integer”)) {

value = ((BigDecimal)value).intValue();

}else

if(c2.getName().equals(“double”)){

value = ((BigDecimal)value).doubleValue();

}

else

if(c2.getName().equals(“int”)){

value = ((BigDecimal)value).intValue();

}

}

//动态执行set方法

m.invoke(t, value);

}

}

}

//while每循环一次,就创建一个实体类对象,给对象的属性赋值,

// 然后将对象存储到list集合中

list.add(t);

}

}finally{

toClose(null, ps, rs);

}

return list;

}

}

jdbcUtil工具类的使用:

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

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

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

img

img

img

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

如果你觉得这些内容对你有帮助,可以扫码领取!

img

最后我们该如何学习?

1、看视频进行系统学习

这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

2、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

Spring源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Mybatis 3源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Redis学习笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Spring Boot核心技术-笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。
1711392037338)]

Redis学习笔记:

[外链图片转存中…(img-ZqgOI9Vt-1711392037338)]

Spring Boot核心技术-笔记:

[外链图片转存中…(img-vhYNfCeK-1711392037338)]

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

[外链图片转存中…(img-5A7B3Azf-1711392037338)]

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值