面向小白的SpringBoot简单JDBC操作

984 阅读2分钟

这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

今天我们来通过JDBC访问下数据库,我们使用SpringBoot的jDBC来操作数据库。

连接池的出现

为啥要有连接池,那我们就想想不用连接池会有啥问题:

  1. 可能会出现多个应用使用一个连接,如果某个应用用完不还,导致别的应用卡死。
  2. 连接资源的申请和销毁的开销都比较大,这导致对连接的管理技术是异常的迫切
  3. 数据库的连接资源是有限的,如果大家都去申请,很容易被榨干

我们意识到连接池的重要,那我们怎么选择一个连接池呢?我简单概括了以下几点:

  1. 可靠性:这肯定是不容多说的,要具备对问题的自动检测和一定的问题恢复能力。
  2. 性能:开销尽可能小
  3. 功能:在不影响性能的前提下,多一点功能
  4. 安全性:比如给数据库密码加密
  5. 可扩展性:比如trace注释、拦截日处理等等

好了,有了以上知识我们就可以开始今天的内容了,进行SpeingBoot的JDBC学习

原生JDBC操作数据库

我们使用原生JDBC操作数据库是比较复杂的,这不是重点,简单看看就行:

  1. 注册驱动
  2. 获取一个连接
  3. 创建Statement
  4. 数据库查询
  5. 结果集解析
  6. 关闭连接

单单进行个数据库查询,就是需要写很多代码,还没有事务的事,而且代码不容易维护。如果使用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));

所有结果如下:

image.png