这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战
今天我们来通过JDBC访问下数据库,我们使用SpringBoot的jDBC来操作数据库。
连接池的出现
为啥要有连接池,那我们就想想不用连接池会有啥问题:
- 可能会出现多个应用使用一个连接,如果某个应用用完不还,导致别的应用卡死。
- 连接资源的申请和销毁的开销都比较大,这导致对连接的管理技术是异常的迫切
- 数据库的连接资源是有限的,如果大家都去申请,很容易被榨干
我们意识到连接池的重要,那我们怎么选择一个连接池呢?我简单概括了以下几点:
- 可靠性:这肯定是不容多说的,要具备对问题的自动检测和一定的问题恢复能力。
- 性能:开销尽可能小
- 功能:在不影响性能的前提下,多一点功能
- 安全性:比如给数据库密码加密
- 可扩展性:比如trace注释、拦截日处理等等
好了,有了以上知识我们就可以开始今天的内容了,进行SpeingBoot的JDBC学习
原生JDBC操作数据库
我们使用原生JDBC操作数据库是比较复杂的,这不是重点,简单看看就行:
- 注册驱动
- 获取一个连接
- 创建Statement
- 数据库查询
- 结果集解析
- 关闭连接
单单进行个数据库查询,就是需要写很多代码,还没有事务的事,而且代码不容易维护。如果使用SpringBoot,前面讲到,它帮我们根据配置配置数据源、配置事务管理器还有JDBC模板,简单来说就是开箱即用,下面我们演示下。
SpringBoot操作数据库
简单查询
1、使用JDBC将查询出来的数据打印到控制台
jdbcTemplate.queryForList("select * from Foo").stream().forEach(s->log.info(s.toString()));
2、插入多条
public void insertData(){
Arrays.asList("1","2").forEach(x->template.update(
"INSERT INTO Foo (BAR) VALUES (?)",x));
Map<String,String> row =new HashMap<>();
row.put("BAR","c");
Number n = insert.executeAndReturnKey(row);
log.info("n:{}",n.longValue());
}
注:我在插入最后一条的时候使用了这个SimpleJdbcInsert insert的executeAndReturnKey获取它的主键
@Bean
public SimpleJdbcInsert insert(JdbcTemplate jdbcTemplate) {
return new SimpleJdbcInsert(jdbcTemplate).withTableName("Foo").usingGeneratedKeyColumns("ID");
}
3、查询数量queryForObj
log.info("Count:{}",template.queryForObject("select count(*) from Foo ",List.class));
4、查询对象内容
List<String> barList = template.queryForList("select BAR from Foo", String.class);
barList.forEach(b->log.info("BAR:{}",b));
5、查询对象
List<Foo> list = template.query("select * from Foo", new RowMapper<Foo>() {
@Override
public Foo mapRow(ResultSet rs, int rowNum) throws SQLException {
return Foo.builder()
.id(rs.getLong(1))
.bar(rs.getString(2))
.build();
}
});
list.forEach(f->log.info("Foo is{}",f));
所有结果如下: