Spring对 JDBC 的支持,JdbcTemplate类的使用

导包:spring框架的包 和 连接数据库连接池的c3p0包 连接mysql数据库的包;

在src目录下建立jdbc.properties文件:存放连接数据库的属性值

jdbc.user=root
jdbc.password=lxn123
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///spring1

jdbc.initPoolSize=5
jdbc.maxPoolSize=10

在src目录下建立spring bean configuration file的xml文件:applicationContext.xml

    <!-- 基于注解的,导入标识的包,可以识别本包,或其自包,其只对带有指定注解的类,方法有效,不是对这个包中的所有类和方法有效 -->
    <context:component-scan base-package="com.atguigu.spring.jdbc"></context:component-scan>

    <!-- 导入资源文件 ,classpath.jdbc.properties 为类路径下的文件名为 jdbc.properties-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 配置c3p0数据源 -->
    <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>

        <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
    </bean>

    <!-- 配置spring的JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

  <!-- 配置namedParameterJdbcTemplate,该对象可以使用具名参数, 其没有无参数的构造器, 所以必须为其构造器指定参数 -->
  <bean id="namedParameterJdbcTemplate"
    class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"></constructor-arg>
  </bean>

建立test类中可能用到的Employee,Department类,这里,只有属性,set,get,tostring等方法就。。。

Employee类的属性:

private Integer id;
private String lastName;
private String email;
private Department department;

Department类的属性:

private Integer id;
private String name;

建立类:EmployeeDao,基于注解的查询方法

package com.atguigu.spring.jdbc;

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.Component;

@Component//基本注解
public class EmployeeDao {

    @Autowired
    public JdbcTemplate jdbcTemplate;

    public Employee get(Integer id){
        String sql="select id,last_name,email from tables where id=?";
        RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
        Employee employee=jdbcTemplate.queryForObject(sql, rowMapper, id);
        return employee;
    }
}    

建立一个JUtil Test测试类:JDBCTest

package com.atguigu.spring.jdbc;

import static org.junit.Assert.*;

import java.util.List;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.sql.DataSource;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
//测试类
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
public class JDBCTest {

    private ApplicationContext ctx=null;
    private JdbcTemplate jdbcTemplate;
    private EmployeeDao employeeDao;
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    {
        ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
        employeeDao=ctx.getBean(EmployeeDao.class);     namedParameterJdbcTemplate=ctx.getBean(NamedParameterJdbcTemplate.class);
    }
      

  @Test
  /**
   * 使用具名参数时, 可以使用 update(String sql, SqlParameterSource paramSource) 方法进行更新操作
  * 1. SQL 语句中的参数名和类的属性一致!即上边employee中属性一致
  * 2. 使用 SqlParameterSource 的 BeanPropertySqlParameterSource 实现类作为参数.
  */
  public void testNamedParameterJdbcTemplate2(){
    String sql="insert into tables(last_name,email,dept_id) values(:lastName,:email,:deptId)";
    Employee employee=new Employee();
    employee.setLastName("panpan");
    employee.setEmail("@panpan");
    employee.setDeptId(4);

    SqlParameterSource paramSource=new BeanPropertySqlParameterSource(employee);
    namedParameterJdbcTemplate.update(sql, paramSource);
  }

    

   //可以为参数起名字
   //好处: 若有多个参数, 则不用再去对应位置, 直接对应参数名, 便于维护
  //缺点: 较为麻烦.
  public void testNamedParameterJdbcTemplate(){
    String sql="insert into tables(last_name,email,dept_id) values(:la,:em,:de)";

    Map<String, Object> paramMap=new HashMap<String, Object>();

    paramMap.put("la", "fsd");
    paramMap.put("em", "@ji");
    paramMap.put("de", 3);

    namedParameterJdbcTemplate.update(sql, paramMap);
  }

    @Test
    //对基于注解的方法测试
    public void testEmployeeDao(){
        System.out.println(employeeDao.get(1));
    }

    //获取单个列的值, 或做统计查询
    //使用 queryForObject(String sql, Class<Long> requiredType)
    public void testQueryForObject2(){
        String sql="select count(id) from tables";
        long count=jdbcTemplate.queryForObject(sql, Long.class);
        System.out.println(count);
    }

    //查到实体类的集合
    //注意调用的不是 queryForList 方法
    public void testQueryForList(){
        String sql="select id,last_name,email from tables where id>?";
        RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
        List<Employee> employees=jdbcTemplate.query(sql, rowMapper, 1);

        System.out.println(employees);
    }

    /**
     * 从数据库中获取一条记录, 实际得到对应的一个对象
     * 注意不是调用 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法!
     * 而需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)
     * 1. 其中的 RowMapper 指定如何去映射结果集的行, 常用的实现类为 BeanPropertyRowMapper
     * 2. 使用 SQL 中列的别名完成列名和类的属性名的映射. 例如 last_name lastName
     * 3. 不支持级联属性. JdbcTemplate 到底是一个 JDBC 的小工具, 而不是 ORM 框架
     */
    public void testQueryForObject(){
        String sql="select id,last_name lastName,email,dept_id as \"department.id\" from tables where id=?";

        RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
        Employee employee=jdbcTemplate.queryForObject(sql, rowMapper,1);

        System.out.println(employee);
    }

    //执行批量更新: 批量的 INSERT, UPDATE, DELETE
    //最后一个参数是 Object[] 的 List 类型: 因为修改一条记录需要一个 Object 的数组,
    //那么多条不就需要多个 Object 的数组
    public void testBatchUpdate(){
        String sql="insert into tables(last_name,email,dept_id) values(?,?,?)";

        List<Object[]> batchArgs=new ArrayList<>();

        batchArgs.add(new Object[]{"AAA","testa",5});
        batchArgs.add(new Object[]{"BBB","JIJK",6});
        batchArgs.add(new Object[]{"CCC","panpN",3});
        batchArgs.add(new Object[]{"DDD","jfids",2});
        batchArgs.add(new Object[]{"EEE","tfsd",4});

        jdbcTemplate.batchUpdate(sql,batchArgs);
    }

    //执行 INSERT, UPDATE, DELETE,只修改sql语句,即可
    public void testUpdate(){
        String sql="update tables set last_name=? where id=?";
        jdbcTemplate.update(sql, "权", "1");
    }

    //测试数据库连接池是否连接成功
    public void testDataSource() throws SQLException {
        DataSource  dataSource=ctx.getBean(DataSource.class);
        System.out.println(dataSource.getConnection());
    }

}

 

时间: 2024-11-05 21:03:20

Spring对 JDBC 的支持,JdbcTemplate类的使用的相关文章

spring对JDBC的支持

传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: Java代码   //cn.javass.spring.chapter7. TraditionalJdbcTest @Test public void test() throws Exception { Connection conn = null; PreparedStatement pstmt = null; try { conn = getConnection();              //1.获取JDBC连接 //2.声

Spring框架学习六:Spring对JDBC的支持

JdbcTemplate简介 为了使JDBC更加易于使用,Spring 在 JDBC API 上定义了一个抽象层,以此建立一个 JDBC 存取框架 作为 Spring JDBC 框架的核心,JDBC 模板的设计目的是为不同类型的 JDBC 操作提供模板方法.每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取工作量降到最低. #添加c3p0数据库连接池 jdbc.user=root jdbc.password=000 jdbc.jd

Spring 对JDBC的支持(JdbcTemplate)

Spring对数据库的操作,使用JdbcTemplate对象 需要引入相关的jar文件 如版本:(Spring核心jar包就不列了) spring-jdbc-3.2.5.RELEASE.jar spring-tx-3.2.5.RELEASE.jar C3P0连接池:c3p0-0.9.1.2.jar 数据库驱动包:mysql-connector-java-5.1.22-bin.jar 例:(对象的获取及注入通过spring来实现) 核心jdbc操作 1 package test.jdbc; 2 3

Java进阶知识23 Spring对JDBC的支持

1.最主要的代码 Spring 配置文件(beans.xml) 1 <!-- 连接池 --> 2 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 3 <!-- 注册驱动 --> 4 <property name="driverClass" value="com.mysql.jdbc.Driver&q

(7)Spring对JDBC的支持

使用Spring JDBC的步骤 1.引入jar包 spring-jdbc-3.2.5.RELEASE.jar spring-tx-3.2.5.RELEASE.jar c3p0-0.9.1.2.jar mysql-connector-java-5.1.38-bin.jar 2.配置 c3p0数据库连接池的配置 JdbcTemplate对象 Dao对象 3.测试 applicationContext.xml <?xml version="1.0" encoding="UT

Spring抽象JDBC,使用JdbcTemplate

<?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:mvc="http://www.springframework.org/schema/

开涛spring3(6.9) - 对JDBC的支持 之 7.1 概述

7.1  概述 7.1.1  JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: //cn.javass.spring.chapter7. TraditionalJdbcTest @Test public void test() throws Exception { Connection conn = null; PreparedStatement pstmt = null; try { conn = getConnection(); //1.获取JDBC连接 //2.声

Spring整合JDBC模板方法设计模式之基于组合的实现

Spring整合JDBC模板方法设计模式之基于组合的实现 模板设计模式指的是将相应的模板方法提取出来在一个专门的一个位置定义,然后把相同调用过程的操作通过模板实现. 对于模板设计模式,一般有2中方式 1.基于继承的方式实现 2.基于组合的方式实现 前面实现了:1.基于继承的方式实现 ,Spring整合JDBC模板方法设计模式之基于继承的实现 接下来实现:2.基于组合的方式实现 Spring整合JDBC模板方法设计模式之基于组合的方法在我们有大量类的情况下使用特别方便. 此实现模拟了Spring中

(四)Spring 对DAO 的支持

第一节:Spring 对JDBC 的支持 1,配置数据源dbcp: 2,使用JdbcTemplate: 3,JdbcDaoSupport 的使用: 4,NamedParameterJdbcTemplate 的使用:支持命名参数变量: org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate 1,使用JdbcTemplate: T.java: 1 package com.wishwzp.test; 2 3 import