Spring JdbcTemplate類經常使用的方法

 

  • execute(String  sql)   

可執行任何sql語句,但返回值是void,因此通常用於數據庫的新建、修改、刪除和數據表記錄的增刪改。spring

 

 

  • int  update(String sql) 
  • int  update(String sql, Object...args)

 增刪改,args傳遞實參,返回受影響的記錄數。sql

 

 

  • int[]   batchUpdate(String...sql)   
  • int[]   batchUpdate(String...sql, List<Object[]>  args)    

批量執行sql語句(增刪改),返回受影響的記錄數。數據庫

 

 

  • setMaxRows(int max)    //設置返回的最大記錄數
  • setQueryTimeout(int  timeout)    //設置查詢超時
  • setDataSource(DataSource  dataSource)    //設置數據源

以上3個方法都有對應的get方法。app

 

  


 

 

queryForObject()      # 必須且只能返回一條記錄,且只能查詢一個字段

  • <T>  queryForObject(String sql, T.class)    //不需向sql語句傳遞參數
  • <T>  queryForObject(String sql, Object[]  args, T.class)    //args是sql語句中?對應的值
  • <T>  queryForObject(String sql, T.class, Object... args)
     String sql="select id from student_tb where name = ? and gender = ?"
     Object[] args=new Object[]{"張三",1};
     int id=jdbcTemplate.queryForObject(sql,args,int.class);

ForObject,顧名思義,必須且只能返回一條記錄,若是返回多條記錄或沒有記錄匹配,都會報錯;且只能查詢一個字段。 ide

 

 


  

 

queryForList()      #能夠返回0條或多條記錄,普通類型的List只能查詢一個字段,Map類型的List能夠查詢多個字段

  • List<T>  queryForList(String sql, T.class)
  • List<T>  queryForList(String sql, Object[]  args, T.class)    //args是sql語句中?的對應值(實參)
  • List<T>  queryForList(String sql, T.class, Object...args)
        String sql="select name from student_tb";
        List<String> list=jdbcTemplate.queryForList(sql,String.class);
        for (String name:list){
            System.out.println(name);
        }  

基本數據類型的List,只能選中數據表的一列。this

 

 

  • List<Map<String,Object>>   queryForList(String sql)
  • List<Map<String,Object>>   queryForList(String sql, Object...args)
       String sql="select * from student_tb";
        List<Map<String,Object>> list=jdbcTemplate.queryForList(sql);
        //list裝的是結果集中全部的記錄,一個map裝一條記錄
        for (Map<String,Object> map:list){
            //map的key是字段名,value是該字段的值。get()的返回值是Object。
            Object id = map.get("id");
            Object name = map.get("name");
            Object age = map.get("age");
            System.out.println("id:"+id+"\tname:"+name+"\tage:"+age);
        }

Map類型的List,能夠選擇多列。字段名都是String,值多是各類類型,因此使用Map<String, Obejct>。spa

 

 


 

 

queryForMap()     #能夠查詢多個字段,但只能裝一條記錄

  • Map<String, Obejct>   queryForMap(String sql)
  • Map<String, Object>   queryForMap(String sql, Object...args)
        String sql="select * from student_tb where id = 1";
        Map<String,Object> map=jdbcTemplate.queryForMap(sql);
        Object name = map.get("name");
        Object age = map.get("age");
        System.out.println("name:"+name+"\tage:"+age);

由於是Map,能夠裝多個字段,但只能裝一條記錄。code

若是返回多條記錄,則只取第一條來裝;若是沒有匹配的記錄,會報錯。blog

 

 


 

 

queryForRowSet()     #返回結果集

  • SqlRowSet  queryForRowSet(String sql)     
  • SqlRowSet  queryForRowSet(String sql, Object...args)    //args是sql語句中的?對應的值。
       String sql="select * from student_tb";
        SqlRowSet rowSet=jdbcTemplate.queryForRowSet(sql);
        //遍歷結果集
        while (rowSet.next()){
            // 參數指定列名,能夠用String類型的字段名,也能夠用int型的值(該字段在結果集中的第幾列,從1開始)
            // int id = rowSet.getInt(1);
            int id = rowSet.getInt("id");
            String name = rowSet.getString("name");
            //......
        }

 

 


 

 

query()      #將結果集的記錄映射爲bean類型的List

  • List<T>   query(String sql, RowMapper<T>  rowMapper)
  • List<T>   query(String sql, Object[]  args, RowMapper<T>  rowMapper)
  • List<T>   query(String sql, RowMapper<T>  rowMapper, Object...args)

 

bean:接口

public class Student {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 

 

使用:

       String sql="select * from student_tb";
        RowMapper<Student> rowMapper=new BeanPropertyRowMapper<>(Student.class);
        List<Student> list=jdbcTemplate.query(sql,rowMapper);
        System.out.println(list);

RowMapper是接口,BeanPropertyRowMapper是spring提供的惟一的實現類。

 

query()只能將結果集的記錄映射爲Bean類型的List,不能映射爲基本類型的List。

映射時會自動將結果集中的字段賦給同名的成員變量,因此要求Bean的成員變量名要與結果集的字段名相同,很死板。

若是結果集中沒有同名的字段,該成員變量就不會被映射(值是JVM賦的初始值)。

映射時是調用setter方法給Bean的成員變量賦值,因此Bean要提供setter方法。

 

 

在Spring中儘可能不要使用new來建立Bean的實例,上面的RowMapper實例能夠這樣建立:

<bean name="beanPropertyRowMapper" class="org.springframework.jdbc.core.BeanPropertyRowMapper">
      <!-- value指定目標類型 -->
        <property name="mappedClass" value="com.chy.model.Student" />
</bean>
RowMapper<Student> rowMapper = applicationContext.getBean("beanPropertyRowMapper",BeanPropertyRowMapper.class);
相關文章
相關標籤/搜索