Spring框架之JDBCTemplate

1、JDBC Template概述

JDBCTemplate类似于DBUtils,是用于操作JDBC的工具类,它需要依赖于连接池DataSource(数据源)。

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。除此之外,还有ODBC(Open Database Connectivity)开放数据库连接,它是微软公司开发的一组对数据库访问的标准API(应用程序编程接口)。

DataSource(数据源)的概念来自于数据库连接池,有点类似于JDBC中的connection。常见的数据库连接池有DBCP、C3P0两种,关于两者的区别参考我的另一篇博客 Java之JDBC中数据库DBCP、C3P0连接池的使用

下面将基于Spring框架、MySQL数据库演示JDBC Template的使用。

2、环境搭建

①、创建数据库、表
#创建数据库spring_project_02
create database spring_project_02;
#选中数据库spring_project_02
use spring_project_02;
#在spring_project_02数据库创建表t_user
create table t_user(
	#设为主键、自动增长
	id int primary key auto_increment,
  	username varchar(20),
  	password varchar(20)
);
#往表中插入两条数据
insert into t_user(username, password) values('张三','123'),('李四','456');

在这里插入图片描述

②、导入jar包到项目中

在这里插入图片描述
Jar包百度云链接: https://pan.baidu.com/s/1Xv5nCIwXb5U-cAS12J7p1g 提取码: 5szf

③、创建User模型
package cn.hestyle.model;

/**
 * @program: Spring Project 02->User
 * @description: User模型
 * @author: hestyle
 * @create: 2019-11-27 17:17
 **/
public class User {
    private Integer id;
    private String username;
    private String password;

    public User() {
    }

    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 String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
④、测试MySQL连接
package cn.hestyle.test;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @program: Spring Project 01->Test01
 * @description:
 * @author: hestyle
 * @create: 2019-11-30 16:35
 **/
public class Test01 {
    public static void main(String[] args) {
        //定义数据源
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/spring_project_02");
        //mysql数据库账号,自行修改
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        //获取jdbcTemplate对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        //向表中插入一条记录
        jdbcTemplate.update("INSERT INTO t_user(username, password) VALUES('hestyle-01', '123456')");
        //查询t_user表中的所有记录
        jdbcTemplate.query("SELECT * FROM t_user", new RowCallbackHandler() {
            @Override
            public void processRow(ResultSet resultSet) throws SQLException {
                System.out.println(resultSet.getString(1) + "\t" + resultSet.getString(2) + "\t" + resultSet.getString(3));
            }
        });
    }
}

控制台输出:
在这里插入图片描述

3、配置DBCP、C3P0数据库连接池

①、编写dao

UserDao接口

package cn.hestyle.dao;

import cn.hestyle.model.User;

import java.util.List;

/**
 * @author hestyle
 */
public interface UserDao {
    /**
     * service添加user
     */
    public void add(User user);

    /**
     * service修改user
     */
    public void update(User user);

    /**
     * service删除user
     */
    public void deleteById(Integer id);

    /**
     * 通过id查找user
     * @param id
     * @return
     */
    public User getUserById(Integer id);

    /**
     * 获取所有User
     * @return
     */
    public List<User> getUsers();
}

UserDaoImpl实现类

package cn.hestyle.dao.impl;

import cn.hestyle.dao.UserDao;
import cn.hestyle.model.User;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;

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


/**
 * @program: Spring Project 01->UserServiceImpl
 * @description: UserService实现类
 * @author: hestyle
 * @create: 2019-11-30 11:43
 **/
public class UserDaoImpl implements UserDao {
    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void add(User user) {
        String sql = "INSERT INTO t_user(username, password) VALUES(?, ?)";
        //配置sql参数
        Object[] args = new Object[]{user.getUsername(), user.getPassword()};
        //使用jdbcTemplate更新到数据库
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void update(User user) {
        String sql = "UPDATE t_user SET username = ?, password = ? WHERE id = ?";
        //配置sql参数
        Object[] args = new Object[]{user.getUsername(), user.getPassword(), user.getId()};
        //使用jdbcTemplate更新到数据库
        jdbcTemplate.update(sql, args);
    }

    @Override
    public void deleteById(Integer id) {
        String sql = "DELETE FROM t_user WHERE id = ?";
        //使用jdbcTemplate更新到数据库
        jdbcTemplate.update(sql, id);
    }

    @Override
    public User getUserById(Integer id) {
        String sql = "SELECT * FROM t_user WHERE id = ?";
        //配置sql参数
        Object[] args = new Object[]{id};
        //获取返回结果(id是主键,所以只有一行)
        List<Map<String, Object>> users = jdbcTemplate.queryForList(sql, args);
        User user = new User();
        user.setId((Integer)users.get(0).get("id"));
        user.setUsername((String)users.get(0).get("username"));
        user.setPassword((String)users.get(0).get("password"));
        return user;
    }

    @Override
    public List<User> getUsers() {
        List<User> userList = new ArrayList<>();
        String sql = "SELECT * FROM t_user";
        jdbcTemplate.query(sql, new RowCallbackHandler() {
            @Override
            public void processRow(ResultSet resultSet) throws SQLException {
                //处理结果集中的行记录
                User user = new User();
                user.setId(Integer.parseInt(resultSet.getString(1)));
                user.setUsername(resultSet.getString(2));
                user.setPassword(resultSet.getString(3));
                userList.add(user);
            }
        });
        return userList;
    }
}
②、编写DBCP、C3P0配置文件

beans-1.xml放在src根目录下
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 声明DBCP数据库连接池的数据源 -->
    <bean id="dataSource-DBCP" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/spring_project_02"/>
        <!-- mysql数据库账号,自行修改 -->
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <!-- 声明使用DBCP数据库连接池数据源的jdbcTemplate -->
    <bean id="jdbcTemplate-DBCP" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource-DBCP"/>
    </bean>
    <!-- 申明使用jdbcTemplate-DBCP的userDao -->
    <bean id="userDao-DBCP" class="cn.hestyle.dao.impl.UserDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate-DBCP"/>
    </bean>

	//我这里同时配置了DBCP、C3P0数据库连接池只是方便演示,配置一个即可

    <!-- 声明C3P0数据库连接池的数据源 -->
    <bean id="dataSource-C3P0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring_project_02"/>
        <!-- mysql数据库账号,自行修改 -->
        <property name="user" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <!-- 声明使用C3P0数据库连接池数据源的jdbcTemplate -->
    <bean id="jdbcTemplate-C3P0" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource-C3P0"/>
    </bean>
    <!-- 申明使用jdbcTemplate-C3P0的userDao -->
    <bean id="userDao-C3P0" class="cn.hestyle.dao.impl.UserDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate-C3P0"/>
    </bean>
</beans>
③、编写测试类

Test02测试类

package cn.hestyle.test;

import cn.hestyle.dao.UserDao;
import cn.hestyle.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @program: Spring Project 02->Test02
 * @description: 测试C3P0、DBCP数据库连接池数据源
 * @author: hestyle
 * @create: 2019-12-02 18:20
 **/
public class Test02 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans-1.xml");
        //1、测试userDao_DBCP
        UserDao userDao_DBCP = (UserDao) context.getBean("userDao-DBCP");
        System.out.println("插入前t_user表-------------");
        for (User user1 : userDao_DBCP.getUsers()) {
            System.out.println(user1);
        }
        User user2 = new User();
        user2.setUsername("hestyle-02");
        user2.setPassword("123456");
        userDao_DBCP.add(user2);
        System.out.println("插入后t_user表-------------");
        for (User user3 : userDao_DBCP.getUsers()) {
            System.out.println(user3);
        }
        User user4 = userDao_DBCP.getUserById(4);
        user4.setPassword("123456-修改");
        userDao_DBCP.update(user4);
        System.out.println("修改后t_user表-------------");
        for (User user5 : userDao_DBCP.getUsers()) {
            System.out.println(user5);
        }
        userDao_DBCP.deleteById(user4.getId());
        //2、测试userDao_C3P0
        UserDao userDao_C3P0 = (UserDao) context.getBean("userDao-C3P0");

        System.out.println("插入前t_user表-------------");
        for (User user6 : userDao_C3P0.getUsers()) {
            System.out.println(user6);
        }

        User user7 = new User();
        user7.setUsername("hestyle-03");
        user7.setPassword("123456");
        userDao_C3P0.add(user7);

        System.out.println("插入后t_user表-------------");
        for (User user8 : userDao_C3P0.getUsers()) {
            System.out.println(user8);
        }

        User user9 = userDao_C3P0.getUserById(5);
        user9.setPassword("123456-修改");
        userDao_C3P0.update(user9);
        System.out.println("修改后t_user表-------------");
        for (User user10 : userDao_C3P0.getUsers()) {
            System.out.println(user10);
        }

        userDao_C3P0.deleteById(user9.getId());
        System.out.println("删除后t_user表-------------");
        for (User user11 : userDao_C3P0.getUsers()) {
            System.out.println(user11);
        }
    }
}

控制台输出:
在这里插入图片描述

4、配置properties

3、配置DBCP、C3P0数据库连接池中,我们把MySQL配置在xml文件中,不方便修改,常见的做法是把与数据库相关的配置信息(驱动名、用户名、密码)这些放到properties文件中。
在这里插入图片描述

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/spring_project_02
#mysql数据库账号,自行修改
username=root
password=123456

再修改beans-1.xml文件,从dp.properties文件中读取MySQL连接信息。
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <!-- dp.properties位置信息配置 -->
    <context:property-placeholder location="classpath*:dp.properties"/>

    <!-- 声明DBCP数据库连接池的数据源 -->
    <bean id="dataSource-DBCP" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${driverClassName}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>

    <!-- 声明使用DBCP数据库连接池数据源的jdbcTemplate -->
    <bean id="jdbcTemplate-DBCP" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource-DBCP"/>
    </bean>
    <!-- 申明使用jdbcTemplate-DBCP的userDao -->
    <bean id="userDao-DBCP" class="cn.hestyle.dao.impl.UserDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate-DBCP"/>
    </bean>

    <!-- 声明C3P0数据库连接池的数据源 -->
    <bean id="dataSource-C3P0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${driverClassName}"/>
        <property name="jdbcUrl" value="${url}"/>
        <property name="user" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>

    <!-- 声明使用C3P0数据库连接池数据源的jdbcTemplate -->
    <bean id="jdbcTemplate-C3P0" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource-C3P0"/>
    </bean>
    <!-- 申明使用jdbcTemplate-C3P0的userDao -->
    <bean id="userDao-C3P0" class="cn.hestyle.dao.impl.UserDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate-C3P0"/>
    </bean>
</beans>

Test03测试类:

package cn.hestyle.test;

import cn.hestyle.dao.UserDao;
import cn.hestyle.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @program: Spring Project 02->Test02
 * @description: 测试C3P0、DBCP数据库连接池数据源
 * @author: hestyle
 * @create: 2019-12-02 18:20
 **/
public class Test03 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans-1.xml");
        //获取所有user
        UserDao userDao_DBCP = (UserDao) context.getBean("userDao-DBCP");
        for (User user1 : userDao_DBCP.getUsers()) {
            System.out.println(user1);
        }
        UserDao userDao_C3P0 = (UserDao) context.getBean("userDao-C3P0");
        for (User user2 : userDao_C3P0.getUsers()) {
            System.out.println(user2);
        }
    }
}

以上就是Spring框架之JDBCTemplate主要内容,主要掌握xml中的配置过程。

发布了1039 篇原创文章 · 获赞 343 · 访问量 27万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览