Проблема в том, что количество параметров в операторе SQL не совпадает с количеством предоставленных аргументов. Это не очевидно, глядя на код, но
Object[] obj = new Object[3];
obj[0] = "Duke";
jdbcTemplate.update(sql, obj);
в основном совпадает с
jdbcTemplate.update(sql, new Object[] { "Duke", null, null });
JdbcTemplate предполагает, что число параметров в операторе SQL и в массиве предоставленных аргументов одинаково.
Для обработки различного количества аргументов вы можете перейти от массивов к спискам
List<Object> args = new ArrayList<>();
// some logic with args.add(...)
jdbcTemplate.update(sql, args.toArray());
Альтернативой является NamedParameterJdbcTemplate:
Map<String, Object> args = new HashMap<>();
args.put("name", "Duke");
NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
jdbcTemplate.update("UPDATE user SET name = :name", args);