zoukankan      html  css  js  c++  java
  • Spring JdbcTemplate详解(转)

    原文地址:http://www.cnblogs.com/caoyc/p/5630622.html   尊重原创,请访问原文地址

    JdbcTemplate简介

      Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。

      JdbcTemplate位于中。其全限定命名为org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemlate还需一个这个包包含了一下事务和异常控制

      

    JdbcTemplate主要提供以下五类方法:

    • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

    • update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;

    • query方法及queryForXXX方法:用于执行查询相关语句;

    • call方法:用于执行存储过程、函数相关语句。

    下面进行案件分析

    在src下面新建一个属性配置文件

    1 jdbc.user=root
    2 jdbc.password=123456
    3 jdbc.driverClass=com.mysql.jdbc.Driver
    4 jdbc.jdbcUrl=jdbc:mysql:///test

      我们通常将数据库的配置信息单独放到一个文件中,这样也为了方便后期维护

    配置Spring配置文件applicationContext.xml

    复制代码
     1 <context:property-placeholder location="classpath:db.properties"/>
     2 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     3     <property name="user" value="${jdbc.user}"></property>
     4     <property name="password" value="${jdbc.password}"></property>
     5     <property name="driverClass" value="${jdbc.driverClass}"></property>
     6     <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
     7 </bean>
     8 
     9 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    10     <property name="dataSource" ref="dataSource"></property>
    11 </bean>
    复制代码

      第一行代码:用来读取db.properties文件中的数据。

      第二行代码:用来配置一个数据源,这里数据实现类来自C3P0中的一个属性类。其中属性的值就是来自于db.properties

      第九行代码:配置一个JdbcTemplate实例,并注入一个dataSource数据源

    测试代码

     

    1、update()方法

    a、通过update插入数据

    复制代码
    1 //启动IoC容器
    2 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
    3 //获取IoC容器中JdbcTemplate实例
    4 JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
    5 String sql="insert into user (name,deptid) values (?,?)";
    6 int count= jdbcTemplate.update(sql, new Object[]{"caoyc",3});
    7 System.out.println(count);
    复制代码

      这里update方法,第二参可以为可变参数。在数据库中可以看到,数据以被正确插入

    b、通过update修改数据

    1 String sql="update user set name=?,deptid=? where id=?";
    2 jdbcTemplate.update(sql,new Object[]{"zhh",5,51});

     c、通过update删除数据

    1 String sql="delete from user where id=?";
    2 jdbcTemplate.update(sql,51);

    2、batchUpdate()批量插入、更新和删除方法

    a、批量插入

    复制代码
    1 String sql="insert into user (name,deptid) values (?,?)";
    2 
    3 List<Object[]> batchArgs=new ArrayList<Object[]>();
    4 batchArgs.add(new Object[]{"caoyc",6});
    5 batchArgs.add(new Object[]{"zhh",8});
    6 batchArgs.add(new Object[]{"cjx",8});
    7 
    8 jdbcTemplate.batchUpdate(sql, batchArgs);
    复制代码

      batchUpdate方法第二参数是一个元素为Object[]数组类型的List集合

    3、从数据中读取数据到实体对象

      先定一个User实体类

    复制代码
     1 package com.proc;
     2 
     3 public class User {
     4     private Integer id;
     5     private String name;
     6     private Integer deptid;
     7     public Integer getId() {
     8         return id;
     9     }
    10     public void setId(Integer id) {
    11         this.id = id;
    12     }
    13     public String getName() {
    14         return name;
    15     }
    16     public void setName(String name) {
    17         this.name = name;
    18     }
    19     public Integer getDeptid() {
    20         return deptid;
    21     }
    22     public void setDeptid(Integer deptid) {
    23         this.deptid = deptid;
    24     }
    25 
    26     public String toString() {
    27         return "User [id=" + id + ", name=" + name + ", deptid=" + deptid + "]";
    28     }
    29 }
    复制代码

    a、读取单个对象

    1 String sql="select id,name,deptid from user where id=?";
    2 
    3 RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
    4 User user= jdbcTemplate.queryForObject(sql, rowMapper,52);
    5 System.out.println(user);

      输出结果:

      User [id=52, name=caoyc, deptid=6]

    【注意】:1、使用BeanProperytRowMapper要求sql数据查询出来的列和实体属性需要一一对应。如果数据中列明和属性名不一致,在sql语句中需要用as重新取一个别名

         2、使用JdbcTemplate对象不能获取关联对象

    b、读取多个对象

    复制代码
    1 String sql="select id,name,deptid from user";
    2 
    3 RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
    4 List<User> users= jdbcTemplate.query(sql, rowMapper);
    5 for (User user : users) {
    6     System.out.println(user);
    7 }
    复制代码

    输出结果

    ...

    User [id=49, name=姓名49, deptid=5]
    User [id=50, name=姓名50, deptid=8]
    User [id=52, name=caoyc, deptid=6]
    User [id=53, name=zhh, deptid=8]
    User [id=54, name=cjx, deptid=8]

    ---

    c、获取某个记录某列或者count、avg、sum等函数返回唯一值

    1 String sql="select count(*) from user";
    2 
    3 int count= jdbcTemplate.queryForObject(sql, Integer.class);
    4 System.out.println(count);

    在实际开发中可以怎样用

    UserDao.java

    复制代码
     1 package com.proc;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 import org.springframework.jdbc.core.BeanPropertyRowMapper;
     5 import org.springframework.jdbc.core.JdbcTemplate;
     6 import org.springframework.jdbc.core.RowMapper;
     7 import org.springframework.stereotype.Repository;
     8 
     9 @Repository
    10 public class UserDao {
    11 
    12     @Autowired
    13     private JdbcTemplate jdbcTemplate;
    14     
    15     public User get(int id){
    16         String sql="select id,name,deptid from user where id=?";
    17         RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
    18         return jdbcTemplate.queryForObject(sql, rowMapper,id);
    19     }
    20 }
    复制代码

    xml配置:

    复制代码
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:aop="http://www.springframework.org/schema/aop"
     5     xmlns:context="http://www.springframework.org/schema/context"
     6     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
     7         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
     9 
    10 <context:component-scan base-package="com.proc"></context:component-scan>
    11 <context:property-placeholder location="classpath:db.properties"/>
    12 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    13     <property name="user" value="${jdbc.user}"></property>
    14     <property name="password" value="${jdbc.password}"></property>
    15     <property name="driverClass" value="${jdbc.driverClass}"></property>
    16     <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
    17 </bean>
    18 
    19 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    20     <property name="dataSource" ref="dataSource"></property>
    21 </bean>
    22 </beans>
    复制代码

    代码测试

    1 UserDao userDao=(UserDao) ctx.getBean("userDao");
    2 System.out.println(userDao.get(53));
  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/zhaotiancheng/p/6642099.html
Copyright © 2011-2022 走看看