getJdbcTemplate中executeupdate和update的区别

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(7374)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Spring 框架 执行SQL getJdbcTemplate().query update 用法',
blogAbstract:'
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}写在 this.getjdbctemplate.execute中的是在一个事务中吗_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
写在 this.getjdbctemplate.execute中的是在一个事务中吗
我有更好的答案
.PreparedStatement接口提供了三种执行 SQL 语句的方法、方法executeQuery 用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。 1
采纳率:87%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包博客分类:
1.HibernateDao的用法:
public void betch_update_category(Long[] goodsIds,Long destCategoryId){
String hql = "update com.prl.entity.Goods set category = :category where goodsId in (:goodsIdStr)";
Category category = categoryManager.get(destCategoryId);
Map param = new HashMap();
param.put("category", category);
param.put("goodsIdStr", goodsIds);
goodsDAO.batchExecute(hql,param);
2.NamedParameterJdbcTemplate的用法:
NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate)applicationContext.getBean("namedParameterJdbcTemplate");
List&Long& subtractDb = new ArrayList&Long&();
subtractDb.add(1L);
SqlParameterSource deleteParamSource = new MapSqlParameterSource().addValue("goodsId",goodsId).addValue("giftIdCollecton",subtractDb);
namedParameterJdbcTemplate.update("delete from goods_gift where goods_id = :goodsId and gift_Id in (:giftIdCollecton)", deleteParamSource);
看到区别没?HibernateDao中集合的表示形式须为数组,而NamedParameterJdbcTemplate则为列表,而且必须是这样的,如果HibernateDao中传递的参数为list,而NamedParameterJdbcTemplate传递成array,你得到的结果永远为空,切记,这个问题困扰了我很久,特记于此
浏览: 745723 次
来自: 武汉
prince4426 写道说的也太简单了吧。我还是没看懂你写个 ...
Shrio在线教程: ...
不错,赞一个
写的不错,受用
可以发下源码吗
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'相关文章推荐
JdbcTemplate 中有很多的查询方法,整理几个比较常用的方法。
1、queryFor*方法很好用,简单强大。
2、query查询方法中带有回调接口有三个:ResultSetExtracto...
使用三种Callback接口作为参数的query方法的返回值不同:
以ResultSetExtractor作为方法参数的query方法返回Object型结果,要使用查询结果,我们需要对其...
正确方法:
String sql = "select ID from Structures(nolock) where id=?";
Integer ret = jdbcTemplate.query...
JdbcTemplate主要提供以下五类方法:execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;update方法及batchUpdate方法:update方法用于执行新增、修改、...
public int insertSalaryInfo(final SalaryInfo s) {
String sql="insert into offical_sa...
Spring JdbcDaoSupport 执行SQLreturn int: getJdbcTemplate().queryForInt(sql)
select count(*)...retur...
使用jdbctemaplte去取数据,高效、灵活,执行效率肯定是比hibernate高,应为hibernate的底层就是封装了jdbc。但是开发效率高没有hibernate高,每条sql都要自己去写,...
Spring中的JDBCTemplate使用
数据库准备:
创建数据库
Java代码:
1、创建web 工程
springJdbcTemplate
2、添加...
应用:使用Spring的JdbcTemplate查询数据库,获取List结果列表,数据库表字段和实体类自动对应,可以使用BeanPropertyRowMapper。
注意:自动绑定,需要列名称和Ja...
使用JdbcTemplate进行查询时,可以使用queryForXXX()等方法
jdbcTemplate.queryForInt()
和 jdbcTemplate.queryFor...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)博客分类:
最近在公司实习过程中,TL提出一个需求,要求在不使用Hibernate的情况下实现一个比较通用的DAO框架,使用JDBCTemplate作为数据库sql语句的执行工具。在参考了CloudStack 3.0.2的相关源代码后,我自己实现了一个简化版的DAO框架。结果后来,TL又说改用Python开发,遗憾地把这些东西留作纪念吧。
简单的类图参见连接
环境为MyEclipse8.5+Spring2.5,使用jar为asm-3.3.1、cglib-2.2、mysql-connector
1,编程思想
本质上是将某些通用的API,如最基础的CRUD直接通过泛型类来实现。唯一的比较难处理的就是Update时,哪些属性需要更新,这可以拦截通过CGLIB类库实现对setter方法的拦截并记录被改变的属性。
核心类BaseDaoImpl
package DataBaseDemo.
import java.lang.reflect.F
import java.lang.reflect.ParameterizedT
import java.lang.reflect.T
import java.sql.C
import java.sql.PreparedS
import java.sql.SQLE
import java.util.ArrayL
import java.util.A
import java.util.HashM
import java.util.I
import java.util.L
import java.util.M
import javax.sql.DataS
import net.sf.cglib.proxy.E
import org.apache.log4j.L
import org.springframework.jdbc.core.JdbcT
import org.springframework.jdbc.core.PreparedStatementC
import org.springframework.jdbc.core.PreparedStatementS
import org.springframework.jdbc.datasource.DataSourceTransactionM
import org.springframework.jdbc.support.GeneratedKeyH
import org.springframework.jdbc.support.KeyH
import org.springframework.transaction.PlatformTransactionM
import org.springframework.transaction.TransactionD
import org.springframework.transaction.support.DefaultTransactionD
import DataBaseDemo.interceptor.UpdateF
import DataBaseDemo.util.DBU
import DataBaseDemo.util.ModelRowM
import com.mysql.jdbc.S
public class BaseDaoImpl&T& {
Logger logger=Logger.getLogger(BaseDaoImpl.class);
//POJO类的实际类型
Class&T& entityT
//简单地将POJO类名映射成数据库表名
public static JdbcTemplate jdbcT
public static PlatformTransactionManager transactionM
public static DefaultTransactionDefinition
transactionD
@SuppressWarnings("unchecked")
BaseDaoImpl() {
DataSource datasource=DBUtils.configureDatasource();
jdbcTemplate = new JdbcTemplate(datasource);
transactionManager=new DataSourceTransactionManager(datasource);
transactionDef=new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);
Type t = getClass().getGenericSuperclass();
// 使用该语法后,BaseDaoImpl无法正常使用,只能通过子类调用它
// 用于获取实际输入的Model类型
if (t instanceof ParameterizedType) {
entityType = (Class&T&) ((ParameterizedType) t)
.getActualTypeArguments()[0];
} else if (((Class&?&) t).getGenericSuperclass() instanceof ParameterizedType) {
entityType = (Class&T&) ((ParameterizedType) ((Class&?&) t)
.getGenericSuperclass()).getActualTypeArguments()[0];
entityType = (Class&T&) ((ParameterizedType) ((Class&?&) ((Class&?&) t)
.getGenericSuperclass()).getGenericSuperclass())
.getActualTypeArguments()[0];
this.table = DBUtils.getTable(entityType);
@SuppressWarnings("unchecked")
public List&T& queryAll() {
String sql = "select * from " +
List&T& list = jdbcTemplate.query(sql, new ModelRowMapper(entityType));
* 根据ID,查询一条记录并用实体包装
* @param id
@SuppressWarnings("unchecked")
public T load(int id) {
String sql = "select * from " + table + " where id=" +
List&T& list = jdbcTemplate.query(sql, new ModelRowMapper(entityType));
return list.size() == 0 ? null : list.get(0);
* 根据ID,删除指定表里的记录
* @param id
public void delete(int id) {
String sql = "delete from " + table + " where id=" +
jdbcTemplate.execute(sql);
* 根据ID更新实体数据到数据库
* @param entity
* @param id
@SuppressWarnings("unchecked")
public void update(T entity, int id) {
assert Enhancer.isEnhanced(entity.getClass()) : "没有被拦截器监控到更新数据";
StringBuilder sql = new StringBuilder();
sql.append("update " + table + " set ");
System.out.println(entity.hashCode());
HashMap&String, Object& map = UpdateFactory.getChanges(entity.hashCode());
List&String& keys = new ArrayList&String&();
List&Object& values = new ArrayList&Object&();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String key = (String) entry.getKey();
Object val = entry.getValue();
keys.add(key);
values.add(val);
for (int i = 0; i & keys.size(); i++) {
if (i == keys.size() - 1) {
sql.append(keys.get(i) + "=? ");
sql.append(keys.get(i) + "=?,");
sql.append("where id=?");
("更新语句:"+sql.toString());
values.add(id);
jdbcTemplate.update(sql.toString(), setParams(values.toArray()));
* 插入实体,并返回数据库自增生成的ID
* @param entity
@SuppressWarnings("unchecked")
public int insert(T entity) {
final StringBuilder sql = new StringBuilder();
sql.append("insert into " + table + "(");
HashMap&String, Object& map = getChangesForInsert(entity);
List&String& columns = new ArrayList&String&();
final List&Object& values = new ArrayList&Object&();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String key = (String) entry.getKey();
Object val = entry.getValue();
columns.add(key);
values.add(val);
for (int i = 0; i & columns.size(); i++) {
if (i == columns.size() - 1) {
sql.append(columns.get(i) + ") values(");
sql.append(columns.get(i) + ",");
for (int i = 0; i & values.size(); i++) {
if (i == values.size() - 1) {
sql.append("?)");
sql.append("?,");
("插入语句:"+sql.toString());
KeyHolder key = new GeneratedKeyHolder();
final String insertSql=sql.toString();
jdbcTemplate.update(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection con)
throws SQLException {
// TODO Auto-generated method stub
//必须设置Statement.RETURN_GENERATED_KEYS才能进行返回ID
PreparedStatement ps = jdbcTemplate.getDataSource()
.getConnection().prepareStatement(insertSql,Statement.RETURN_GENERATED_KEYS);
for (int i = 0; i & values.size(); i++) {
ps.setObject(i + 1, values.get(i));
return key.getKey().intValue();
* 插入实体并返回被插入的实体
* @param entity
public T persist(final T entity) {
int id=insert(entity);
//直接通过connection进行提交同样无法成功
("数据库返回的自增ID为:"+id);
T persisted=load(id);
* @param params
@SuppressWarnings("unchecked")
public List&T& query(SearchCriteria sc){
String where = sc.generateWhereClause();
StringBuilder sb = new StringBuilder("select * from "+sc.getTable());
sb.append(where);
("查询语句"+sb.toString());
("查询参数"+Arrays.toString(sc.generateParams()));
List&T& list = jdbcTemplate.query(sb.toString(), setParams(sc.generateParams()),new ModelRowMapper(entityType));
* 返回DAO对应的数据库表的总记录数
public int getTotalCount(){
String sql="select count(*) from "+
return jdbcTemplate.queryForInt(sql);
* 以pagesize大小的页,返回第page页的数据
* @param page
* @param pagesize
@SuppressWarnings("unchecked")
public List&T& getPage(int page,int pagesize){
if(page&0||pagesize&0){
throw new IllegalArgumentException("页码或页大小参数不合法");
String sql="select * from "+table+" limit "+page*pagesize+","+(page+1)*
return jdbcTemplate.query(sql, new ModelRowMapper&T&(entityType));
* 直接执行sql查询语句,param作为参数数组
* @param sql
* @param params
* 返回查询到的结果列表
@SuppressWarnings("unchecked")
public List&T& executeRawSql(String sql,Object[] params){
return jdbcTemplate.query(sql, setParams(params)
, new ModelRowMapper&T&(entityType));
* 设置查询用的参数列表
* @param params
protected PreparedStatementSetter setParams(final Object[] params) {
return new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
// TODO Auto-generated method stub
for (int i = 0; i & params. i++) {
ps.setObject(i + 1, params[i]);
* 返回待插入实体上的所有非空属性值及属性名的Map
* @param entity
protected HashMap&String, Object& getChangesForInsert(T entity){
Field[] fields = entityType.getDeclaredFields();
HashMap&String, Object& insertValues = new HashMap&String, Object&();
for (Field field : fields) {
field.setAccessible(true);
//跳过id字段
if("id".equalsIgnoreCase(field.getName()))
Object value = field.get(entity);
if (value == null)
insertValues.put(field.getName(), value);
return insertV
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
子类Dao实例:UserDaoImpl
package DataBaseDemo.
import java.util.L
import DataBaseDemo.dao.UserD
import DataBaseDemo.model.UserVO;
public class UserDaoImpl extends BaseDaoImpl&UserVO& implements UserDao {
public UserVO queryUser() {
// TODO Auto-generated method stub
UserVO user=new UserVO();
//自定义的高级查询包装
public List&UserVO& listUsers(){
return queryAll();
核心拦截工厂对Model被修改的属性进行记录并通过CGLIB的接口进行拦截
package DataBaseDemo.
import java.util.HashM
import net.sf.cglib.proxy.C
import net.sf.cglib.proxy.E
import net.sf.cglib.proxy.NoOp;
* 使用UpdateFactory存放对象被改变的属性及其值
* 以对象的hashCode为key,值为被改变的HashMap
* @author Administrator
public class UpdateFactory {
public static HashMap&Integer,HashMap&String,Object&&
private static E
//以字典的方式记录每个对象的改变属性值
changes=new HashMap&Integer, HashMap&String,Object&&();
* 根据对象的hashCode存储对象被改变的属性值
* @param hash
* @param key
* @param value
public static void addChange(Integer hash,String key,Object value){
HashMap&String, Object& orginal=changes.get(hash);
if(orginal==null){
orginal=new HashMap&String, Object&();
orginal.put(key, value);
orginal.put(key, value);
changes.put(hash, orginal);
* 以对象的hashCode取出对象的所有变更
* @param hash
public static HashMap&String, Object& getChanges(Integer hash){
return changes.get(hash);
// 通过工厂生成对象,并产生拦截器,拦截set方法生成被改变的值Map
* 根据对象class生成对应实例,并使它的修改能够被CGLIB拦截
public static Object createVO(Class&?& clazz) {
enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
Callback[]
callbacks = new Callback[] { NoOp.INSTANCE, new UpdateInterceptor() };
enhancer.setCallbacks(callbacks);
enhancer.setCallbackFilter(new SetFilter());
return enhancer.create();
package DataBaseDemo.
import java.lang.reflect.F
import java.sql.ResultS
import java.sql.SQLE
import java.util.HashM
import org.springframework.jdbc.core.RowM
import DataBaseDemo.interceptor.UpdateF
* 使用包cglib和asm来创建对某一对象setters方法的拦截器
* @author Administrator
public class ModelRowMapper&T& implements RowMapper {
* @param args
public ModelRowMapper(Class&?& clazz) {
this.clazz =
// RowMapper中直接通过field给字段设值,避免干扰set拦截器的使用
public static Object setValues(HashMap&String, Object& map, Object entity) {
Field[] fields = entity.getClass().getDeclaredFields();
for (Field field : fields) {
Object value = map.get(field.getName());
if (value != null) {
field.setAccessible(true);
field.set(entity, value);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public void setValues(ResultSet rs, Object entity) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Object value = rs.getObject(field.getName());
field.setAccessible(true);
field.set(entity, value);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@SuppressWarnings("unchecked")
public T mapRow(ResultSet rs, int rowNum) throws SQLException {
//通过更新工厂的静态方法创建类实例,使它被CGLIB监控
T entity = (T) UpdateFactory.createVO(clazz);
setValues(rs, entity);
--目前的查询非常简单,需要进行优化
--无法支持事务管理,原因不明,进一步研究中
所有源码参照CloudStack3.0.2的相关代码编写
下载次数: 33
浏览: 44475 次
来自: 西安
cuisuqiang 写道java解析xml有多种方式,目前j ...
java解析xml有多种方式,目前jdk6已经包含了pull解 ...
基础东西,要经常总结才行
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 executeupdate 的文章

 

随机推荐