Spring JDBC Template

Spring作为适应性较好的框架,对JDBC也提供了良好的支持。Spring本身对JDBC进行了封装,使得在使用JDBC时更加简便。

Maven引入

  • spring核心jar包
  • spring的aop
  • spring的jdbc支持(jdbc,tx)
  • mysql的驱动包
<!-- spring JDBC Template-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
</dependency>

创建配置文件

<?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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="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.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/selection_course"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>

在配置文件中需要引入上下文约束、aop约束、tx约束。注册DriverManagerDataSource类作为连接池(spring默认的连接池,如果使用其他连接池可以修改注册的bean类)并在属性中设置驱动类,数据库连接地址,用户名和密码(其他连接设置可参照JDBC)。注册springJDBC的核心类JdbcTemplate,在使用中就可以实例化bean创建数据库连接。

Spring JDBC Template基础应用

execute

execute()方法主要执行命令类语句,例如创建或删除表、修改表结构等语句,没有参数和返回值。

update、batchupdate

updatebatchupdate方法用于处理数据的增、删、改操作。该方法有两种重载的方法

  • update(String sql, Object[] args),返回值为int类型用于记录影响的行数,其中第一个参数是需要执行的SQL语句,如果需要提供参数可以使用?来占位,第二个参数是需要向SQL语句中传递的参数,以数组的形式传递。
  • update(String sql, Object... args),返回值为int类型用于记录影响的行数,其中第一个参数是需要执行的SQL语句,如果需要提供参数可以使用?来占位,第二个参数是可变参数用于向SQL传递参数。
  • batchupdate(String[] sql),返回值为int类型数组用于记录影响的行数,参数为需要执行的SQL语句,以数组的形式进行传递。
  • batchupdate(String sql, List<Object[]> list),返回值为int类型数组用于记录影响的行数,第一个参数为需要执行的SQL,第二个参数为需要向SQL语句中传递的参数,以数组集合传递

batchupdate的两种重载的方法,第一种可以在数组中添加不同类型的SQL语句,而第二种只能执行一种类型的SQL语句

示例:

package com.spring.jdbc;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestJdbc {
    @Resource(name = "jdbcTemplate")
    private JdbcTemplate jdbcTemplate;

    @Test
    public void test1() {
        String sql = "INSERT INTO student (name, sex) VALUES (?, ?)";

        jdbcTemplate.update(sql, "梅长苏", "男");

        Object[] args = new Object[]{"萧景琰", "男"};
        jdbcTemplate.update(sql, args);
    }

    @Test
    public void test2() {
        String[] sqls = new String[]{
                "INSERT INTO course (name, score) VALUES ('高等数学', 3)",
                "INSERT INTO course (name, score) VALUES ('微积分', 4)",
                "DELETE FROM student WHERE id = 2"
        };

        jdbcTemplate.batchUpdate(sqls);

        String sql = "INSERT INTO course (name, score) VALUES (?, ?)";
        List<Object[]> list = new ArrayList<>();
        list.add(new Object[]{"C++基础", 4});
        list.add(new Object[]{"数据库系统概论", 4});
        jdbcTemplate.batchUpdate(sql, list);
    }
}

query

spring提供了多种的查询方法以适用查询各种结果:

查询简单数据结果

  • T queryForObject(String sql, Class<T> type)
  • T queryForObject(String sql, Object[] args, Class<T> type)
  • T queryForObject(String sql, Class<T> type, Object... args)
  • List<Object> queryForList(String sql, Class<T> type)
  • List<Object> queryForList(String sql, Object[] args, Class<T> type)
  • List<Object> queryForList(String sql, Class<T> type, Object... args)

前三种方法为查询单一结果,即返回值明确为唯一确定值,后三种方法查询单一数据类型的集合,即查询结果返回多个简单数据类型,spring会直接将结果封装为一个List集合

查询复杂数据对象(封装为Map)

如果查询结果不是一个字段而是多个字段,spring会将查询出的字段和字段对应的值封装为Map集合,字段名称作为值对应值作为值。若结果为唯一值则返回Map集合,若结果为多个结果则会将Map封装为一个List集合

  • Map<String, Object> queryForMap(String sql)
  • Map<String, Object> queryForMap(String sql, Object[] args)
  • Map<String, Object> queryForMap(String sql, Object... args)
  • List<Map<String, Object>> queryForList(String sql)
  • List<Map<String, Object>> queryForList(String sql, Object[] args)
  • List<Map<String, Object>> queryForList(String sql, Object... args)

查询复杂数据对象(封装为实体类)

如果需要直接返回一个实体类需要添加一个实现RowMapper接口的类,该类需要实现mapRow(ResultSet resultSet, int i)方法用于指定查询的字段与实体类的映射关系,参数ResultSet类与JDBC的用法相同,参数i表示的是当前查询第几行数据。

  • T queryForObject(String sql, RowMapper<T> mapper)
  • T queryForObject(String sql, Object[] args, RowMapper<T> mapper)
  • T queryForObject(String sql, RowMapper<T> mapper, Object... arges)
  • List<T> query(String sql, RowMapper<T> mapper)
  • List<T> query(String sql, Object[] args, RowMapper<T> mapper)
  • List<T> query(String sql, RowMapper<T> mapper, Object... args)

示例:

package com.spring.jdbc;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestJdbc {
    @Resource(name = "jdbcTemplate")
    private JdbcTemplate jdbcTemplate;

	@Test
    public void testQuerySimple1(){
        String sql = "select count(*) from student";
        int count = jdbcTemplate.queryForObject(sql,Integer.class);
        System.out.println(count);
    }

	@Test
    public void testQuerySimple2(){
        String sql = "select name from student where sex=?";
        List<String> names = jdbcTemplate.queryForList(sql,String.class,"女");
        System.out.println(names);
    }

	@Test
    public void testQueryMap1(){
        String sql = "select * from student where id = ?";
        Map<String,Object> stu = jdbcTemplate.queryForMap(sql,1003);
        System.out.println(stu);
    }

	@Test
    public void testQueryMap2(){
        String sql = "select * from student";
        List<Map<String,Object>> stus = jdbcTemplate.queryForList(sql);
        System.out.println(stus);
    }

	@Test
    public void testQueryEntity1(){
        String sql = "select * from student where id = ?";
        Student stu = jdbcTemplate.queryForObject(sql, new StudentRowMapper(), 1004);
        System.out.println(stu);
    }
    
    @Test
    public void testQueryEntity2(){
        String sql = "select * from student";
        List<Student> stus = jdbcTemplate.query(sql,new StudentRowMapper());
        System.out.println(stus);
    }
	
    private class StudentRowMapper implements RowMapper<Student>{
        public Student mapRow(ResultSet resultSet, int i) throws SQLException {
            Student stu = new Student();
            stu.setId(resultSet.getInt("id"));
            stu.setName(resultSet.getString("name"));
            stu.setSex(resultSet.getString("sex"));
            stu.setBorn(resultSet.getDate("born"));
            return stu;
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值