写在前面
- 适用场景:数据可视化大屏、纯取数据的场景(一些简单查询)
- 想要快速上线接口,不想写
service
、mapper
、xml
层代码 - 别问,问就是敏捷开发(摆烂
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping()
public Result test() {
String sql = "select * from sys_user where user_id = 1";
Map<String, Object> map = jdbcTemplate.queryForMap(sql);
return Result.success(map);
}
}
- 优化代码1
避免被前端吐槽,字段名使用驼峰形式
规避SQL 注入风险,使用参数化查询
@GetMapping("{id}")
public Result getUserById(@PathVariable Long id) {
String sql = "select * from sys_user where user_id = ?";
Map<String, Object> map = jdbcTemplate.queryForMap(sql, id);
return MapUtils.isEmpty(map) ? Result.error() : Result.success(MapUtil.toCamelCaseMap(map));
}
- 优化代码2
查询结果映射到 Java 实体类
异常处理,这里使用的是queryForObject
,预期查询结果只有一行。如果查询结果为空或有多行,将会抛出异常。
String sql = "select * from sys_user where user_id = ?";
try {
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);
return Result.success(user);
} catch (EmptyResultDataAccessException e) {
log.error("Ops!", e);
return Result.error("查询结果为空!");
}
多个占位符情况
SQL 查询语句中有多个占位符时,按照顺序依次填入即可
String sql = "select * from sys_user where user_name = ? and sex = ?";
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), "ry", "1");
System.out.println(JSON.toJSONString(user));