SQL标准允许基于一个带参数列表的表达式进行查询。一个典型的例子可能像这样:"select * from T_ACTOR where id in (1, 2, 3)"。 不过这种参数列表的方式并不能直接被JDBC标准所支持 - 因为并不存在这种声明一个列表参数作为占位符的方式。 你不得不为此写多个占位符来表示多个参数,或者当你知道占位符的数量时,你可以动态构建SQL字符串。 NamedParameterJdbcTemplate和SimpleJdbcTemplate中所提供的命名参数的特性,采用的是后面一种做法。 当你传入参数时,你需要传入一个java.util.List类型,支持基本类型。而这个list将会在SQL执行时替换占位符并传入参数。
在使用IN语句时,当你传入大批量的值时要小心,JDBC标准并不确保超过100个元素在IN语句中。 有不少数据库可以超出这个值的限制,但是不同的数据库会有不同的数量限制,比如Oracle的限制数量是1000个。
除了基本类型之外,你还可以创建一个java.util.List的对象数组,这可以让你支持在IN表达式中编写多重表达式,例如"select * from T_ACTOR where (id, last_name) in ((1, 'Johnson'), (2, 'Harrop'))". 当然,这样做的前提是数据库底层的语法支持。
http://www.javaeye.com/problems/6124
select count(*) num from lottery_term where term_issuenum in (?) and
term_lotteryid = ?
改成getJdbcTemplate().queryForInt(sql,new Object[]{new
String[]{"2008326","2008325","2008324"},103});
List
list=new ArrayList();
list.add("****");
getJdbcTemplate().queryForInt(sql,new
Object[]{list,103});
或
select count(*) from info_document where category_id in
(:category_id_list);
Map<String,Object> parm = new
HashMap<String,Object>();
parm.put("category_id_list", idList);
public List getAllStu() { String sql="select s_id as sid,s_name as sname,s_sex as ssex,s_brith as sbrith from stu";
List list=this.getJdbcTemplate().query(sql,new BeanPropertyRowMapper(Stu.class));
return list;
}
关于execute和update方法之间的区别,update方法返回的是受影响的记录数目的 一个计数,并且如果传入参数的话,使用的是java.sql.PreparedStatement,而execute方法总是使用 java.sql.Statement,不接受参数,而且他不返回受影响记录的计数,更适合于创建和丢弃表的语句,而update方法更适合于插入,更新 和删除操作,这也是我们在使用时需要注意的。
Connection conn=DataSourceUtils.getConnection(getJdbcTempldate().getDataSource());
conn=getJdbcTemplate().getNativeJdbcExtractor().getNativeConnection(conn);
OracleConnection oconn=(OracleConnection)conn;
通过DataSourceUtils获取当前线程绑定的数据连接,为了使用线程上下文相关的事务,这样写是正确的写法,如果直接从DataSource获取连接,得到的是和当前线程上下文无关的新的数据库连接实例。
http://www.javaeye.com/topic/49932?page=2
http://www.javaeye.com/problems/15846
http://www.javaeye.com/topic/87034
http://www.javaeye.com/topic/508799
http://ttitfly.javaeye.com/blog/151560
jdbcTemplate的方式里如果带上int[] argTypes显示指定每个占位符所对应的字段数据类型,可以保证类型安全,当参数值为null时,提供了更好的支持。
-----------------------
上面这句话如何理解?
后在http://javazoo.bokee.com/viewdiary.15850865.html找到原因了
今天在调试程序的时候,在后台业务逻辑类中利用JdbcTemplate进行数据同步操作时,发现当
执行jdbcTemplate.update(带?的SQL语句,new Object[]{tmp.getName( ),tmp.getNo( ),tmp.getSpeciality( ),tmp.getMounterofficer( ),tmp.getDesigner( ),tmp.getProductivity( ),tmp.getState( ))
这种操作时,如果后面参数中有值为null时,后台会报异常,细想下也是,如果是null,那就要执行jdbc的setNull(Spring底层还是用JDBC做的)方法了,但是setNull方法要知道具体的数据库字段的类型.如setNull(1,Types.VARCHAR).而在上面的方法没有体现.
终于体会到update方法中第三个参数new int[]的作用了.!
spring还是很伟大的.
如果字段名和属性名是严格对应的,那么就可以不用自己写RowMapper了,使用BeanPropertyRowMapper:
getJdbcTemplate().query(sql, new BeanPropertyRowMapper(User.class));
类的属性字段名称要数据库中的字段名称一样或者数据库字段名为s_id类的名称为SId,
如果你没有遵守这个规范则可以在select语句后面给数据库字段名取别名
//绑定参数时,日期类型的写法,未经过验证
public void updStu(Stu stu) {
String sql = "update stu set s_name=?,s_sex=?,s_brith=? where s_id=?";
Object[] obj = new Object[] { stu.getSname(), stu.getSsex(),new java.sql.Date(stu.getSbrith().getTime()), stu.getSid() };
getJdbcTemplate().update(sql, obj, new int[] { Types.VARCHAR, Types.VARCHAR,Types.DATE, Types.INTEGER });
}
ConnectionCallback的用法,使用完要手动关闭连接吗?
spring的AbstractRoutingDataSource,可以多态切换数据库?
事务抽象层http://blog.csdn.net/congqian1120/archive/2008/01/16/2046311.aspx
http://www.oracle.com/technology/global/cn/pub/articles/marx_spring.html