Spring(二十一):Spring JdbcTemplate

Posted yy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring(二十一):Spring JdbcTemplate相关的知识,希望对你有一定的参考价值。

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

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
  • update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
  • query方法及queryForXXX方法:用于执行查询相关语句;
  • call方法:用于执行存储过程、函数相关语句。

JdbcTemplate提供的接口测试:

第一步:导入包

a)导入mysql驱动包

b)导入spring包

b)导入C3P0依赖包:

第二步:新建spring配置文件(applicationContext.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:context="http://www.springframework.org/schema/context"
    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-4.3.xsd">
    <!-- 导入资源文件 -->
    <context:property-placeholder location="classpath:db.properties" />
    <!-- 自动扫描的包 -->
    <context:component-scan base-package="com.dx.jdbc"></context:component-scan>

    <!-- 配置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.dirverClass}"></property>

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

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

db.properties资源配置文件:

jdbc.user=root
jdbc.password=123456
jdbc.jdbcUrl=jdbc:mysql://localhost/test_spring_jdbc
jdbc.dirverClass=com.mysql.jdbc.Driver

jdbc.initialPoolSize=5
jdbc.maxPoolSize=50
jdbc.minPoolSize=3

第三步:新建测试类:

Department.java

package com.dx.jdbc;

public class Department {
    private Integer id;
    private String name;

    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;
    }

    @Override
    public String toString() {
        return "Department [id=" + id + ", name=" + name + "]";
    }

}
View Code

Employee.java

package com.dx.jdbc;

public class Employee {
    private Integer id;
    private String username;
    private Department department;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    @Override
    public String toString() {
        return "Employee [id=" + id + ", username=" + username + ", department=" + department + "]";
    }

}
View Code

JdbcTemplateTest.java测试类

package com.dx.jdbc;

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

import javax.sql.DataSource;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcTemplateTest {
    static ApplicationContext ctx = null;
    static DataSource dataSource = null;
    static JdbcTemplate jdbcTemplate = null;

    static {
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        dataSource = (DataSource) ctx.getBean("dataSource");

        try {
            System.out.println(dataSource.getConnection());
        } catch (SQLException e) {
            e.printStackTrace();
        }

        jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
    }

    public static void main(String[] args) throws SQLException {
        // testCreate();
        // testUpdate();
        // getEntity();
        // getList();
        // testQueryForObject();
    }

    private static void testQueryForObject() {
        String sql = "select count(id) from employee";
        long count = jdbcTemplate.queryForObject(sql, Long.class);
        System.out.println(count);
    }

    private static void getList() {
        String sql = "select id,username,depart_id from employee where id>?";
        RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
        List<Employee> employees = jdbcTemplate.query(sql, rowMapper, 1);

        System.out.println(employees);
    }

    /**
     * 注意dpartment不能级联查询,原因:jdbcTemplate是一个小工具,不是ORM框架。
     */
    private static void getEntity() {
        String sql = "select id,username,depart_id from employee where id=?";
        RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
        Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);

        System.out.println(employee);
    }

    private static void testCreate() {
        String sql = "insert into department(id,name)values(?,?)";
        List<Object[]> batchArgs = new ArrayList<Object[]>();
        batchArgs.add(new Object[] { 1, "软件开发部" });
        batchArgs.add(new Object[] { 2, "财务部" });
        batchArgs.add(new Object[] { 3, "人力资源部" });
        batchArgs.add(new Object[] { 4, "企业文化部" });
        batchArgs.add(new Object[] { 5, "市场部" });

        jdbcTemplate.batchUpdate(sql, batchArgs);

        sql = "insert into employee(id,username,depart_id)values(?,?,?)";
        batchArgs = new ArrayList<Object[]>();
        batchArgs.add(new Object[] { 1, "张三", 1 });
        batchArgs.add(new Object[] { 2, "李四", 1 });
        batchArgs.add(new Object[] { 3, "王五", 2 });
        batchArgs.add(new Object[] { 4, "马六", 4 });
        batchArgs.add(new Object[] { 5, "小七", 5 });

        jdbcTemplate.batchUpdate(sql, batchArgs);
    }

    /**
     * 修改
     */
    private static void testUpdate() {
        String sql = "update department set name=? where id=? ";
        jdbcTemplate.update(sql, "开发部", 1);
    }
}

开发中应用:

应用一:Dao类注入jdbcTemplate

package com.dx.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.Repository;

@Repository
public class EmployeeDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 根据id获取employee实体
     * 
     * @param id
     *            employee id信息
     */
    public Employee get(Integer id) {
        String sql = "select id,username,depart_id from employee where id=?";
        RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
        Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, id);

        return employee;
    }
}

调用测试:

package com.dx.jdbc;

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

import javax.sql.DataSource;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcTemplateTest {
    static ApplicationContext ctx = null;
    static EmployeeDao employeeDao = null;

    static {
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
        employeeDao = (EmployeeDao) ctx.getBean("employeeDao");
    }

    public static void main(String[] args) throws SQLException {
        testDao();
    }

    private static void testDao() {
        System.out.println(employeeDao.get(1));
    }
}

应用二:Dao类依赖JdbcDaoSupport

package com.dx.jdbc;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class DepartmentDao extends JdbcDaoSupport {
    @Autowired
    public void setDataSource2(DataSource dataSource) {
        setDataSource(dataSource);
    }

    /**
     * 根据id获取department实体
     * 
     * @param id
     *            department id信息
     */
    public Department get(Integer id) {
        String sql = "select id,name from department where id=?";
        RowMapper<Department> rowMapper = new BeanPropertyRowMapper<>(Department.class);
        Department department = getJdbcTemplate().queryForObject(sql, rowMapper, id);

        return department;
    }
}

调用测试:

package com.dx.jdbc;

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

import javax.sql.DataSource;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcTemplateTest {
    static ApplicationContext ctx = null;
    static DepartmentDao departmentDao = null;

    static {
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        departmentDao = (DepartmentDao) ctx.getBean("departmentDao");
    }

    public static void main(String[] args) throws SQLException {
        testDaoSupport();
    }

    private static void testDaoSupport() {
        System.out.println(departmentDao.get(1));
    }
}

NamedParameterJdbcTemplate具名参数操作对象:

使用如下:

package com.dx.jdbc;

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

import javax.sql.DataSource;

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 JdbcTemplateTest {
    static ApplicationContext ctx = null;
    static NamedParameterJdbcTemplate namedParameterJdbcTemplate = null;

    static {
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate");
    }

    public static void main(String[] args) throws SQLException {
        testInsert();
        testInsertModel();
    }

    private static void testInsertModel() {
        String sql = "insert into department(id,name)values(:id,:name)";
        Department department = new Department();
        department.setId(100);
        department.setName("name100");
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(department);

        namedParameterJdbcTemplate.update(sql, parameterSource);
    }

    private static void testInsert() {
        String sql = "insert into department(id,name)values(:id,:name)";
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("id", "99");
        paramMap.put("name", "name99");
        namedParameterJdbcTemplate.update(sql, paramMap);
    }
}

 

以上是关于Spring(二十一):Spring JdbcTemplate的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot-route(二十一)quartz实现动态定时任务

Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十一):服务网关(Zuul)

Spring Boot2 系列教程(二十一) | 自动配置原理

学习Spring-Data-Jpa(二十一)---DataSource与JPA属性配置

SpringCloud - Spring Cloud 之 Apollo Config携程阿波罗配置中心(二十一)

SpringCloud - Spring Cloud Alibaba 之 Seata分布式事务服务;AT事务模式机制,读写隔离(二十一)