jdbcTemplate(NamedParameterJdbcTemplate )使用
# 一、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.23</version>
</dependency>
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 二、示例代码
DataSource dataSource = new SimpleDriverDataSource(
BeanUtils.instantiateClass(org.postgresql.Driver.class),
"jdbc:postgresql://127.0.0.1:5432/postgres?charSet=UTF-8&&allowEncodingChanges=true&serverTimezone=Asia/Shanghai",
"postgres",
"123321");
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
Map<String,Object> rs = jdbcTemplate.queryForMap("select * from a001 where pkid='03ef5d004aa8441f976889a5b08c7e51'");
return rs;
@SpringBootTest
class JdbcTests {
@Resource
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Test
void getBean() {
//查询对象
String sql = "select * from ns_admin where id=:id";
Map<String,Object> param = new HashMap<>();
param.put("id",1);
RowMapper<Admin> rowMapper=new BeanPropertyRowMapper<>(Admin.class);
Admin user= namedParameterJdbcTemplate.queryForObject(sql,param,rowMapper);
System.out.println(user.getNickname());
// 查询列表
String sql2 = "select * from ns_admin where id>:id";
Map<String,Object> param2 = new HashMap<>();
param2.put("id",0);
List<Admin> list = namedParameterJdbcTemplate.query(sql2,param2,rowMapper);
for(Admin admin:list){
System.out.println(admin.getNickname());
}
//count、avg、sum
String sql3 ="select count(*) from ns_admin";
int count= namedParameterJdbcTemplate.queryForObject(sql3,new MapSqlParameterSource(),Integer.class);
int sum= namedParameterJdbcTemplate.queryForObject("select sum(id) from ns_admin",new MapSqlParameterSource(),Integer.class);
int avg= namedParameterJdbcTemplate.queryForObject("select avg(id) from ns_admin",new MapSqlParameterSource(),Integer.class);
System.out.println(count);
System.out.println(sum);
System.out.println(avg);
//like
String sql4 ="select * from ns_admin where nickname like :nickname";
Map<String,Object> param4 = new HashMap<>();
//拼在变量上面
param4.put("nickname","李%");
// param4.put("nickname","%李%");
// param4.put("nickname","%李");
List<Admin> list4 = namedParameterJdbcTemplate.query(sql4,param4,rowMapper);
for(Admin admin:list4){
System.out.println(admin.getNickname());
}
//like
String sql5 ="select * from ns_admin where id in (:ids)";
Map<String,Object> param5 = new HashMap<>();
//拼在变量上面
param5.put("ids", Arrays.asList("1","2"));
List<Admin> list5 = namedParameterJdbcTemplate.query(sql5,param5,rowMapper);
for(Admin admin:list5){
System.out.println(admin.getNickname());
}
//执行sql
String rs = namedParameterJdbcTemplate.execute("CREATE TABLE sui_persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) )", preparedStatement -> {
preparedStatement.execute();
return "success";
});
}
private static class Admin {
private Long id;
private String username;
private String nickname;
private String password;
private Integer logintime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getLogintime() {
return logintime;
}
public void setLogintime(Integer logintime) {
this.logintime = logintime;
}
}
}
@Component
public class SimpleJdbcUtils {
@Resource
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
/**
* map形式插入数据;如果map中的key和数据库不对应,会抛出异常
* @param tableName 表名
* @param map 参数,key(数据库字段)-value(字段对应数据)
* @return 影响数据行数
*/
public int insertFun(String tableName,Map<String,Object> map){
return this.insertFun(tableName,map,true);
}
/**
* map形式插入数据;如果map中的key和数据库不对应,会抛出异常
* @param tableName 表名
* @param map 参数,key(数据库字段)-value(字段对应数据)
* @param ignoreNull 是否忽略null(如果是值是null,直接忽略key-value)
* @return 影响数据行数
*/
public int insertFun(String tableName,Map<String,Object> map,boolean ignoreNull){
if(map==null||map.isEmpty()){
throw new BusinessException("数据为空");
}
//如果设置了忽略null,过滤掉null
if(ignoreNull){
Set<Map.Entry<String,Object>> realData = map.entrySet();
// 过滤null
map = realData.stream()
.filter(ObjEntry -> ObjEntry.getValue()!=null)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
//判断过滤后的值是不是空
if(map.isEmpty()){
throw new BusinessException("数据为空");
}
}
//拼接insert语句
Set<String> keys = map.keySet();
int sizeIndex = keys.size()-1;
StringBuilder insertSql = new StringBuilder("INSERT INTO " + tableName + "(");
int index = 0;
for (String k:keys){
if(index<sizeIndex){
insertSql.append(k).append(",");
}else{
insertSql.append(k);
insertSql.append(") VALUES (");
}
index=index+1;
}
index = 0;
for (String k:keys){
if(index<sizeIndex){
insertSql.append(":").append(k).append(",");
}else{
insertSql.append(":").append(k).append(")");
}
index=index+1;
}
return namedParameterJdbcTemplate.update(insertSql.toString(), map);
}
/**
* map形式更新数据;如果map和where中的key和数据库不对应,会抛出异常
* where条件只支持key=value形式
* @param tableName 表名
* @param map 数据,key(数据库字段)-value(字段对应数据)
* @param where where条件数据,key(数据库字段)-value(字段对应数据)
* @return 影响数据行数
*/
public int updateFun(String tableName,Map<String,Object> map,Map<String,Object> where){
if(map==null||map.isEmpty()){
throw new BusinessException("数据为空");
}
//拼接update set语句
Set<String> keys = map.keySet();
int sizeIndex = keys.size()-1;
StringBuilder updateSql = new StringBuilder("UPDATE " + tableName + " SET ");
int index = 0;
for (String k:keys){
if(index<sizeIndex){
updateSql.append(k).append("=:").append(k).append(",");
}else{
updateSql.append(k).append("=:").append(k);
}
index=index+1;
}
//最终参数
Map<String,Object> params = new HashMap<>(map);
//拼接where
if(where!=null&&!where.isEmpty()){
index = 0;
Set<Map.Entry<String,Object>> whereSet = where.entrySet();
int whereSizeIndex = whereSet.size()-1;
updateSql.append(" where ");
for (Map.Entry<String,Object> w:whereSet){
String k = w.getKey();
//把where条件也放到最终参数中
params.put(k,w.getValue());
//拼接where参数
if(index<whereSizeIndex){
updateSql.append(k).append("=:").append(k).append(",");
}else{
updateSql.append(k).append("=:").append(k);
}
index=index+1;
}
}
return namedParameterJdbcTemplate.update(updateSql.toString(), params);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
# 三、常见驱动名称
//oracle
driverClass:oracle.jdbc.driver.OracleDriver
jdbcUrl:jdbc:oracle:thin:@192.168.0.1:1521:yourDBName
//SQL Server
driverClass:com.microsoft.sqlserver.jdbc.SQLServerDriver(2005版本及以后)
com.microsoft.jdbc.sqlserver.SQLServerDriver(2000版本)
jdbcUrl:jdbc:sqlserver://192.168.0.1:1433;databasename=yourDBName
//pgsql
driverClass:org.postgresql.Driver
jdbcUrl:jdbc:postgresql://127.0.0.1:5432/yourDBName
//MySQL
driverClass:com.mysql.jdbc.Driver
jdbcUrl:jdbc:mysql://192.168.0.1:3306/yourDBName
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 四、参考:
上次更新: 2024/01/07, 07:44:52