高级Java开发工程师手把手教你用AI人工智能帮你写JAVA代码实际案例一全网唯一

技术很渣 2024-06-13 12:31:05 阅读 75

高级Java开发工程师手把手教你用AI人工智能帮你写Java代码实际案例一

一、前言

现在AI人工智能概念炒的很火,人们到处听到的讯息是AI人工智能颠覆我们的生活,或者是代替什么岗位,但是到底AI能帮助到我们什么,能给我们生活带来什么?可能我们普通人没有能真正的感知到!笔者本身就是一个多年研发经验的JAVA工程师,笔者把实际工作过程中,运用的简单场景分解成简单的教案共享到社会中,希望能让更多的IT从业者能享受到人工智能带来的巨大福利!

二、 AI人工智能是什么

人工智能把它看成是一个巨大的无限的机器人或者是巨型的知识库,它能是模拟人类的神经大脑的一个创造的巨大的机器人,它可以通过自主学习与训练变得知识变得越来越丰富!我们普通人就帮它看成一个机器人即可!这个机器人可以协助你帮助你做一些工作、生活的事情,你要指导它、训练它让它为你所用!我们都看过施瓦辛格《未来战士》的天网,AI类似于天网的概念!你可能从脑子里想象你可以给他对话,他是你的管家!很多电影都有类似这些场景!笔者主要是从实际运用出发!就是生活中我们怎么运用到人工智能!

三、AI人工智能平台的选取“通义千问”

作者的课程主要用到AI平台是

通义千问

通义千问是阿里云研发的一款超大规模预训练语言模型,能够进行多轮对话、文案创作、逻辑推理、多模态理解及多语言支持等功能。4月7日,阿里云通义千问开源320亿参数模型Qwen1.5-32B,加上此前已经开源的5亿、18亿、40亿、70亿、140亿和720亿参数的六款大语言模型,至此凑齐阿里云的开源“葫芦娃”家族。

通义千问可应用于客户服务、在线教育、内容创作、智能搜索等诸多领域,通过与用户进行自然对话的方式提供帮助和服务。

https://tongyi.aliyun.com/qianwen/

在这里插入图片描述

在这里插入图片描述

四、实际案例场景

(一)实际需求:

实际工作需要写一个简单ETL工具,也就是将Mysql数据库读出来用jdbc插入到clickhouse数据库!

(二)与AI描述需求口令

这个相当于是代码逻辑需求讲述口令,这个口令是要了解计算机编程原理的,你要引领AI,所以你首先要有很明确的思路!

步骤思路引导1

口令1:帮我用java代码生成JDBC接口一个插入clickhouse数据库的实际代码例子

这个口令要明确说出用什么语言,用什么接口,先要一个比较范围大的概念,然后按实际生成代码调试过程,让AI帮你修改,改进,当然真正负责调整检查的也是你!AI只是干活的!

在这里插入图片描述

简单的代码生成了,你拿着代码去自己的JAVA编辑器跑跑!

并跑通了!

步骤思路引导2

然后自己根据最简单的AI编码封装一个通用的方法这个还是需要自己做的,稍微改改!

public static int update(Connection conn, String sql, ArrayList paraList) throws Exception { int result = 0;try { PreparedStatement ps = null;ps = conn.prepareStatement(sql);if (paraList != null && paraList.size() > 0) { for (int i = 0; i < paraList.size(); i++) { ps.setObject(i + 1, paraList.get(i));}}result = ps.executeUpdate();if (ps != null) { ps.close();}} catch (Exception ex) { LogUtil.exceptionPrint(log, ex);throw new Exception(ex);}return result;}

然后我在跑跑代码跑通了!这个方法可以并入到我的项目的工具类里面!

但是笔者觉得这个代码,单独插入可以跑,作者还想用批处理提升一下性能,再封装一个方法!

直接将代码复制给AI,让它阅读!

在这里插入图片描述

注意:上方是代码,下方是描述,要一起发给AI,描述要准确,要不断根据实际需求修改描述,因为AI可能理解的不正确,或者它生成出来的不是你想要的!

步骤思路引导3

口令2 :这个是一个JAVA插入clickhouse JDBC的方法,我写让你帮我改进代码,用批处理实现,提升插入性能,每批5000条

在这里插入图片描述

AI回答的方法按我们的需求改进好了,我们把代码copy到自己项目的工具类跑跑!

下面是AI回答的内容:

好的,针对您的需求,这里是一个改进版的Java方法,该方法利用了ClickHouse JDBC驱动的批量处理功能来提高插入性能,每次批量插入5000条记录。请注意,ClickHouse的JDBC驱动支持批量插入,但具体的批量大小可能需要根据实际负载和系统配置进行调整。

import java.sql.BatchUpdateException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;public class ClickhouseBatchInsertExample { public static int batchUpdate(Connection conn, String sql, ArrayList<Object[]> paraList) throws SQLException { int[] results; PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); // 分批次执行 int batchSize = 5000; int batches = (int) Math.ceil((double) paraList.size() / batchSize); for (int batchIndex = 0; batchIndex < batches; batchIndex++) { int startIndex = batchIndex * batchSize; int endIndex = Math.min(startIndex + batchSize, paraList.size()); for (int i = startIndex; i < endIndex; i++) { Object[] params = paraList.get(i); for (int paramIndex = 0; paramIndex < params.length; paramIndex++) { ps.setObject(paramIndex + 1, params[paramIndex]); } ps.addBatch(); } // 执行当前批次的插入 results = ps.executeBatch(); } // 计算总共受影响的行数 int totalRowsAffected = 0; for (int r : results) { totalRowsAffected += r; } return totalRowsAffected; } catch (BatchUpdateException buex) { // 处理批量更新时可能出现的错误 int[] updateCounts = buex.getUpdateCounts(); int failedRowIndex = buex.getErrorCode(); // 这里仅打印错误信息,实际应用中可能需要更详细的错误处理逻辑 LogUtil.error(log, "批量插入发生错误,失败于第{}条记录", failedRowIndex); throw buex; } finally { if (ps != null) { try { ps.close(); } catch (SQLException ignored) { // 忽略关闭异常 } } } }}// 使用示例:ArrayList<Object[]> paraList = ... // 假设这是你的参数列表,每个元素都是一个Object数组,对应一条记录的所有字段值String sql = "INSERT INTO your_table (column1, column2, column3) VALUES (?, ?, ?)";try { int rowsAffected = batchUpdate(connection, sql, paraList); System.out.println("总共插入了 " + rowsAffected + " 条记录.");} catch (SQLException ex) { LogUtil.exceptionPrint(log, ex);}

步骤思路引导4

在这个版本中,我们遍历参数列表并将它们分批添加到PreparedStatement的批处理队列中,然后一次性执行整个批次的插入操作。同时,在finally块中确保了Statement的关闭,即使在执行过程中出现异常也能保证资源的释放。最后,还处理了可能出现的BatchUpdateException,以便捕获并报告批量插入过程中的任何错误。

在这里插入图片描述

把AI生成的代码复制到自己项目里面也是要人工调整的,AI生成的代码也不是全部正确的,也是的需要有开发基础的,去人工的调试,解决,修改AI生成的代码的!可能遇到有些类引入不到,或者是有些变量不对,异常捕获机制,参数,自己修改!

在这里插入图片描述

步骤思路引导5

我们还需要修改一下这个工具方法的参数

口令3:帮我把这个JAVA方法的ArrayList<Object[]> paraList改成List<ArrayList<Object>> paraList,帮我改下代码

AI回复的内容:

public int batchUpdate(Connection conn, String sql, List<ArrayList<Object>> paraList) { PreparedStatement ps = null; int[] results = null; try { ps = conn.prepareStatement(sql); // 分批次执行 int batchSize = 5000; int batches = (int) Math.ceil((double) paraList.size() / batchSize); for (int batchIndex = 0; batchIndex < batches; batchIndex++) { int startIndex = batchIndex * batchSize; int endIndex = Math.min(startIndex + batchSize, paraList.size()); for (int i = startIndex; i < endIndex; i++) { ArrayList<Object> params = paraList.get(i); for (int paramIndex = 0; paramIndex < params.size(); paramIndex++) { ps.setObject(paramIndex + 1, params.get(paramIndex)); } ps.addBatch(); } // 执行当前批次的插入 results = ps.executeBatch(); } // 计算总共受影响的行数 int totalRowsAffected = 0; for (int r : results) { totalRowsAffected += r; } return totalRowsAffected; } catch (Exception ex) { // 这里仅打印错误信息,实际应用中可能需要更详细的错误处理逻辑 LogUtil.exceptionPrint(log, ex); } finally { if (ps != null) { try { ps.close(); } catch (SQLException ignored) { // 忽略关闭异常 } } } return 0;}

重复的步骤再粘贴到自己项目跑一跑,然后修改报错,自己再调试,最终解决问题!

笔者经过测试验证,这段代码是真正可以跑的,并且执行成功!

五、让人工智能帮你解答你的代码错误或运行中遇到的问题案例

上述代码确实能执行,但是执行过程中又遇到新的问题!

原始代码执行过程中遇到报错,执行一会批处理之后,报错!

java.sql.SQLException: statement is closed

我的提问如下(代码附上,然后问题要针对性并且说明核心问题):

for (int i = startIndex; i < endIndex; i++) { ArrayList<Object> params = paraList.get(i); for (int paramIndex = 0; paramIndex < params.size(); paramIndex++) { ps.setObject(paramIndex + 1, params.get(paramIndex)); } ps.addBatch(); } // 执行当前批次的插入 results = ps.executeBatch(); } // 计算总共受影响的行数 int totalRowsAffected = 0; for (int r : results) { totalRowsAffected += r; } return totalRowsAffected;} catch (Exception ex) { // 这里仅打印错误信息,实际应用中可能需要更详细的错误处理逻辑 LogUtil.exceptionPrint(log, ex);} finally { if (ps != null) { try { ps.close(); } catch (SQLException ignored) { // 忽略关闭异常 } }}return 0;

}这段代码执行一会之后 java.sql.SQLException: statement is closed报错,帮我想想解决办法

口令:这段代码执行一会之后 java.sql.SQLException: statement is closed报错,帮我想想解决办法

AI的回答如下:

这个报错“java.sql.SQLException: statement is closed”通常意味着在尝试访问或操作PreparedStatement对象(ps)时,该对象已经被关闭。在这个代码片段中,尽管finally块中包含了关闭PreparedStatement的逻辑,但在某些情况下可能在执行完executeBatch后就提前关闭了PreparedStatement。

为了解决这个问题,确保在所有批次都执行完毕后再关闭PreparedStatement,可以将关闭PreparedStatement的代码移到finally块之外,放在for循环之后:

public static int batchUpdate(Connection conn, String sql, List<ArrayList<Object>> paraList) { PreparedStatement ps = null; int[] results = null; try { ps = conn.prepareStatement(sql); // 分批次执行 int batchSize = 5000; int batches = (int) Math.ceil((double) paraList.size() / batchSize); for (int batchIndex = 0; batchIndex < batches; batchIndex++) { // ...(中间批次处理代码不变) // 执行当前批次的插入 results = ps.executeBatch(); } // 计算总共受影响的行数 int totalRowsAffected = 0; for (int r : results) { totalRowsAffected += r; } } catch (Exception ex) { LogUtil.exceptionPrint(log, ex); } finally { if (ps != null) { try { // 移动到此处关闭PreparedStatement ps.close(); } catch (SQLException ignored) { // 忽略关闭异常 } } } return totalRowsAffected; // 直接返回totalRowsAffected,无需在finally块外再返回0}

另外,为了更好地处理可能出现的异常情况,可以在每个批次执行后检查是否存在异常,并根据需要采取相应的措施,而不是等到最后才抛出异常。例如,可以在每次executeBatch后增加try-catch逻辑,如果某一批次出现异常,则记录异常并决定是否继续执行后续批次。

AI已经反馈出代码的执行逻辑错误了,老办法,还是粘贴到自己的项目中跑一跑再试试!!

在这里插入图片描述

还是有些细微的错误,变量没有 声明!自己帮AI改改,问题不大!

在这里插入图片描述

AI居然也会偷懒,这段代码居然没有从源代码带过来,AI真可怕!偷懒!谁训练它学会省略的意识的!!!!!

六、人工智能改变生活的笔者总结

你给AI口令,让它生成代码,然后你再修改代码,然后你把代码不断回馈给AI,让它读懂之后,再不断的完善!最终达到目标,让你拿到你要的代码!前提是,你能引领AI,你需要有编程的思路与基础!而且你的口令描述要很具体并且要带有计算机AI可以读懂的逻辑描述!这个笔者会在今后的文章中拿更多的案例讲述!希望大家多关注!!

笔者经过测试验证,这段代码已经真正用到我的ETL项目中,并且再生产中执行,AI人工智能帮我真正提升了工作效率,笔者觉得有AI的加持,笔者的编程水平从有限变成了无限,因为AI是无限自主学习的,它的编程水平肯定高过我们任意一个人,但是我们掌握着逻辑也灵性,我们才是驾驭人工智能的第一批先驱人类,跟笔者一起学习吧!

七、笔者简介

国内某一线知名软件公司企业认证在职员工:任JAVA高级研发工程师,大数据领域专家,数据库领域专家兼任高级DBA!10年软件开发经验!现任国内某大型软件公司大数据研发工程师、MySQL数据库DBA,软件架构师。直接参与设计国家级亿级别大数据项目!并维护真实企业级生产数据库300余个!紧急处理数据库生产事故上百起,挽回数据丢失所造成的灾难损失不计其数!并为某国家级大数据系统的技术方案(国家知识产权局颁布)专利权的第一专利发明人!

在这里插入图片描述

在这里插入图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。