- 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
批量执行sql语句(增删改),返回受影响的记录数。
- setMaxRows(int max) //设置返回的最大记录数
- setQueryTimeout(int timeout) //设置查询超时
- setDataSource(DataSource dataSource) //设置数据源
以上3个方法都有对应的get方法。
queryForObject() # 必须且只能返回一条记录,且只能查询一个字段
queryForObject(String sql, T.class) //不需向sql语句传递参数 queryForObject(String sql, Object[] args, T.class) //args是sql语句中?对应的值 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
queryForList(String sql, T.class) - List
queryForList(String sql, Object[] args, T.class) //args是sql语句中?的对应值(实参) - List
queryForList(String sql, T.class, Object...args)
String sql="select name from student_tb"; Listlist=jdbcTemplate.queryForList(sql,String.class); for (String name:list){ System.out.println(name); }
基本数据类型的List,只能选中数据表的一列。
- List
- List
String sql="select * from student_tb";
List
Map类型的List,可以选择多列。字段名都是String,值可能是各种类型,所以使用Map
queryForMap() #可以查询多个字段,但只能装一条记录
- Map
queryForMap(String sql) - Map
queryForMap(String sql, Object...args)
String sql="select * from student_tb where id = 1"; Mapmap=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
query(String sql, RowMapper rowMapper) - List
query(String sql, Object[] args, RowMapper rowMapper) - List
query(String sql, RowMapper 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"; RowMapperrowMapper=new BeanPropertyRowMapper<>(Student.class ); Listlist=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"> <property name="mappedClass" value="com.chy.model.Student" /> bean>
RowMapperrowMapper = applicationContext.getBean("beanPropertyRowMapper",BeanPropertyRowMapper.class);