JdbcTemplate
Spring对Jdbc操作做了封装,提供一个较为简单的实现 —— JdbcTemplate,使得开发人员的Jdbc操作更加简单方便
使用步骤
导入Spring的jar包
<properties>
<java.version>1.8</java.version>
<spring.version>5.2.6.RELEASE</spring.version>
</properties>
<!-- spring dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
创建JdbcTemplate对象
这个JdbcTemplate对象依赖于DataSource
使用JdbcTemplate
调用方法来完成数据库操作
update()
进行DML操作,增删改query()
可以传入一个sql字符串,以及一个RowMapper对象,可以使用Spring提供的RowMapper实现 —— BeanPropertyRowMapper。更方便的进行JavaBean封装queryForMap()
注意这个方法期望返回值只有1条记录queryForList()
将每一行记录封装成一个Map,再把所有Map塞到一个List里queryForObject
常用于聚合操作
代码示例
private JdbcTemplate jdbcTemplate;
@Before
public void init(){
//创建JdbcTemplate,只需要传入一个DataSource即可
jdbcTemplate = new JdbcTemplate(DruidUtil.getDataSource());
}
@Test
public void testUpdate(){
//JdbcTemplate会自动调用DataSource创建链接
//查询完毕后会自动释放连接,这样代码就变得简洁了许多
String sql = "UPDATE product SET price = ? WHERE name = ?";
int i = jdbcTemplate.update(sql, 450, "日炎斗篷");
System.out.println(i + " rows affected");
}
//执行结果
//1 rows affected
@Test
public void testSelect(){
String sql = "SELECT * FROM product WHERE id = 1";
//注意queryForMap方法期望只返回一行记录
//若没有返回,或返回的记录数大于1,则会报错
Map<String, Object> result = jdbcTemplate.queryForMap(sql);
System.out.println(result);
}
//执行结果
/**
{id=1, name=无尽之刃, price=3600.00, seller_id=99, buyer_id=101}
**/
@Test
public void testQueryForList(){
String sql = "SELECT * FROM product";
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
for (Map map : maps){
System.out.println(map);
}
}
/***执行结果
{id=1, name=无尽之刃, price=3600.00, seller_id=99, buyer_id=101}
{id=2, name=最后的轻语, price=2300.00, seller_id=null, buyer_id=null}
{id=3, name=日炎斗篷, price=450.00, seller_id=null, buyer_id=null}
{id=4, name=破败王者之刃, price=2000.00, seller_id=null, buyer_id=null}
{id=5, name=狂徒铠甲, price=22000.00, seller_id=null, buyer_id=null}
**/
//query方法可以传入一个RowMapper参数,用于封装数据,当然也可以用lambda表达式
@Test
public void TestQuery(){
String sql = "SELECT * FROM product";
List<Product> productList = jdbcTemplate.query(sql, new RowMapper<Product>() {
@Override
public Product mapRow(ResultSet resultSet, int i) throws SQLException {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
double price = resultSet.getDouble("price");
int seller_id = resultSet.getInt("seller_id");
int buyer_id = resultSet.getInt("buyer_id");
return new Product(id, name, price, seller_id, buyer_id);
}
});
System.out.println(productList.size());
}
//执行结果
//5
//可以用Spring提供好的RowMapper实现类
@Test
public void testQuery2(){
String sql = "SELECT * FROM product";
List<Product> productList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Product>(Product.class));
System.out.println(productList.size());
productList.stream().forEach(System.out::println);
}
@Test
public void testQueryForObject(){
//queryForObject一般来用执行一些聚合函数
String sql = "SELECT count(1) FROM product";
Long aLong = jdbcTemplate.queryForObject(sql, Long.class);
System.out.println(aLong);
}