zoukankan      html  css  js  c++  java
  • JdbcTemplate 的基本增删改查介绍

    前言

    最近接触的项目使用 JdbcTemplate 比较频繁,以至于经常要去查API,在这里写一下常用的增删改查操作。

    JdbcTemplate基本介绍

    JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。它是Spring的一部分,我们不需要关系什么时候建立连接和释放资源。

    在JdbcTemplate中执行SQL语句的方法大致分为3类:

    1. execute 方法:可以执行所有SQL语句,一般用于执行DDL语句(对表结构操作)。
    2. update 方法和 batchUpdate 方法:用于执行INSERTUPDATEDELETE等DML语句(对数据的增删改)。batchUpdate 方法用于执行批处理相关语句。
    3. query 方法和 queryXxx 方法:用于DQL数据查询语句(对数据的查询)。
    4. call 方法 :用于执行存储过程、函数相关语句。

    对于连接池的配置这里不多介绍,只介绍增删改查操作。

    增删改操作

    使用Update方法

    API介绍:

    public int update(final String sql) :用于执行 INSERTUPDATEDELETE等DML语句。

    有个实体类

    public class User implement Serializable {
      private int id;
      private String name;
      private age;
      ...
      //setter、getter
      ...
    }
    

    数据访问层操作

    @Repository
    public class UserDao{
      @Resource
      private JdbcTemplate jdbcTemplate;
      
      // JDBCTemplate 添加操作
      public static void create01() throws Exception {
         //和jdbc一样,使用 ?占位符防sql注入
         String sql = "INSERT INTO TB_USER VALUES (NULL, ?, ?);";
    
        jdbcTemplate.update(sql, "zhangsan", 22);
        jdbcTemplate.update(sql, "lisi", 24);
     	   
      }
      
      // JDBCTemplate 添加操作2
      public static void create02() throws Exception {
         String sql = "INSERT INTO TB_USER VALUES (NULL, ?, ?);";
    	//使用Object[]数组作为参数,可更新多条数据
        Object[] args = new Object[]{"zhangsan",23,"lisi",24};
        jdbcTemplate.update(sql, args);
      }
    
      // JDBCTemplate 更新操作
      public static void update01() throws Exception {
          String sql = "UPDATE TB_USER SET name=?, age=? WHERE id=?;";
    
         Object[] args = new Object[]{"lucy",24,10};
        jdbcTemplate.update(sql, args);
      }
      
      
      // JDBCTemplate 删除操作
      public static void update01() throws Exception {
          String sql = "DELETE FROM TB_USER WHERE id=?;";
    
         Object[] args = new Object[]{9,10};
        jdbcTemplate.update(sql, args);
      }
      
    }
    

    批量操作 -- batchUpdate方法

    @Repository
    public class UserDao{
      @Resource
      private JdbcTemplate jdbcTemplate;
      
      @AutoWired
      private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
      
      public void batchCreate(List<User> list) {
        SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(list.toArray());
        String sql = "INSERT INTO TB_USER(NAME,AGE) VALUES(:name, :age)";
        namedParameterJdbcTemplate.batchUpdate(sql, batch);
      }
      
      //删除和修改操作也类似,就是sql语句的区别。
      
    }
    

    查询操作

    queryForInt返回一个int整数

    public int queryForInt(String sql) :执行查询语句,返回一个int类型的值。

    // queryForInt返回一个整数 -- 相当于使用了 COUNT(*) 
    public static void demo01() throws Exception {
       String sql = "SELECT id FROM TB_USER WHERE age > 18;";
       int forInt = jdbcTemplate.queryForInt(sql);
       System.out.println(forInt);
    }
    

    queryForObject返回String

    public T queryForObject(String sql, Class requiredType) :执行查询语句,返回一个指定类型的数据。

    public static void demo02() throws Exception {
       String sql = "SELECT name FROM FROM WHERE id=10;";
       String name = jdbcTemplate.queryForObject(sql, String.class);
       System.out.println(name);
    }
    

    queryForMap返回一个Map集合

    public Map<String, Object> queryForMap(String sql, Object... args) : 执行查询语句,将一条记录放到一个Map中。

    public static void demo03() throws Exception {
       String sql = "SELECT * FROM TB_USER WHERE id=?;";
       Map<String, Object> map = jdbcTemplate.queryForMap(sql, 6);
       System.out.println(map);
    }
    

    queryForList返回一个List集合

    public List<Map<String, Object>> queryForList(String sql) : 执行查询语句,返回一个List集合,List中存放的是Map类型的数据。

    public static void demo04() throws Exception {
       String sql = "SELECT * FROM TB_USER WHERE age > ?;";
       List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, 18);
       for (Map<String, Object> map : list) {
          System.out.println(map);
       }
    }
    

    RowMapper返回自定义对象

    public List query(String sql, RowMapper rowMapper) :执行查询语句,返回一个List集合,List中存放的是RowMapper指定类型的数据。

    public static void demo05() throws Exception {
       String sql = "SELECT * FROM TB_USER WHERE age > ?;";
      List<User> list = jdbcTemplate.query(sql, new Object[]{18}, new RowMapper<User>(){
        @Override
        public User mapRow(ResultSet res, int i) throws SQLException {
          User user = new User();
          user.setId(res.getInt("ID"));
          user.setName(res.getString("NAME"));
          user.setAge(res.getInt("AGE"));
          return user;
        }
      });
       for (User user : list) {
          System.out.println(user);
       }
    }
    

    以上所提到的方法,存在很多重载方法,其主要是参数个数不一样,可根据自己需求使用。

    NamedParameterJdbcTemplate讲解

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

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

    那么什么是具名参数?

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

    具名参数只在 NamedParameterJdbcTemplate 中得到支持。NamedParameterJdbcTemplate可以使用全部jdbcTemplate方法。

    NamedParameterJdbcTemplate类拓展了JdbcTemplate类,对JdbcTemplate类进行了封装从而支持命名参数特性。

    NamedParameterJdbcTemplate主要提供以下三类方法:execute方法、queryqueryForXXX方法、update及batchUpdate方法。

    案例:

    具名新增:

    @Test
    public void testNamedParameter(){
        String sql = "insert into user (username,password) values (:username,:password)";
        User u = new User();
        u.setUsername("555");
        SqlParameterSource sqlParameterSource=new BeanPropertySqlParameterSource(u);
        namedParameterJdbcTemplate.update(sql,sqlParameterSource);
    }
    

    这样我们就可以根据pojo类的属性值使用JDBC来操作数据库了。

    获取新增的主键:
    NamedParameterJdbcTemplate还新增了KeyHolder类,使用它我们可以获得主键,类似Mybatis中的useGeneratedKeys。

    @Test
    public void testKeyHolder(){
        String sql = "insert into user (username,password) values (:username,:password)";
        User u = new User();
        u.setUsername("555");
        SqlParameterSource sqlParameterSource=new BeanPropertySqlParameterSource(u);
        KeyHolder keyHolder = new GeneratedKeyHolder();
        namedParameterJdbcTemplate.update(sql, sqlParameterSource, keyHolder);
        int k = keyHolder.getKey().intValue();
        System.out.println(k);
    }
    

    输出结果就是新增的主键。

    有哪里写的不对,欢迎提出建议~

  • 相关阅读:
    STL: merge
    STL: rotate
    javascript的prototype继承问题
    日期正则表达式
    有关linq的一系列学习的文章,值得收藏
    EF读取关联数据
    jQuery UI中的日期选择插件Datepicker
    LINQ的基本语法中八个关键字用法说明
    Shell变量内容的删除、替代与替换
    Shell命令别名与历史命令
  • 原文地址:https://www.cnblogs.com/luler/p/15743937.html
Copyright © 2011-2022 走看看