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);
}

輸出結果就是新增的主鍵。

有哪里寫的不對,歡迎提出建議~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM