一、Jdbctemplate方式

传统的Jdbctemplate类无法直接向in语句传递参数,需要通过字符串拼接的方式来实现。例如:

1.常见的通过占位符查询结果方式(无法适用in语句)

//查询id等于123的用户信息
String sql = "select * from user where id = ?"; 
Map<String, Object> args = new HashMap<>();
args.put("id", 123);
jdbcTemplate.queryForList(sql, args , User.class )

2.如果使用上述方式向in语句中传递参数

//查询id为1,2,3的用户信息
String sql = "select * from user where id in (?)"; 
Map<String, Object> args = new HashMap<>();
int[] ids = {1,2,3}
args.put("id", ids);
jdbcTemplate.queryForList(sql, args , User.class ); 

这里查询语句被替换后如下,执行时会报错

//不符合sql语句规范
select * from user where id in ([1,2,3])

3.解决方案:使用字符串拼接

String ids = "1,2,3";
String sql = "select * from user where id in (" + ids +")";

如果入参是字符串,要用两个单引号' 内容'引起来,这样就满足SQL的语法,例如:

String ids = "'1','2','3'";
String sql = "select * from user where id in (" + ids +")";

二、NamedParameterJdbcTemplate方式

Jdbctemplate是比较底层的类,因此功能比较有局限性。NamedParameterJdbcTemplate是对Jdbctemplate的再次封装,它可以使用具名参数来绑定Sql参数。一系列具名参数组成一个map传入,这样传参的顺序就没有限制了。

使用NamedParameterJdbcTemplate实现in语句的传参非常简单,如下:

String sql = "select * from user where name in (:names)";
String[] arr = {"张三","李四","王五"};
ArrayList<String> names = new ArrayList<String>(Arrays.asList(arr));
Map<String, Obeject> args = new HashMap<String,Object>();
args.put("names", names);
NamedParameterJdbcTemplate jdbcTmeplate = new NameParameterJdbcTemplate(jdbctemplate);
jdbcTemplate.queryForList(sql,args);

使用Jdbctemplate传递给in语句参数时,如果参数是固定的,那么拼接成字符串很简单。但是如果参数不固定,是通过数组或列表给出的。那么在进行字符串拼接时,就会比较复杂麻烦,需要将数组的值转换成字符串,每个元素用逗号分隔并用单引号括起来。综合比较,给in语句传递参数推荐使用NamedParameterJdbcTemplate类来实现。

试了半天,终于找到了 JdbcTemplate in的用法, JdbcTemplate 自己不能 使用 in,借助NamedParameter JdbcTemplate 能实现in的用法 @Autowired private DataSource dataSource; //数据源注入即可 使用 public void assignBatch(List todoIds, String teamMem
第一种方法:in 条件为拼接好的字符串 如果直接传入拼接好的where in 条件, 比如('111','222','333'),则需要 使用 ${idlist}传参,即绝对引用,而不能 使用 # 如果 使用 #传参会被mybatis当成字符串再添加一层''引号,导致错误, 优点:简单方便,高效, 缺点:不能防止 SQL 注入 第二种方法:in 条件为List对象 in条件直接传入List对象,让mybatis再去拼接生成in条件,这个很麻烦,但是可以防止 SQL 注入第三种方法:in 条件为Strin...
JdbcTemplate 向in 语句 传参 spring jdbc 包提供了 JdbcTemplate 和它的两个兄弟Simple JdbcTemplate 和NamedParameter JdbcTemplate ,我们先从 JdbcTemplate 入手, 引入问题,领略一下类NamedParameter JdbcTemplate 在处理where 包含in时的便利和优雅。 首先创建实体类Employee:...
jdbcTemplate in()传参1. JdbcTemplate 2.NamedParameter JdbcTemplate 3.传参 1. JdbcTemplate 传统的 jdbc 模板,这里 jdbctemplate 的in 语句 传参没有搞出来,建议更换为or,如果非要用 jdbcTemplate 的话。 2.NamedParameter JdbcTemplate 看类名也知道,具体的名字 参数 jdbc Temp...
JdbcTemplate 进行带in条件 SQL 语句 查询返回集合 在 使用 Spring jdbcTemplate 时, 使用 in作为条件查询时,碰到一点问题。直接 使用 jdbcTemplate 进行查询会将集合类型的 参数 解析成多个问号?拼接成的占位符,将集合变成字符串的话,My SQL 会报错提示Truncated incorrect DOUBLE value。 试过多种处理方案后,发现可以借助org. spring framework. jdbc .core.namedparam.NamedParameter Jdbc Templat
private JdbcTemplate jdbcTemplate ; public PasswordUpdater( JdbcTemplate jdbcTemplate ) { this. jdbcTemplate = jdbcTemplate ; public void updatePassword(String username, String newPassword) { String sql = "UPDATE users SET password = ? WHERE username = ?"; jdbcTemplate .update( sql , newPassword, username); 首先,我们需要创建一个 ` JdbcTemplate ` 对象并将其传递给 `PasswordUpdater` 类的构造函数。 然后,我们可以 使用 ` jdbcTemplate .update()` 方法来执行 SQL 更新 语句 。在此示例 ,我们将传递两个 参数 :新密码和用户名。这些 参数 将自动转义,以防止 SQL 注入攻击。 最后,我们可以在应用程序的其他部分 使用 `PasswordUpdater` 类来更新数据库 的密码。例如: ``` java JdbcTemplate jdbcTemplate = new JdbcTemplate (dataSource); PasswordUpdater passwordUpdater = new PasswordUpdater( jdbcTemplate ); passwordUpdater.updatePassword("myuser", "newpassword"); 这将 使用 给定的 ` JdbcTemplate ` 对象将 `myuser` 用户的密码更新为 `newpassword`。