• Spring JdbcTemplate详解


    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

     <context:property-placeholder location="classpath:db.properties"/>
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
         <property name="user" value="${jdbc.user}"></property>
         <property name="password" value="${jdbc.password}"></property>
         <property name="driverClass" value="${jdbc.driverClass}"></property>
         <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
     </bean>
     
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
         <property name="dataSource" ref="dataSource"></property>
    </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修改数据

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

     c、通过update删除数据

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

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

    a、批量插入

     String sql="insert into user (name,deptid) values (?,?)";
     List<Object[]> batchArgs=new ArrayList<Object[]>();
     batchArgs.add(new Object[]{"caoyc",6});
     batchArgs.add(new Object[]{"zhh",8});
     batchArgs.add(new Object[]{"cjx",8});
     jdbcTemplate.batchUpdate(sql, batchArgs);

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

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

      先定一个User实体类

      package com.proc;
      
      public class User {
          private Integer id;
          private String name;
          private Integer deptid;
          public Integer getId() {
              return id;
          }
         public void setId(Integer id) {
             this.id = id;
         }
         public String getName() {
             return name;
         }
         public void setName(String name) {
             this.name = name;
         }
         public Integer getDeptid() {
             return deptid;
         }
         public void setDeptid(Integer deptid) {
             this.deptid = deptid;
         }
     
         public String toString() {
             return "User [id=" + id + ", name=" + name + ", deptid=" + deptid + "]";
         }
     } 

    a、读取单个对象

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

      输出结果:

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

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

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

    b、读取多个对象

     String sql="select id,name,deptid from user";
     RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
     List<User> users= jdbcTemplate.query(sql, rowMapper);
     for (User user : users) {
         System.out.println(user);
    }

    输出结果

    ...

    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

      package com.proc;
      
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.jdbc.core.BeanPropertyRowMapper;
      import org.springframework.jdbc.core.JdbcTemplate;
      import org.springframework.jdbc.core.RowMapper;
      import org.springframework.stereotype.Repository;
      
      @Repository
     public class UserDao {
     
         @Autowired
         private JdbcTemplate jdbcTemplate;
         
         public User get(int id){
             String sql="select id,name,deptid from user where id=?";
             RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
             return jdbcTemplate.queryForObject(sql, rowMapper,id);
         }
     }

    xml配置:

     <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:aop="http://www.springframework.org/schema/aop"
          xmlns:context="http://www.springframework.org/schema/context"
          xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
              http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
      
     <context:component-scan base-package="com.proc"></context:component-scan>
     <context:property-placeholder location="classpath:db.properties"/>
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
         <property name="user" value="${jdbc.user}"></property>
         <property name="password" value="${jdbc.password}"></property>
         <property name="driverClass" value="${jdbc.driverClass}"></property>
         <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
     </bean>
     
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
         <property name="dataSource" ref="dataSource"></property>
     </bean>
     </beans> 

    代码测试

    UserDao userDao=(UserDao) ctx.getBean("userDao");
    System.out.println(userDao.get(53));
  • 相关阅读:
    CodeForces 347B Fixed Points (水题)
    CodeForces 347A Difference Row (水题)
    CodeForces 346A Alice and Bob (数学最大公约数)
    CodeForces 474C Captain Marmot (数学,旋转,暴力)
    CodeForces 474B Worms (水题,二分)
    CodeForces 474A Keyboard (水题)
    压力测试学习(一)
    算法学习(一)五个常用算法概念了解
    C#语言规范
    异常System.Threading.Thread.AbortInternal
  • 原文地址:https://www.cnblogs.com/lxl57610/p/7045078.html
Copyright © 2020-2023  润新知