1、表的操作
使用JdbcTemplate的execute()方法执行SQL语句
execute方法总是使用java.sql.Statement,不接受参数,而且他不返回受影响记录的计数,更适合于创建和丢弃表的语句。
代码
jdbcTemplate.execute("CREATETABLEUSER(user_idinteger,namevarchar(100))");
2、增、删和改
update方法update方法返回的是受影响的记录数目的一个计数,并且如果传入参数的话,使用的是java.sql.PreparedStatement,更适合于插入,更新和删除操作
1)不带参数的更新
代码
jdbcTemplate.update("INSERTINTOUSERVALUES('"
+user.getId()+"','"
+user.getName()+"','"
+user.getSex()+"','"
+user.getAge()+"')");
2)带参数的更新
代码:jdbcTemplate.update("UPDATEUSERSETname=?WHEREuser_id=?",newObject[]{name,id});
代码:jdbcTemplate.update("INSERTINTOUSERVALUES(?,?,?,?)",newObject[]{user.getId(),user.getName(),user.getSex(),user.getAge()});
3)JDBC的PreparedStatement
代码:------单个更新
finalStringid=user.getId();
finalStringname=user.getName();
finalStringsex=user.getSex()+"";
finalintage=user.getAge();
jdbcTemplate.update("INSERTINTOUSERVALUES(?,?,?,?)",
newPreparedStatementSetter(){
publicvoidsetValues(PreparedStatementps)throwsSQLException{
ps.setString(1,id);//需要注意:匿名内部类只能访问外部最终局部变量
ps.setString(2,name);
ps.setString(3,sex);
ps.setInt(4,age);
}
});
代码:------批量更新
需要批处理,可以实现org.springframework.jdbc.core.BatchPrepared-StatementSetter接口:
packageorg.springframework.jdbc.core;
importjava.sql.PreparedStatement;
importjava.sql.SQLException;
publicinterfaceBatchPreparedStatementSetter{
voidsetValues(PreparedStatementps,
inti)throwsSQLException;
intgetBatchSize();
}
...
publicint[]insertUsers(finalListusers){
Stringsql="INSERTINTOuser(name,age)VALUES(?,?)";
BatchPreparedStatementSettersetter=
newBatchPreparedStatementSetter(){
publicvoidsetValues(
PreparedStatementps,inti)throwsSQLException{
Useruser=(User)users.get(i);
ps.setString(1,user.getName());
ps.setInt(2,user.getAge().intValue());
}
publicintgetBatchSize(){
returnusers.size();
}
};
returnjdbcTemplate.batchUpdate(sql,setter);
}
...
如果JDBC驱动程序支持批处理,则直接使用它的功能,如果不支持,Spring则会一个一个自动处理更新以模拟批处理。
3、查询
1)使用JdbcTemplate进行查询时,使用queryForXXX()等方法
•Queries,usingconveniencemethods
代码:intcount=jdbcTemplate.queryForInt("SELECTCOUNT(*)FROMUSER");
代码:Stringname=(String)jdbcTemplate.queryForObject("SELECTnameFROMUSERWHEREuser_id=?",newObject[]{id},java.lang.String.class);
代码:Listrows=jdbcTemplate.queryForList("SELECT*FROMUSER");
ReturnsanArrayList(oneentryforeachrow)ofHashMaps(oneentryforeachcolumnusingthecolumnnameasthekey)
代码:
Listrows=jdbcTemplate.queryForList("SELECT*FROMUSER");
Iteratorit=rows.iterator();
while(it.hasNext()){
MapuserMap=(Map)it.next();
System.out.print(userMap.get("user_id")+"\t");
System.out.print(userMap.get("name")+"\t");
System.out.print(userMap.get("sex")+"\t");
System.out.println(userMap.get("age")+"\t");
}
2)JDBC的callback方式
•Queries,usingcallbackmethod
A)processRow
在查询到数据之后先作一些处理再传回。可以实现org.springframework.jdbc.core.RowCallbackHandler接口
代码:------单行查询
finalUseruser=newUser();
jdbcTemplate.query("SELECT*FROMUSERWHEREuser_id=?",
newObject[]{id},
newRowCallbackHandler(){
publicvoidprocessRow(ResultSetrs)throwsSQLException{//需要注意:匿名内部类只能访问外部最终局部变量
user.setId(rs.getString("user_id"));
user.setName(rs.getString("name"));
user.setSex(rs.getString("sex").charAt(0));
user.setAge(rs.getInt("age"));
}
});
代码:------多行查询
finalListemployees=newLinkedList();
jdbc.query("selectEMPNO,FIRSTNME,LASTNAMEfromEMPLOYEE",
newRowCallbackHandler(){
publicvoidprocessRow(ResultSetrs)throwsSQLException{
Employeee=newEmployee();
e.setEmpNo(rs.getString(1));
e.setFirstName(rs.getString(2));
e.setLastName(rs.getString(3));
employees.add(e);
}
}
);
employeeslistwillbepopulatedwithEmployeeobjects
B)RowMapper
一次要取回很多查询结果的对象,则可以先实现org.springframe-work.jdbc.core.RowMapper接口。
代码:------将数据表中的数据影射成其对应的JAVA类的对象,mapRow回调方法会被ResultSet中的每一行调用。
classUserRowMapperimplementsRowMapper{
publicObjectmapRow(ResultSetrs,intindex)throwsSQLException{
Useruser=newUser();
user.setId(rs.getString("user_id"));
user.setName(rs.getString("name"));
user.setSex(rs.getString("sex").charAt(0));
user.setAge(rs.getInt("age"));
returnuser;
}
}
传回的结果已使用UserRowMapper的定义,将之封装为User对象。
//返回多行查询结果
publicListfindAllByRowMapperResultReader(){
Stringsql="SELECT*FROMUSER";
returnjdbcTemplate.query(sql,newRowMapperResultReader(newUserRowMapper()));
}
thereturnlistwillbepopulatedwithUserobjects
//返回单行查询结果
在getUser(id)里面使用UserRowMapper
代码
publicUsergetUser(finalStringid)throwsDataAccessException{
Stringsql="SELECT*FROMUSERWHEREuser_id=?";
finalObject[]params=newObject[]{id};
Listlist=jdbcTemplate.query(sql,params,newRowMapperResultReader(newUserRowMapper()));
return(User)list.get(0);
}