execute(String sql) 可執行任何sql語句,但返回值是void,所以一般用於資料庫的新建、修改、刪除和數據表記錄的增刪改。 int update(String sql) int update(String sql, Object...args) 增刪改,args傳遞實參,返回受影響 ...
- execute(String sql)
可執行任何sql語句,但返回值是void,所以一般用於資料庫的新建、修改、刪除和數據表記錄的增刪改。
- int update(String sql)
- int update(String sql, Object...args)
增刪改,args傳遞實參,返回受影響的記錄數。
- int[] batchUpdate(String...sql)
- int[] batchUpdate(String...sql, List<Object[]> args)
批量執行sql語句(增刪改),返回受影響的記錄數。
- setMaxRows(int max) //設置返回的最大記錄數
- setQueryTimeout(int timeout) //設置查詢超時
- setDataSource(DataSource dataSource) //設置數據源
以上3個方法都有對應的get方法。
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,顧名思義,必須且只能返回一條記錄,如果返回多條記錄或沒有記錄匹配,都會報錯;且只能查詢一個欄位。
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,只能選中數據表的一列。
- 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>。
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,可以裝多個欄位,但只能裝一條記錄。
如果返回多條記錄,則只取第一條來裝;如果沒有匹配的記錄,會報錯。
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);