将数组对象传递给 jdbc 查询
Passing array object to jdbc query
我正在开发一个应用程序,我想在其中比较来自移动设备的 phone 号码列表与数据库 (MYSQL)。我将 phone 数字作为数组列表传递。
这是我的代码:
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("1212121212");
arrayList.add("1234567890");
arrayList.add("1515151515");
arrayList.add("1111111111");
arrayList.add("2222222222");
arrayList.add("3333333333");
List<UserDO> userDOs = userDAOImpl.getExistingMobileNumber(arrayList);
上面的代码是我的测试用例,下面的代码是我选择手机号码的数据库查询
private static final String SELECT_MOBILE_NUMBER = "SELECT USER_ID, USER_NAME, REGISTRATION_ID, MOBILE_NUMBER FROM USER WHERE MOBILE_NUMBER IN (?)";
这是我的 DAOImpl 代码:
public List<UserDO> getExistingMobileNumber(ArrayList<String> mobileNumbers) throws UserDataException {
JdbcTemplate jd = this.getJdbctemplate();
List<UserDO> userDOs = jd.query(SELECT_MOBILE_NUMBER, new Object[] { mobileNumbers }, new RowMapper<UserDO>(){
@Override
public UserDO mapRow(ResultSet rs, int rowNum) throws SQLException {
UserDO userDO = new UserDO();
userDO.setMobileNumber(rs.getString(4));
return userDO;
}
});
return userDOs;
}
实际上我的问题是当我按照以下代码将手机作为字符串传递时
List<UserDO> userDOs = jd.query(SELECT_MOBILE_NUMBER, new Object[] { "2222222222" }, new RowMapper<UserDO>(){
......
......
}
}
它工作正常,当我作为 "mobileNumbers" 而不是“2222222222”传递时它给出预期的 output.But 它没有给出预期的 output.Any 一个解释我,我们可以传递数组列表对象在 jdbc Template Query() 中。如果是这样,我们如何通过?
提前致谢
在您的解决方案中使用
query(String sql, Object[] args, RowMapper rowMapper)
的方法
你可以使用
query(PreparedStatementCreator psc, RowMapper rowMapper)
并使用您自己的查询和 arrayList 创建 prepareStatement。
您的 SQL 查询中需要多个 ?
,具体取决于 ArrayList
中的项目数。因此,使用 StringBuilder
构建您的 SQL 查询:
StringBuilder sql = new StringBuilder()
sql.append("SELECT USER_ID, USER_NAME, REGISTRATION_ID, MOBILE_NUMBER FROM USER WHERE MOBILE_NUMBER IN (");
for(String mobileNumber: mobileNumbers) {
sql.append("?,");
}
sql.append(")");
//use this to remove the extra comma at the end of your IN() clause
String query = sql.toString().replace(",)", ")");
//Convert your list to array for use with jdbcTemplate
Object[] params = mobileNumbers.toArray();
// if you have an entity class to map the resultset to, I suggest you use BeanPropertyRowMapper
List<YourEntityClass> list = jdbcTemplate.query(query, params, new BeanPropertyRowMapper<YourEntityClass>(YourEntityClass.class));
希望对您有所帮助。
编辑
在此处阅读更多内容
http://www.mkyong.com/spring/spring-jdbctemplate-querying-examples/
我正在开发一个应用程序,我想在其中比较来自移动设备的 phone 号码列表与数据库 (MYSQL)。我将 phone 数字作为数组列表传递。
这是我的代码:
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("1212121212");
arrayList.add("1234567890");
arrayList.add("1515151515");
arrayList.add("1111111111");
arrayList.add("2222222222");
arrayList.add("3333333333");
List<UserDO> userDOs = userDAOImpl.getExistingMobileNumber(arrayList);
上面的代码是我的测试用例,下面的代码是我选择手机号码的数据库查询
private static final String SELECT_MOBILE_NUMBER = "SELECT USER_ID, USER_NAME, REGISTRATION_ID, MOBILE_NUMBER FROM USER WHERE MOBILE_NUMBER IN (?)";
这是我的 DAOImpl 代码:
public List<UserDO> getExistingMobileNumber(ArrayList<String> mobileNumbers) throws UserDataException {
JdbcTemplate jd = this.getJdbctemplate();
List<UserDO> userDOs = jd.query(SELECT_MOBILE_NUMBER, new Object[] { mobileNumbers }, new RowMapper<UserDO>(){
@Override
public UserDO mapRow(ResultSet rs, int rowNum) throws SQLException {
UserDO userDO = new UserDO();
userDO.setMobileNumber(rs.getString(4));
return userDO;
}
});
return userDOs;
}
实际上我的问题是当我按照以下代码将手机作为字符串传递时
List<UserDO> userDOs = jd.query(SELECT_MOBILE_NUMBER, new Object[] { "2222222222" }, new RowMapper<UserDO>(){
......
......
}
}
它工作正常,当我作为 "mobileNumbers" 而不是“2222222222”传递时它给出预期的 output.But 它没有给出预期的 output.Any 一个解释我,我们可以传递数组列表对象在 jdbc Template Query() 中。如果是这样,我们如何通过?
提前致谢
在您的解决方案中使用
query(String sql, Object[] args, RowMapper rowMapper)
的方法
你可以使用
query(PreparedStatementCreator psc, RowMapper rowMapper)
并使用您自己的查询和 arrayList 创建 prepareStatement。
您的 SQL 查询中需要多个 ?
,具体取决于 ArrayList
中的项目数。因此,使用 StringBuilder
构建您的 SQL 查询:
StringBuilder sql = new StringBuilder()
sql.append("SELECT USER_ID, USER_NAME, REGISTRATION_ID, MOBILE_NUMBER FROM USER WHERE MOBILE_NUMBER IN (");
for(String mobileNumber: mobileNumbers) {
sql.append("?,");
}
sql.append(")");
//use this to remove the extra comma at the end of your IN() clause
String query = sql.toString().replace(",)", ")");
//Convert your list to array for use with jdbcTemplate
Object[] params = mobileNumbers.toArray();
// if you have an entity class to map the resultset to, I suggest you use BeanPropertyRowMapper
List<YourEntityClass> list = jdbcTemplate.query(query, params, new BeanPropertyRowMapper<YourEntityClass>(YourEntityClass.class));
希望对您有所帮助。
编辑
在此处阅读更多内容
http://www.mkyong.com/spring/spring-jdbctemplate-querying-examples/