Spring之JDBCTemplate使用

本文深入探讨了使用JdbcTemplate进行数据库操作的方法,包括创建表、增删改操作、查询操作等,提供了具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值