当前位置:   article > 正文

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

java开发ai

高级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/
  • 1

在这里插入图片描述
在这里插入图片描述

四、实际案例场景

(一)实际需求:

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

(二)与AI描述需求口令

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

步骤思路引导1
口令1:帮我用java代码生成JDBC接口一个插入clickhouse数据库的实际代码例子
  • 1

这个口令要明确说出用什么语言,用什么接口,先要一个比较范围大的概念,然后按实际生成代码调试过程,让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;
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

然后我在跑跑代码跑通了!这个方法可以并入到我的项目的工具类里面!
但是笔者觉得这个代码,单独插入可以跑,作者还想用批处理提升一下性能,再封装一个方法!

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

在这里插入图片描述

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

步骤思路引导3

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

在这里插入图片描述
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);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

步骤思路引导4

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

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

在这里插入图片描述

步骤思路引导5

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

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

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

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

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

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

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

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

 java.sql.SQLException: statement is closed
  • 1

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

        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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

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

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

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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

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

AI已经反馈出代码的执行逻辑错误了,老办法,还是粘贴到自己的项目中跑一跑再试试!!
在这里插入图片描述
还是有些细微的错误,变量没有 声明!自己帮AI改改,问题不大!
在这里插入图片描述
AI居然也会偷懒,这段代码居然没有从源代码带过来,AI真可怕!偷懒!谁训练它学会省略的意识的!!!!!

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

你给AI口令,让它生成代码,然后你再修改代码,然后你把代码不断回馈给AI,让它读懂之后,再不断的完善!最终达到目标,让你拿到你要的代码!前提是,你能引领AI,你需要有编程的思路与基础!而且你的口令描述要很具体并且要带有计算机AI可以读懂的逻辑描述!这个笔者会在今后的文章中拿更多的案例讲述!希望大家多关注!!
笔者经过测试验证,这段代码已经真正用到我的ETL项目中,并且再生产中执行,AI人工智能帮我真正提升了工作效率,笔者觉得有AI的加持,笔者的编程水平从有限变成了无限,因为AI是无限自主学习的,它的编程水平肯定高过我们任意一个人,但是我们掌握着逻辑也灵性,我们才是驾驭人工智能的第一批先驱人类,跟笔者一起学习吧!

七、笔者简介

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

在这里插入图片描述

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/542771
推荐阅读
相关标签
  

闽ICP备14008679号