一、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`。