spring学习总结(十一):spring 对 JDBC 的支持

本文介绍了Spring对JDBC的支持,主要聚焦于JdbcTemplate的使用,包括其简介、如何实例化、JdbcDaoSupport的介绍,以及在JDBC模板中使用具名参数的实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JdbcTemplate 简介

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

使用JdbcTemplate

①.加入依赖或jar
<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>4.3.2.RELEASE</version>
	</dependency>

	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.28</version>
	</dependency>

	<dependency>
		<groupId>c3p0</groupId>
		<artifactId>c3p0</artifactId>
		<version>0.9.1.2</version>
	</dependency>

	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
	</dependency>

	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jdbc</artifactId>
		<version>4.3.4.RELEASE</version>
	</dependency>
</dependencies>

②.数据库相关配置
dept表:id  dept_name
emp表:id name email deptid
并创建相关实体

db.properties
jdbc.user=root
jdbc.password=123456
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///test

jdbc.initPoolSize=5
jdbc.maxPoolSize=10

③.配置c3p0数据源
<!-- 导入资源文件 -->
<context:property-placeholder location="classpath:db.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="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
	<property name="driverClass" value="${jdbc.driverClass}"></property>

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

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

⑤.测试JdbcTemplate
package com.xyc.spring.jdbc;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * 
 * @ClassName:  SpringJDBCTest   
 * @Description:测试  JdbcTemplate
 * @author: xyc 
 * @date:   2016年12月25日 下午5:57:20   
 *
 */
public class SpringJDBCTest {

    private ApplicationContext context;

    private JdbcTemplate jdbcTemplate;

    {
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
        jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
    }

    /**
     * 
     * @Title: testUpdate
     * @Description: 执行 INSERT, UPDATE, DELETE
     * @param:
     * @return: void
     * @throws
     */
    @Test
    public void testUpdate() {
        // String sql = "UPDATE emp SET name = ? WHERE id = ?";
        // jdbcTemplate.update(sql, "Jack", 5);

        // String sql = "delete from emp where id = ?";
        // jdbcTemplate.update(sql, 6);

        String sql = "insert into emp(name,email,dept_id) value(?,?,?)";
        jdbcTemplate.update(sql, "HH", "hh@zto.com", 1);
    }

    /**
     * 
     * @Title: getConnection
     * @Description: 测试连接
     * @param: @throws SQLException
     * @return: void
     * @throws
     */
    @Test
    public void getConnection() throws SQLException {
        DataSource dataSource = (DataSource) context.getBean("dataSource");
        System.out.println(dataSource.getConnection());
    }
}

JdbcTemplate实例

执行批量更新:
/**
 * 
 * @Title: testBatchUpdate
 * @Description: 执行批量更新: 批量的 INSERT, UPDATE, DELETE 最后一个参数是 Object[] 的 List 类型: 因为修改一条记录需要一个
 *               Object 的数组,那么多条不就需要多个 Object 的数组吗
 * @param:
 * @return: void
 * @throws
 */
@Test
public void testBatchUpdate() {
    String sql = "INSERT INTO emp(name, email, dept_id) VALUES(?,?,?)";

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

    batchArgs.add(new Object[] { "AA", "aa@zto.com", 1 });
    batchArgs.add(new Object[] { "BB", "bb@zto.com", 2 });
    batchArgs.add(new Object[] { "CC", "cc@zto.com", 3 });
    batchArgs.add(new Object[] { "DD", "dd@zto.com", 3 });
    batchArgs.add(new Object[] { "EE", "ee@zto.com", 2 });

    jdbcTemplate.batchUpdate(sql, batchArgs);
}

获取一条记录:
/**
 * 
 * @Title: testQueryForObject
 * @Description: 从数据库中获取一条记录, 实际得到对应的一个对象 注意不是调用 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框架
 * @param:
 * @return: void
 * @throws
 */
@Test
public void testQueryForObject() {
    String sql = "SELECT id, name , email, dept_id  FROM emp WHERE id = ?";
    RowMapper<Emp> rowMapper = new BeanPropertyRowMapper<>(Emp.class);
    Emp employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);

    System.out.println(employee);
}

查询实体类的集合:
/**
 * 
 * @Title: testQueryForList
 * @Description: 查询实体类的集合 注意调用的不是 queryForList 方法
 * @param:
 * @return: void
 * @throws
 */
@Test
public void testQueryForList() {
    String sql = "SELECT id, name , email FROM emp WHERE id > ?";
    RowMapper<Emp> rowMapper = new BeanPropertyRowMapper<>(Emp.class);
    List<Emp> employees = jdbcTemplate.query(sql, rowMapper, 5);

    System.out.println(employees);
}
获取单个列的值
/**
 * 
 * @Title: testQueryForObject2
 * @Description: 获取单个列的值, 或做统计查询 使用 queryForObject(String sql, Class<Long> requiredType)
 * @param:
 * @return: void
 * @throws
 */
@Test
public void testQueryForObject2() {
    String sql = "SELECT count(id) FROM emp";
    long count = jdbcTemplate.queryForObject(sql, Long.class);

    System.out.println(count);
}

JdbcDaoSupport 

Spring JDBC 框架还提供了一个 JdbcDaoSupport 类来简化 DAO 实现. 该类声明了 jdbcTemplate 属性
/**
 * 
 * @ClassName:  DeptDao   
 * @Description:扩展 JdbcDaoSupport     不推荐使用 JdbcDaoSupport, 而推荐直接使用 JdbcTempate 作为 Dao 类的成员变量
 * @author: xyc 
 * @date:   2016年12月25日 下午5:16:41   
 *
 */
@Repository("deptDAO")
public class DeptDAO extends JdbcDaoSupport {

    @Autowired
    public void setDataSource2(DataSource dataSource) {
        setDataSource(dataSource);
    }

    public Dept get(Integer id) {
        String sql = "SELECT id, dept_name FROM dept WHERE id = ?";
        RowMapper<Dept> rowMapper = new BeanPropertyRowMapper<>(Dept.class);
        return getJdbcTemplate().queryForObject(sql, rowMapper, id);
    }

}

测试:

package com.xyc.spring.jdbc;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringJDBCTest {

    private ApplicationContext context;

    private DeptDAO deptDAO;

    {
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
        deptDAO = (DeptDAO) context.getBean("deptDAO");
    }

    /**
     * 
     * @Title: testDepartmentDao
     * @Description: 测试实现JdbcDaoSupport接口的使用
     * @param:
     * @return: void
     * @throws
     */
    @Test
    public void testDepartmentDao() {
        System.out.println(deptDAO.get(2));
    }
}

在 JDBC 模板中使用具名参数

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

测试:
package com.xyc.spring.jdbc;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;

public class SpringJDBCTest {

    private ApplicationContext context;

    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    {
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
        namedParameterJdbcTemplate = context.getBean(NamedParameterJdbcTemplate.class);
    }

    /**
     * 使用具名参数时, 可以使用 update(String sql, SqlParameterSource paramSource) 方法进行更新操作 1. SQL
     * 语句中的参数名和类的属性一致! 2. 使用 SqlParameterSource 的 BeanPropertySqlParameterSource 实现类作为参数.
     */
    @Test
    public void testNamedParameterJdbcTemplate2() {
        String sql = "INSERT INTO emp(name, email, dept_id) " + "VALUES(:name,:email,:dept_id)";

        Emp employee = new Emp();
        employee.setName("XYC");
        employee.setEmail("xyc@sina.com");
        employee.setDept_id(3);

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

    /**
     * 可以为参数起名字. 1. 好处: 若有多个参数, 则不用再去对应位置, 直接对应参数名, 便于维护 2. 缺点: 较为麻烦.
     */
    @Test
    public void testNamedParameterJdbcTemplate() {
        String sql = "INSERT INTO emp(name, email, dept_id) VALUES(:ln,:email,:deptid)";

        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("ln", "YY");
        paramMap.put("email", "yy@zto.com");
        paramMap.put("deptid", 2);

        namedParameterJdbcTemplate.update(sql, paramMap);
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值