在spring-boot-starter-jdbc
這個依賴包中一共分成四個部分。
- core,JdbcTemplate等相關核心接口和類
- datasource,數據源相關的輔助類
- object,將基本的jdbc操作封裝成對象
- support,錯誤碼等其他輔助工具
這里對JdbcTemplate這個類進行描述。JdbcTemplate是Spring對JDBC的封裝,目的是使JDBC更加易於使用。JdbcTemplate處理了資源的建立和釋放。他幫助我們避免一些常見的錯誤,比如忘了總要關閉連接。他運行核心的JDBC工作流,如Statement的建立和執行,而我們只需要提供SQL語句和提取結果。
JdbcTemplate提供的方法
在JdbcTemplate中執行SQL語句的方法大致分為3類。
- execute,可以執行所有的sql語句,一般用來執行ddl語句
- update,用於執行insert、update、delete等dml語句
- queryXXX,用於DQL數據查詢語句
execute方法
@GetMapping("/api/jdbc-oper/createTable")
public void createTable() {
String sql = "create table product (id int primary key auto_increment,name varchar(64),description varchar(128))";
jdbcTemplate.execute(sql);
}
update方法
@GetMapping("/api/jdbc-oper/addData")
public void addData() {
String sql = "insert into product(name) values(?)";
Arrays.asList("Java編程思想", "Spring boot in action", "spark")
.forEach(p -> {
jdbcTemplate.update(sql, p);
});
}
@GetMapping("/api/jdbc-oper/updateData")
public void updateData() {
String sql = "update product set description='這是Java編程思想' where name ='Java編程思想'";
jdbcTemplate.update(sql);
}
@GetMapping("/api/jdbc-oper/deleteData")
public void deleteData() {
String sql = "";
jdbcTemplate.update(sql);
}
queryXXX方法
查詢一個字段的場景
@GetMapping("/api/jdbc-oper/queryForInt")
public void queryForInt() {
String sql = "select count(*) from product";
Integer totalNum = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(totalNum);
}
查詢一個普通列表的場景
@GetMapping("/api/jdbc-oper/queryName")
public void queryName() {
String sql = "select name from product";
List<String> names = jdbcTemplate.queryForList(sql, String.class);
System.out.println(names);
}
查詢一個對象列表的場景
@GetMapping("/api/jdbc-oper/queryProduct")
public void queryProduct() {
String sql = "select * from product";
List<Product> productList = jdbcTemplate.query(sql, new RowMapper<Product>() {
@Nullable
@Override
public Product mapRow(ResultSet resultSet, int i) throws SQLException {
return Product.builder()
.id(resultSet.getInt(1))
.name(resultSet.getString(2))
.build();
}
});
productList.forEach(product -> log.info("product:{}", product));
}
批量操作的方法
@GetMapping("/api/jdbc-oper/batchInsert")
public void batchInsert() {
String sql = "insert into product (name) values (?)";
List<String> products = Arrays.asList("product1", "product2", "product3");
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
preparedStatement.setString(1, products.get(i));
}
@Override
public int getBatchSize() {
return products.size();
}
});
}