首页 > 其他分享 >spring 3 jdbc常用小结

spring 3 jdbc常用小结

时间:2022-12-05 10:02:53浏览次数:76  
标签:personFirstName jdbc String forum spring sql new 小结


spring 3的jdbc跟spring mvc搭配起来挺好用的,本文试着小结其主要使用方法,并举出spring 3.3.2中的一些信变化进行解析

1) 在dao中注入jdbctemplate,然后直接execute sql一下,当然配置文件要配置,如

@Autowired
private JdbcTemplate jdbcTemplate;
........
String sql=".......";
jdbcTemplate.execute(sql);



配置文件:



<bean id="jdbcTemplate" 

class="org.springframework.jdbc.core.JdbcTemplate"

p:dataSource-ref="dataSource"/>

具体的crud都可以用update方法去实现(insert,update,delete都可以使用update方法),比如:


final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)";
Object[] params = new Object[] { forum.getForumName(),
forum.getForumDesc() };

jdbcTemplate.update(sql, params);


就是使用?做占位符了。



2 接下来看如何获得自增主键


spring使用KeyHolder接口的一个实现类GeneratedKeyHolder返回每次插入后的自增键;


KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection conn)
throws SQLException {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, forum.getForumName());
ps.setString(2, forum.getForumDesc());
return ps;
}
}, keyHolder);
forum.setForumId(keyHolder.getKey().intValue());


keyHolder.getKey().intValue()这里就获得了信增加的主键了;




3 接下来看下如何查询数据,这个是很基本的了,spring jdbc使用了


RowCallbackHandler的回调接口



String sql = "SELECT ......"; 

final List<Forum> forums = new ArrayList<Forum>();
jdbcTemplate.query(sql,new Object[]{fromId,toId},new
RowCallbackHandler(){ public void processRow(ResultSet rs) throws
SQLException { Forum forum = new Forum();
forum.setForumId(rs.getInt("forum_id"));
forum.setForumName(rs.getString("forum_name"));
forum.setForumDesc(rs.getString("forum_desc"));
forums.add(forum);
}}); return forums;




另外一种常用的方法是使用rowmapper处理结果集


@Override
public Person getPerson(String lastName) {

String query = "select personId, personFirstName, personLastName from personTbl where personLastName = ?";

return this.getJdbcTemplate().queryForObject(query, new PersonMapper(), lastName);

}


注意的是,这里用rowmapper方法的话,会自动把查出来的每个行记录集自动添加到List中去的,如果数量太多,比如100万个,则list很大,容易内存溢出;而采用


rowbcallbackhandler的话,则在processrow中获得数据后马上进行处理(比如群发邮件时,马上发送邮件)。



4 查询单值数据,典型的有如queryForObject,queryForInt;


public int getNumberOfPeople() {

int rowCount = this.getJdbcTemplate().queryForInt("select count(0) from personTbl");

return rowCount;
}


String firstName = this.getJdbcTemplate().queryForObject(
"select personFirstName from personTbl where personLastName = ?",
String.class,
lastName ) ;




5 NamedParameterJDBCTemplate,这是一个很好用的JDBC模板类,解决的是?号占位符号的麻烦(容易对错位置等)


例子如下:


String sql = "select count(0) from personTbl where personFirstName = :first_name";

SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);

return this.getNamedParameterJdbcTemplate().queryForInt(sql, namedParameters);



这里可以看到,SQL中的使用:first_name了,并且用MapSqlParameterSource来进行绑定;还有种方法是使用BeanPropertySqlParameterSource;比如:


public List<Person> getPerson(Person personSkeleton) 
{
SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(personSkeleton);

List<Person> people = this.getNamedParameterJdbcTemplate().query(
"select personID, personFirstName, personLastName from personTbl " +
" where personLastName = :personLastName and personFirstName = :personFirstName",

namedParameters,

new PersonMapper()

);



这里其实就是参数整个javabean传进来,其中:personLastName,personFirstName都必须是javabean中的属性,这样才能一一匹配;


还有一个就是simplejdbctemplate,例子如下:



public void addPerson(Person newPerson) {

SimpleJdbcInsert insertPerson =
new SimpleJdbcInsert(this.getDataSource())
.withTableName("personTbl").usingGeneratedKeyColumns("personID");


Map<String, Object> parameters = new HashMap<String, Object>(3);
parameters.put("personFirstName", newPerson.getPersonFirstName() );
parameters.put("personLastName", newPerson.getPersonLastName() );
insertPerson.execute(parameters);


}


也是很简单容易理解吧。



下面提及下最新的spring jdbc 3.2.2中,


queryForInt("select count(0) from personTbl")



这个写法换了,换成:


queryForObject("select count(0) from personTbl", Integer.class)


详细的更换和丢弃的方法见:


​http://static.springsource.org/spring/docs/3.2.x/javadoc-api/deprecated-list.html ​

标签:personFirstName,jdbc,String,forum,spring,sql,new,小结
From: https://blog.51cto.com/u_14230175/5911340

相关文章

  • spring mvc中的拦截器小结
    在springmvc中,拦截器其实比较简单了,下面简单小结并demo下。preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们......
  • springboot_02
    1.修改配置 ky格式修改配置文件  1.1application.yml格式(一般用这种格式) ......
  • Spring实例化bean的方法
    Spring实例化bean的方法主要有四种:通过构造方法实例化bean,使用静态工厂实例化bean,使用实例工厂实例化bean,使用FactoryBean实例化bean。前三种了解即可,使用FactoryBean实例......
  • spring 动态获取配置spring获取所有配置spring运行中获取配置列表
    1:在任何springbean中注入PropertySourcesPlaceholderConfigurer对象,如:@AutowiredPropertySourcesPlaceholderConfigureraa; 2:获取当前配置中的值ObjectgetProp......
  • 通过Shell脚本自动安装Hive&JDBC测试&提供CDH5网盘地址
    〇、参考地址1、Linux下编写脚本自动安装hivehttps://blog.csdn.net/weixin_44911081/article/details/121227024?ops_request_misc=%257B%2522request%255Fid%2522%253A......
  • spring源码 自定义beanDefinition的添加逻辑
      首先我自定义了两个beandefinition,第一个会产生第二个,并且都是特殊的实现,能够避开前面的循环读取,所以,spring在最后用了一个while循环,一个flag就将,beandefinition新增......
  • SpringCloud Alibaba学习笔记
    该笔记整理至尚硅谷周阳老师的SpringCloud课程SpringCloudAlibaba篇SpringCloudAlibaba入门简介SpringCloudNetflix项目进入维护模式,SpringCloudNetflix将不再......
  • CompletionService 使用小结
    本文为博主原创,转载请注明出处:实现异步任务时,经常使用 FutureTask来实现;一个简单的示例代码如下:publicstaticvoidmain(String[]args)throwsExecutionExcept......
  • Spring validate 探索
      Springcontextvalidate包  RequestResponseBodyMethodProcessor   MethodValidationInterceptor    spring自动PrimaryDefaultValidato......
  • 快速创建spring boot 项目
    因为我装的是社区版idea, 不能安装springinitializer插件,所以只能在网站上create.GENERATE 然后下载下来即可:https://start.spring.io/ ......