文档章节

Spring JdbcTemplate使用

小肥侠
 小肥侠
发布于 2015/01/05 15:47
字数 470
阅读 107
收藏 2

如果是个小项目,不想使用hibernate这些大块头,JdbcTemplate是个不错的选择.当然,DbUtils也不错.


先在spring配置文件中配置好datasource

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
destroy-method="close">
    <property name="driverClassName" 
                value="${dataSource.driverClassName}"/>
    <property name="url" value="${dataSource.url}"/>
    <property name="username" value="${dataSource.username}"/>
    <property name="password" value="${dataSource.password}"/>
</bean>

2. 在Dao中通过自动注入初始化JdbcTemplate 

private JdbcTemplate jdbcTemplate;
    @Autowired
    public void setDataSource(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
}

3. 使用jdbctemplate

public void add(User user) {
        jdbcTemplate.update("insert into tb_user(name, sex, age) value(?,?,?)",
                user.getName(), user.getSex(), user.getAge());
}
public User load(int id) {
    User user = jdbcTemplate.queryForObject("select id, name, sex, age from tb_user where id=?",
              new Object[]{id}, new UserMapper());
    return user;
}

 这里的UserMapper是一个手动映射,基于Spring的RowMapper,User为实体类型      

private static final class UserMapper implements RowMapper<User> {
        @Override
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setName(rs.getString("name"));
            user.setSex(rs.getString("sex"));
            user.setAge(rs.getInt("age"));
            return user;
        }
    }

   返回值为int类型:       

int countOfActorsNamedJoe = this.jdbcTemplate.queryForObject(
        "select count(*) from t_actor where first_name = ?", Integer.class, "Joe");

  在insert之后,如果想要在当前对象中,立刻得到主键id值,jdbctemplate就会比较麻烦 

  有两种方法: 

  1. 使用PreparedStatementCreator     

public void add(final User user) {
        KeyHolder keyHolder = new GeneratedKeyHolder();
        final String sql = "insert into tb_user(name, sex, age) value(?,?,?)";
        jdbcTemplate.update(
                new PreparedStatementCreator() {
                    public PreparedStatement createPreparedStatement(Connection connection)
                            throws SQLException {
                        PreparedStatement ps = connection.prepareStatement(sql, new String[] {"id"});
                        ps.setString(1, user.getName());
                        ps.setString(2, user.getSex());
                        ps.setInt(3, user.getAge());
                        return ps;
                    }
                },
                keyHolder);
        user.setId( keyHolder.getKey().intValue());
    }

2. 使用SimpleJdbcInsert 

private JdbcTemplate jdbcTemplate;
  private SimpleJdbcInsert insertActor;
    @Autowired
    public void setDataSource(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
        this.insertActor = new SimpleJdbcInsert(dataSource)
                .withTableName("tb_user")
                .usingGeneratedKeyColumns("id");
    }
  public void add2(User user){
        Map<String, Object> parameters = new HashMap<String, Object>(2);
        parameters.put("name", user.getName());
        parameters.put("sex", user.getSex());
        parameters.put("age", user.getAge());
        Number newId = insertActor.executeAndReturnKey(parameters);
        user.setId(newId.intValue());
    }

具体用哪一种,根据个人喜好

4. 测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/application-context.xml") 
//加入这两种注解,就可以直接在测试中使用spring bean,而不用使用ClassPathResource来加载配置文件
public class UserDaoTest {
    @Autowired
    UserDao userDao;
    @Test
    public void testAdd() throws Exception {
            User user = new User("phnix", "m", 25);
            userDao.add(user);
    }
    @Test
    public void testLoad(){
        User user = userDao.load(1);
        System.out.println(user.getName());
    }
}



© 著作权归作者所有

共有 人打赏支持
小肥侠
粉丝 3
博文 1
码字总数 470
作品 0
海淀
私信 提问
使用泛型和反射技术简化Spring jdbcTemplate的使用

最近没事儿研究了下springMVC,因为不想用hibernate,所以就是用了spring自带的jdbcTemplate。在使用的过程中发现spring jdbcTemplate需要自己实现将结果集转化为对象的操作,个人感觉很是繁...

JingHaiChao
2012/11/06
0
3
Hibernate与JdbcTemplate共享事务管理

在Spring和Hibernate的配置文件中,我们可以对类中的方法进行事务控制,也就是说某个方法中含有多个数据库的写操作,我们可以通过创建一个Spring中的HibernateTransactionManager实例,把相应...

安克诚
2012/09/11
0
0
Spring环境搭建之:控制反转(IoC Inversion of Control)与依赖注入(DI Depenency Injection)

控制反转,要明白是控制什么,怎么反转了就OK了 1.控制什么 不用Spring框架时,每个类文件中所用到的对象都要我们在代码中通过new来创建,这样一来,在面向接口编程时,也要通过new来明确的创...

木子丰
2013/11/27
0
0
SpringBoot的dao层、JdbcTemplate多数据源访问实例

前言: Spring boot集成mybatis大致过程如下: (1)新建maven project,在pom.xml文件中引入相关依赖。 (2)配置文件application.yml(application.properties) (3)编写pojo实体类 (4...

wangxuwei
2017/11/01
0
0
spring jdbctemplate 项目使用完整记录

一、前言 项目使用jdbctemplate已经一段时间了,对于jdbcTemplate的使用有了一些小小心得,这里总结后跟大家分享下。 二、spring xml 配置jdbcTemplate 三、通过DBColumnMapper、泛型封装添加...

漂泊者及其影子
2015/05/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前嗅ForeSpider脚本教程:标准对象(一)

今天,小编主要为大家介绍一下:前嗅ForeSpider脚本中的标准对象:爬虫链接类url,urltext采集的所有状态及属性类,html标签节点类domItem和(html)dom类dom。具体内容如下: 一.爬虫链接类...

forespider
13分钟前
1
0
javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify

在使用spring boot整合jpa时出现上述错误,在配置文件中,配置连接数据库的url时,加上useSSL=false url: jdbc:mysql://127.0.0.1:3306/数据库名称?serverTimezone=Asia/Shanghai&useSSL=fa...

朝如青丝暮成雪
23分钟前
1
0
JavaScript 为什么要有 Symbol 类型?

摘要: 为什么比怎么用更有意义。 原文:JavaScript 为什么要有 Symbol 类型 作者:前端小智 Symbols 是 ES6 引入了一个新的数据类型 ,它为 JS 带来了一些好处,尤其是对象属性时。 但是,它...

Fundebug
25分钟前
0
0
vs code 配置.json文件引入makefile文件实现多文件编译

背景: 之前使用VS code写c++时,没使用到多文件,所以对launch.jason和task.jason配置没过多配置,但不支持多文件间的编译,调试。 注:主要针对较大的一些工程,涉及多个文件的编译,使用到...

shzwork
25分钟前
1
0
大神教你Nginx常用基础配置方案

Nginx的fastcgi模块参数设置 Nginx 有两个配置文件fastcgi_params、fastcgi.conf,两者唯一的区别是,fastcgi.conf 多一个参数 SCRIPT_FILENAME,diff显示如下: $diff fastcgi fastcgi_param...

Linux就该这么学
31分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部