使用'ParameterizedPreparedStatementSetter'设置参数时,有没有更好的方法来优化代码?

问题描述 投票:1回答:2

实际上我正在使用JDBCTemplate,它可以使用ParameterizedPreparedStatementSetter对象进行批量插入。

但是,当参数很多时,在查询中设置参数是非常不舒服的。就我而言,它实际上有44个参数。这是我的代码。

jdbcTemplate.batchUpdate(query.toString(), batchArgs, listSize,
            new ParameterizedPreparedStatementSetter<DocUsageDTO>() {
                @Override
                public void setValues(PreparedStatement ps, DocUsageDTO arg) throws SQLException {
                    ps.setString(1, arg.getClientIp());
                    ps.setInt(2, arg.getClientOs());
                    ps.setString(3, arg.getClientOsVersion());
                    ps.setString(4, arg.getContentCode());
                    ps.setString(5, arg.getContentCreateTime());
                    ps.setString(6, arg.getContentName());
                    ps.setString(7, arg.getCurrentContentName());
                    ps.setString(8, arg.getDeptCode());
                    ps.setString(9, arg.getDeptName());
                    ps.setString(10, arg.getDomainCode());
                    ps.setString(11, arg.getEtc1());
                    ps.setString(12, arg.getEtc2());
                    ps.setString(13, arg.getEtc3());
                    ps.setString(14, arg.getEtc4());
                    ps.setString(15, arg.getEtc5());
                    ps.setString(16, arg.getFileSyncId());
                    ps.setString(17, arg.getFileSyncManagerCode());
                    ps.setString(18, arg.getFileSyncManagerName());
                    ps.setString(19, arg.getFileSyncRevisionNo());
                    ps.setString(20, arg.getFileSyncTagCode());
                    ps.setString(21, arg.getFileSyncTagName());
                    ps.setInt(22, arg.getLocationContext());
                    ps.setString(23, arg.getLogDate());
                    ps.setInt(24, arg.getLogType());
                    ps.setString(25, arg.getOwnerCode());
                    ps.setString(26, arg.getOwnerDeptCode());
                    ps.setString(27, arg.getOwnerDeptName());
                    ps.setString(28, arg.getOwnerName());
                    ps.setString(29, arg.getPositionCode());
                    ps.setString(30, arg.getPositionName());
                    ps.setString(31, arg.getProcessCode());
                    ps.setString(32, arg.getProcessName());
                    ps.setInt(33, arg.getProductType());
                    ps.setInt(34, arg.getPurpose());
                    ps.setInt(35, arg.getPurposeFailReason());
                    ps.setInt(36, arg.getPurposeStatus());
                    ps.setString(37, arg.getSecLevelCode());
                    ps.setString(38, arg.getSecLevelName());
                    ps.setString(39, arg.getUserCode());
                    ps.setString(40, arg.getUserName());
                    ps.setString(41, arg.getWriterCode());
                    ps.setString(42, arg.getWriterDeptCode());
                    ps.setString(43, arg.getWriterDeptName());
                    ps.setString(44, arg.getWriterName());
                }
            });

在使用ParameterizedPreparedStatementSetter设置参数时是否有更好的方法来优化代码?

java jdbctemplate
2个回答
0
投票
any代码看起来很庞大。

[您可以尝试NamedParameterJdbcTemplate在地图中提供参数,但是您将以某种方式将这44个参数放入地图中,这仍然需要相等数量的代码。

您可以将当前的StatementSetter变成一个真实的类(而不是现在的匿名类),然后至少将其封装起来并且看不见。毕竟,这只是外观问题,代码本身没有错。这样可以使您的服务等级看起来更干净,例如

jdbcTemplate.batchUpdate(query.toString(), batchArgs, listSize, new DocUsageDTOSetter());

实际上,您不一定需要NamedParameterJdbcTemplate的映射,因为它可以使用bean source。但是,这需要参数名称与属性匹配。这意味着INSERT INTO FOO(bar, baz) VALUES (?, ?)变为INSERT INTO FOO(bar, baz) VALUES (:myBeanProperty1, :myBeanProperty2),并且您需要做一些额外的工作来包装DTO。因此,该方法不会产生任何更简洁的代码。


0
投票
Connection con=getConnection(); String query="select * from my_table where name=:name or docUsageDTO =:docUsageDTO "; NamedParameterStatement p=new NamedParameterStatement(con, query); p.setString("name", "bob"); p.setString("docUsageDTO", arg); // this just expects all paramters as string ! Didn't want to copy and edit your lengthy code ResultSet rs=p.executeQuery();

这样,也许您可​​以创建通用方法来设置参数,方法是通过循环传入参数名称和值,或者减少代码的方式。

否则,如果您想减少代码但不介意添加繁重的库,那么使用Hibernate可以减轻您的负担。
© www.soinside.com 2019 - 2024. All rights reserved.