JdbcTemplate 增删查操作方法详解

概述

在学习JdbcTemplate的时候比较迷迷糊糊,后来找到了一篇博客,介绍总结的非常好,让我的学习找到了方向,也分享一下。这篇文章有自己学习实践的一些例子,也有原博客的很多东西。

Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是一种工作模式。

JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做需要做的事情(即可变部分),并且帮我们做哪些固定部分,如连接的创建及关闭。

JdbcTemplate类对可变部分采用回调接口方式实现,如ConnectionCallback通过回调接口返回给用户一个连接,从而可以使用该连接做任何事情、StatementCallback通过回调接口返回给用户一个Statement,从而可以使用该Statement做任何事情等等,还有其他一些回调接口
在这里插入图片描述
Spring除了提供JdbcTemplate核心类,还提供了基于JdbcTemplate实现的NamedParameterJdbcTemplate类用于支持命名参数绑定、 SimpleJdbcTemplate类用于支持Java5+的可变参数及自动装箱拆箱等特性。

JdbcTemplate类支持的回调类:

预编译语句及存储过程创建回调:用于根据JdbcTemplate提供的连接创建相应的语句;

  • PreparedStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的PreparedStatement;

  • CallableStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的CallableStatement;

预编译语句设值回调:用于给预编译语句相应参数设值;

  • PreparedStatementSetter:通过回调获取JdbcTemplate提供的PreparedStatement,由用户来对相应的预编译语句相应参数设值;

  • BatchPreparedStatementSetter:;类似于PreparedStatementSetter,但用于批处理,需要指定批处理大小;

自定义功能回调:提供给用户一个扩展点,用户可以在指定类型的扩展点执行任何数量需要的操作;

  • ConnectionCallback:通过回调获取JdbcTemplate提供的Connection,用户可在该Connection执行任何数量的操作;

  • StatementCallback:通过回调获取JdbcTemplate提供的Statement,用户可以在该Statement执行任何数量的操作;

  • PreparedStatementCallback:通过回调获取JdbcTemplate提供的PreparedStatement,用户可以在该PreparedStatement执行任何数量的操作;

  • CallableStatementCallback:通过回调获取JdbcTemplate提供的CallableStatement,用户可以在该CallableStatement执行任何数量的操作;

结果集处理回调:通过回调处理ResultSet或将ResultSet转换为需要的形式;

  • RowMapper:用于将结果集每行数据转换为需要的类型,用户需实现方法mapRow(ResultSet rs, int rowNum)来完成将每行数据转换为相应的类型。

  • RowCallbackHandler:用于处理ResultSet的每一行结果,用户需实现方法processRow(ResultSet rs)来完成处理,在该回调方法中无需执行rs.next(),该操作由JdbcTemplate来执行,用户只需按行获取数据然后处理即可。

  • ResultSetExtractor:用于结果集数据提取,用户需实现方法extractData(ResultSet rs)来处理结果集,用户必须处理整个结果集;

JdbcTemplate 增删改CRUD操作方法
一. 增加、更新、删除(一条SQL) (不需要参数)
  1. int update(String var1)
    其中sql参数为需要传入的SQL语句
  2. int update(PreparedStatementCreator var1)
public void test() {
        jdbcTemplate.update(new PreparedStatementCreator() {
            
            @Override
            public PreparedStatement createPreparedStatement(Connection conn)
                    throws SQLException {
                return conn.prepareStatement("insert into test(name) values('name1')");   
            }
        });
    }

3.int update(PreparedStatementCreator var1, KeyHolder var2)
此方法一般用来获取新插入数据的主键ID,使用如下:

public void test() {
   KeyHolder keyHolder = new GeneratedKeyHolder(); 
   jdbcTemplate.update(new PreparedStatementCreator() {
       
       @Override
       public PreparedStatement createPreparedStatement(Connection conn)
               throws SQLException {
           
           return conn.prepareStatement("insert into test(name) values('name1')");  
            
       }
   },keyHolder);
   int i = keyHolder.getKey().intValue();//这就是刚插入的数据的主键
}
二. 增加、更新、删除(一条SQL语句) (需要参数)
  1. int update(String sql,PreparedStatementSetter var2)
public void test() {
  String sql = "insert into test(name) values (?)";
  //返回的是更新的行数
  int count = jdbcTemplate.update(sql, new PreparedStatementSetter(){
      @Override
      public void setValues(PreparedStatement pstmt)
              throws SQLException {
          pstmt.setObject(1, "name4"); 
      }
    });
}
  1. int update(String sql, Object[] args, int[] var3)
    参数含义:sql:预处理SQL语句,args:需要注入的参数, argTypes:需要注入的sql参数的JDBC类型(java.sql.Types中来获取类型的常量);
 public void test() {
   String sql = "insert into test(name,age,create_date) values (?,?,?)";
   Date now = new Date(System.currentTimeMillis());
   //返回的是更新的行数
   int count = jdbcTemplate.update(sql, new Object[]{"小明",14,now}, new int[]{Types.VARCHAR,Types.INTEGER,Types.DATE});
}
  1. int update(String sql, @Nullable Object… var2)
    其实内部还是调用方法a实现的,JdbcTemplate提供这种更简单的方式“update(String sql, Object… args)”来实现设值,所以只要当使用该种方式不满足需求时才应使用PreparedStatementSetter(上面方法1)
public void test() {
   String sql = "insert into test(name,age,create_date) values (?,?,?)";
    Date now = new Date(System.currentTimeMillis());
    //返回的是更新的行数
    int count = jdbcTemplate.update(sql, "小明", 14, now);
 }
public void test() {
  String sql = "insert into test(name,age,create_date) values (?,?,?)";
   Date now = new Date(System.currentTimeMillis());
   //返回的是更新的行数
   int count = jdbcTemplate.update(sql, new Object[]{"小明",14,now});
}

这两种实际上调用的都是该方法,由此可见Object…args实际上就是可变的数组,而数组长度是固定的,必须先定义一个数组,而Object…args在传递时参数可以任意,所以也可以传递一个固定的Object数组。
4. int update(PreparedStatementCreator psc)
使用该方法可以自己使用原始jdbc方式给预编译sql注入参数,来进行增加、删除、更新操作:

public void addBlog(Blog blog) {
    String sql = "insert into blog(blogger_id,title,content,blog_type) values (?,?,?,?)";
    //返回的是更新的行数
    int count = template.update(new PreparedStatementCreator() {
        
        @Override
        public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
            PreparedStatement ps =conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
		    ps.setInt(1,blog.getBlogger_id());
		    ps.setString(2,blog.getTitle());
		    ps.setString(3,blog.getContent());
		    
            return ps;
        }
    });
}

如果需要返回插入的主键,只能用此方法,增加KeyHolder参数:

//添加博客,并返回新增博客的id
public int addBlog(Blog blog) {
   KeyHolder keyHolder = new GeneratedKeyHolder();
   String sql = "insert into blog(blogger_id,title,content,blog_type) values (?,?,?,?)";
   PreparedStatementCreator preparedStatementCreator = con -> {
       PreparedStatement ps = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
       ps.setInt(1,blog.getBlogger_id());
       ps.setString(2,blog.getTitle());
       ps.setString(3,blog.getContent());
       return ps;
   };
   template.update(preparedStatementCreator, keyHolder);
   int bloggerId = keyHolder.getKey().intValue();//获取最终插入的自增的id
   return bloggerId;
}
三. 批量增、删、更新数据(多条SQL数据)
  1. int[] batchUpdate(String… sql)
    批量执行SQL语句,SQL语句是固定的,但是SQL格式可以不一样,不需要注入参数

    可以传一个String数组,存放多条sql语句;返回值是int数组,即每条sql更新影响的行数。

  2. int[] batchUpdate(String sql, BatchPreparedStatementSetter pss)
    参数sql:一条预处理sql(如果是批量处理预处理sql,那么sql的格式就是固定的,只填充参数而已);第二个参数就是回调类,前面有统一介绍回调类。

批量插入:
public void test(final List<Customer> customer) {//参数也是局部变量,也必须用final修饰,内部类中才能访问(全局变量不用)
        
   String sql = "insert into test(name,age,create_date) values (?,?,?)";
   //返回的是更新的行数
   int[] count = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
       
       @Override
       public void setValues(PreparedStatement ps, int i)
               throws SQLException {
           //注入参数值
           ps.setString(1, customer.get(i).getName());
           ps.setInt(2, customer.get(i).getAge());
           ps.setDate(3, customer.get(i).getCreateDate());
       }
       
       @Override
       public int getBatchSize() {
           //批量执行的数量
           return customer.size();
       }
   });
}
批量更新:
public void test(final List<Customer> customer) {//参数也是局部变量,也必须用final修饰,内部类中才能访问(全局变量不用)
  String sql = "update test set name = ?,age = ? where id = ?";
    //返回的是更新的行数
    int[] count = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
        
        @Override
        public void setValues(PreparedStatement ps, int i)
                throws SQLException {
            //注入参数值
            ps.setString(1, customer.get(i).getName());
            ps.setInt(2, customer.get(i).getAge());
            ps.setInt(3, customer.get(i).getId());
        }
        
        @Override
        public int getBatchSize() {
            //批量执行的数量
            return customer.size();
        }
    });
    
}
  1. 批量处理多条预处理sql语句还有下面几种简单方法(参数和前面类似,这里就不详解):
    int[] batchUpdate(String var1, List<Object[]> batchArgs)

    int[] batchUpdate(String var1, List<Object[]> var2, int[] argTypes)

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
JdbcTemplate是Spring框架中提供的一个类,用于执行数据库的增删操作。它提供了一系列的方法来执行SQL语句。其中,增删操作使用的是`update`方法,询操作使用的是`query`方法。 在使用JdbcTemplate进行增删之前,需要先配置数据源和JdbcTemplate对象。可以通过创建配置类或在Spring配置文件中进行配置。 在配置类中,可以使用`@Bean`注解创建数据源和JdbcTemplate对象,并通过`@Value`注解获取配置文件中的数据库连接信息。然后将数据源设置给JdbcTemplate对象,使其知道要操作哪个数据库。 在Spring配置文件中,可以使用`<bean>`标签配置数据源和JdbcTemplate对象。需要设置数据源的URL、用户名、密码和驱动类名,并将数据源注入给JdbcTemplate对象。 配置完成后,就可以在service类或dao类中使用JdbcTemplate对象进行增删操作了。可以调用JdbcTemplate的`update`方法执行增删操作,传入SQL语句和参数。例如,`jdbcTemplate.update("INSERT INTO table_name (column1, column2) VALUES (?, ?)", value1, value2)`可以执行插入操作。 总结起来,使用JdbcTemplate进行增删的步骤如下: 1. 配置数据源和JdbcTemplate对象,可以通过创建配置类或在Spring配置文件中进行配置。 2. 在service类或dao类中注入JdbcTemplate对象。 3. 调用JdbcTemplate的`update`方法执行增删操作,传入SQL语句和参数。 [1][2][3]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值