Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用';设置参数时,有没有更好的方法来优化代码;参数化PreparedStatementSetter';?_Java_Jdbctemplate - Fatal编程技术网

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

Java 在使用';设置参数时,有没有更好的方法来优化代码;参数化PreparedStatementSetter';?,java,jdbctemplate,Java,Jdbctemplate,实际上,我使用的是JDBCTemplate,它可以使用ParameterizedPreparedStatementSetter对象批插入 然而,当查询有很多参数时,在查询中设置参数是非常不舒服的。 在我的例子中,实际上,它有44个参数。 这是我的密码 jdbcTemplate.batchUpdate(query.toString(), batchArgs, listSize, new ParameterizedPreparedStatementSetter<DocU

实际上,我使用的是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());
                }
            });
jdbcTemplate.batchUpdate(query.toString(),batchArgs,listSize,
新的参数化PreparedStatementSetter(){
@凌驾
public void setValues(PreparedStatement ps,DocUsageDTO arg)引发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.getFileSyncManager代码());
ps.setString(18,arg.getFileSyncManagerName());
ps.setString(19,arg.getfilesyncrevisinno());
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.getpurpostatus());
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设置参数时,有没有更好的方法来优化代码?

您可以使用命名参数语句,而不是像这样手动分配每个参数,以提高可读性:

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可以减轻您的负担。

您可以使用命名参数语句,而不是像这样手动分配每个参数,以提高可读性:

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可以减轻您的负担。

您的问题不是
ParameterizedPreparedStatementSetter
,而是您的查询具有如此多的参数,以至于任何代码看起来都很笨重

您可以尝试
NamedParameterJdbcTemplate
在映射中提供参数,但随后您将以某种方式将这44个参数放入映射中,这可能仍然需要相同数量的代码

您可以将当前的StatementSetter转换为一个真正的类(而不是现在的匿名类),然后它至少会被封装并消失在视线之外。毕竟这只是一个外观问题,代码本身没有什么问题。这会让你的服务类看起来更干净,比如

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

事实上,你不一定需要一张地图,因为它可以使用地图。但是,这需要参数名称与属性匹配。这意味着
INSERT-INTO-FOO(bar,baz)值(?,)
变为
INSERT-INTO-FOO(bar,baz)值(:mybeanproperty 1,:mybeanproperty 2)
,您必须将每个数据打包。因此,您需要将(源代码)字符移动到另一个位置,并添加一些额外的对象创建。

您的问题不是
ParameterizedPreparedStatementSetter
,而是您的查询有太多的参数,以至于任何代码看起来都很庞大

您可以尝试
NamedParameterJdbcTemplate
在映射中提供参数,但随后您将以某种方式将这44个参数放入映射中,这可能仍然需要相同数量的代码

您可以将当前的StatementSetter转换为一个真正的类(而不是我所说的匿名类)