SpringBoot项目使用JdbcTemplate

JdbcTemplate介绍

我们都知道使用原始的JDBC在操作数据库是比较麻烦的,所以Spring为了提高开发的效率,顺带着就把JDBC封装、改造了一番,而JdbcTemplate就是Spring对原始JDBC封装之后提供的一个操作数据库的工具类

我们可以借助JdbcTemplate来完成所有数据库操作,比如:增删改查等。

JdbcTemplate主要提供以下三种类型的方法:

  • executeXxx() : 执行任何SQL语句,对数据库、表进行新建、修改、删除操作
  • updateXxx() : 执行新增、修改、删除等语句
  • queryXxx() : 执行查询相关的语句

JdbcTemplate算是最简单的数据持久层方案,实际开发过程中,我们会使用mybatis、hibernate、jpa等持久化框架。

与JdbcTemplate类似的还有NamedParameterJdbcTemplate

SpringBoot使用JdbcTemplate

添加相关的依赖

<!-- JDBC -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- MySQL 驱动包-->
<!--MySQL Server 版本为 8.x时,mysql-connector-java使用5.1.35时会报错-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

application.yml中hikari数据源配置

server:
  port: 9999

spring:
  datasource:
    #通用配置
    driver-class-name: com.mysql.jdbc.Driver
    password: root
    username: root
    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&charcterEncoding=UTF-8&useSSL=false
    #数据源连接池配置
    hikari:
      minimum-idle: 10
      maximum-pool-size: 20
      idle-timeout: 500000
      max-lifetime: 540000
      connection-timeout: 60000
      connection-test-query: select 1

只要配置了数据源就会自动注入JdbcTemplate Bean。

注意:如果引入了jdbc starter,但是没有配置数据源,应用是起不来的,要么配置数据源,要么排除数据源的自动配置

测试验证

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApp.class)
public class WebSpringTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void testAddUser(){
        //插入数据
        jdbcTemplate.update("insert into tb_user(name, age) values (?, ?)", "张三", 20);

        //插入返回主键
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                String addSql = "insert into tb_user(name, age) values (?, ?)";
                PreparedStatement ps = connection.prepareStatement(addSql,PreparedStatement.RETURN_GENERATED_KEYS);
                ps.setString(1, "李四");
                ps.setInt(2, 43);
                return ps;
            }
        }, keyHolder);
        int keyId = keyHolder.getKey().intValue();
        System.out.println("插入的数据Id = " + keyId);

        //查询数据
        List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select * from tb_user");
        for(Map<String, Object> userInfo : mapList){
            System.out.println("id = " + userInfo.get("id") + ", name = " + userInfo.get("name") + ", age = " + userInfo.get("age"));
        }
    }
}

NamedParameterJdbcTemplate

在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制。定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定。

在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter)

具名参数:SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性。具名参数由框架类在运行时用占位符取代。

具名参数只在 NamedParameterJdbcTemplate 中得到支持。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApp.class)
public class WebSpringTest {

    @Autowired
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;


    @Test
    public void testAddUser() {
        //插入数据
        MapSqlParameterSource param = new MapSqlParameterSource();
        param.addValue("name", "王五");
        param.addValue("age", 25);
        namedParameterJdbcTemplate.update("insert into tb_user(name, age) values (:name, :age)", param);

        //插入返回主键
        KeyHolder keyHolder = new GeneratedKeyHolder();
        MapSqlParameterSource param1 = new MapSqlParameterSource();
        param1.addValue("name", "李白");
        param1.addValue("age", 28);
        namedParameterJdbcTemplate.update("insert into tb_user(name, age) values (:name, :age)", param1, keyHolder);
        int keyId = keyHolder.getKey().intValue();
        System.out.println("插入的数据Id = " + keyId);

        //查询数据
        List<Map<String, Object>> mapList = namedParameterJdbcTemplate.queryForList("select * from tb_user", new HashMap());
        for (Map<String, Object> userInfo : mapList) {
            System.out.println("id = " + userInfo.get("id") + ", name = " + userInfo.get("name") + ", age = " + userInfo.get("age"));
        }
    }
}

 

posted @ 2022-04-23 17:14  残城碎梦  阅读(1772)  评论(0编辑  收藏  举报