高级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余个!紧急处理数据库生产事故上百起,挽回数据丢失所造成的灾难损失不计其数!并为某国家级大数据系统的技术方案(国家知识产权局颁布)专利权的第一专利发明人!
文章评论