JDBC


第一章 JDBC简介


1.1概念

  • 概念:Java DataBase Connectivity Java 数据库连接 Java语言操作数据库
  • JDBC本质:其实是官方(SUN公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

1.2步骤

1.导入驱动jar包

  • 复制jar包到项目的libs目录下
  • 右键–>Add As Library

2.注册驱动

3.获取数据库连接对象Connection

4.定义sql

5.获取执行sql语句的对象 Statement

6.执行sql,接受返回结果

7.处理结果

8.释放资源


1.3代码实现

package com.priv.demo01JDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class Demo01JDBC {
    public static void main(String[] args) throws Exception {
        //1.导入驱动jar包
        // 2.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //3.获取数据库连接对象Connection
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/students", "root", "填自己的数据库密码");
        //4.定义sql
        String sql="update account set balance=500 where username='张无忌'";
        //5.获取执行sql语句的对象 Statement
        Statement statement = connection.createStatement();
        //6.执行sql,接受返回结果
        int i = statement.executeUpdate(sql);
        //7.处理结果
        System.out.println(i);
        //8.释放资源
        statement.close();
        connection.close();
    }
}

结果

20211001181141


第二章 详解各个对象


2.1DriverManager

驱动管理对象

1.功能

  • 注册驱动:告诉程序该使用哪一个数据库驱动jar

** static void registerDriver(Driver driver):**注册与给定的驱动程序 DriverManager

写代码使用:class.forName( “com.mysql.jdbc.Driver” );

通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块

static {
     try {
        java.sql.DriverManager.registerDriver(new Driver());
     } catch (sQLException E) {
throw new RuntimeException( "can't register driver!");
     }
}

tips:mysql5之后的驱动jar包可以忽略注册驱动的步骤。

  • 获取数据库连接

方法:

static Connection getConnection(String url,String user,String password);

参数:

1.url:指定连接的路径

  • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
  • 例子:jdbc:mysql://localhost:3306/students
  • 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称

2.user:用户名

3.password:密码


2.2Connection

数据库连接对象

一.功能

1.获取执行sql的对象

  • ** Statement createStatement()**
  • ** PreparedStatement prepareStatement(String sql)**

2.管理事务

  • 开启事务:** setAutoCommit(boolean autoCommit)**:调用该方法设置参数为false,即开启事务
  • 提交事务:** commit()**
  • 回滚事务:** rollback()**

2.3Statement

执行sql的对象

1.执行sql

  • ** boolean execute(String sql)**:可以执行任意的sql(了解)
  • ** int executeUpdate(String sql)**:执行DML(insert、update、delete)语句、DDL(create、alter、drop)语句

返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。

  • ** ResultSet executeQuery(String sql)**:执行DQL(select)语句

2.4ResultSet

结果集对象

ResultSet:结果集对象,封装查询结果

  • next():游标向下移动一行
  • getXXX(参数):获取数据

Xxx:代表数据类型 如:int getInt() String getString()

  • 参数:

1.int:代表列的编号,从1开始 如:getString(1)

2.String:代表列名称。 如:getDouble(“balance”)

  • ** boolean next()**:游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true

  • 注意:

1.游标向下移动一行

2.判断是否有数据

3.获取数据

package com.priv.demo01JDBC;

import java.sql.*;
/**
 * 执行DQL语言
 */

public class Demo05JDBC {
    public static void main(String[] args) {
        Connection connection=null;
        Statement statement=null;
        ResultSet resultSet=null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String sql="SELECT * FROM account";
            connection = DriverManager.getConnection("jdbc:mysql:///students", "root", "填自己的数据库密码");
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            while(resultSet.next()){
                int anInt = resultSet.getInt(1);
                String username = resultSet.getString("username");
                double aDouble = resultSet.getDouble(3);
                System.out.println(anInt+"---"+username+"---"+aDouble);
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

    }
}

2.5PreparedStatement

执行sql的对象

1.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题

  • 输入用户随便,输入密码:a’ or ‘a’=’a
  • sql:SELECT * FROM USER WHERE username=’fhjjhishaid’and password=’a’ or ‘a’=’a’

2.解决sql注入问题:使用PreparedStatement对象来解决

package com.priv.demo01JDBC;

import com.priv.demo03util.Demo01JDBCUtils;

import java.sql.*;
import java.util.Scanner;

public class Demo09JDBC {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = scanner.nextLine();
        System.out.println("请输入密码:");
        String password = scanner.nextLine();
        boolean login = new Demo08JDBC().login(username, password);
        if(login){
            System.out.println("登录成功!");
        }else{
            System.out.println("******用户名或密码错误!******");
        }
    }

    public boolean login(String username,String password){
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        if(username==null||password==null){
            return false;
        }
        try {
            connection = Demo01JDBCUtils.getConnection();
            String sql="SELECT * FROM USER  WHERE username= ? and password= ? ";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,username);
            preparedStatement.setString(2,password);
            resultSet = preparedStatement.executeQuery();
            return resultSet.next();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            Demo01JDBCUtils.close(resultSet,preparedStatement,connection);
        }
        return false;
    }
}

tips:后期都会使用preparedStatement来完成增删改查的所有操作

  • 可以防止SQL注入
  • 效率更高

第三章 JDBC练习


3.1insert语句


package com.priv.demo01JDBC;

import java.sql.*;
/**
 * account表 添加一条记录 insert语句
 */
public class Demo02JDBC {
    public static void main(String[] args) {
        Connection connection =null;
        Statement  statement =null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String sql="insert into account values(NULL,'张三',1800)";
            connection = DriverManager.getConnection("jdbc:mysql:///students", "root", "填自己的数据库密码");
            statement = connection.createStatement();
            int count = statement.executeUpdate(sql);
            System.out.println(count);
            if(count>0){
                System.out.println("添加成功!");
            }else{
                System.out.println("添加失败!");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            //避免空指针异常
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}

3.2update语句


package com.priv.demo01JDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * account表 修改一条记录 update语句
 */
public class Demo03JDBC {
    public static void main(String[] args) {
        Connection connection =null;
        Statement statement=null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String sql="update account set balance=500 where username='张三'";
            connection = DriverManager.getConnection("jdbc:mysql:///students", "root", "填自己的数据库密码");
            statement = connection.createStatement();
            int i = statement.executeUpdate(sql);
            System.out.println(i);
            if(i>0){
                System.out.println("修改成功!");
            }else {
                System.out.println("修改失败!");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}

3.3delete语句


package com.priv.demo01JDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * account表 删除一条记录 delete语句
 */
public class Demo04JDBC {
    public static void main(String[] args) {
        Connection connection=null;
        Statement statement=null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String sql="DELETE FROM ACCOUNT WHERE USERNAME='张三'";
            connection = DriverManager.getConnection("jdbc:mysql:///students", "root", "填自己的数据库密码");
            statement = connection.createStatement();
            int count = statement.executeUpdate(sql);
            System.out.println(count);
            if(count>0){
                System.out.println("删除成功");
            }else{
                System.out.println("删除失败");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

    }
}

tips:返回的count值是受影响的行数


3.4select语句

package com.priv.demo02JDBC;

import java.util.Date;

public class employees {
    private int employee_id;
    private String first_name;
    private String last_name;
    private String email;
    private String phone_number;
    private String job_id;
    private double salary;
    private double commission_pct;
    private int manager_id;
    private int department_id;
    private Date hiredate;

    public employees() {

    }

    public int getEmployee_id() {
        return employee_id;
    }

    public void setEmployee_id(int employee_id) {
        this.employee_id = employee_id;
    }

    public String getFirst_name() {
        return first_name;
    }

    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }

    public String getLast_name() {
        return last_name;
    }

    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone_number() {
        return phone_number;
    }

    public void setPhone_number(String phone_number) {
        this.phone_number = phone_number;
    }

    public String getJob_id() {
        return job_id;
    }

    public void setJob_id(String job_id) {
        this.job_id = job_id;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public double getCommission_pct() {
        return commission_pct;
    }

    public void setCommission_pct(double commission_pct) {
        this.commission_pct = commission_pct;
    }

    public int getManager_id() {
        return manager_id;
    }

    public void setManager_id(int manager_id) {
        this.manager_id = manager_id;
    }

    public int getDepartment_id() {
        return department_id;
    }

    public void setDepartment_id(int department_id) {
        this.department_id = department_id;
    }

    public Date getHiredate() {
        return hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    @Override
    public String toString() {
        return "Demo01List{" +
                "employee_id=" + employee_id +
                ", first_name='" + first_name + '\'' +
                ", last_name='" + last_name + '\'' +
                ", emile='" + email + '\'' +
                ", phone_number='" + phone_number + '\'' +
                ", job_id='" + job_id + '\'' +
                ", salary=" + salary +
                ", commission_pct=" + commission_pct +
                ", manager_id=" + manager_id +
                ", department_id=" + department_id +
                ", hiredate='" + hiredate + '\'' +
                '}';
    }

    public employees(int employee_id, String first_name, String last_name, String emile, String phone_number, String job_id, float salary, float commission_pct, int manager_id, int department_id, Date hiredate) {
        this.employee_id = employee_id;
        this.first_name = first_name;
        this.last_name = last_name;
        this.email = email;
        this.phone_number = phone_number;
        this.job_id = job_id;
        this.salary = salary;
        this.commission_pct = commission_pct;
        this.manager_id = manager_id;
        this.department_id = department_id;
        this.hiredate = hiredate;
    }
}
package com.priv.demo01JDBC;

import com.priv.demo02JDBC.employees;

import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

public class Demo06JDBC {
    public static void main(String[] args) {
        List<employees> all = new Demo06JDBC().findAll();
        Iterator<employees> iterator=all.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
    /**
     *查询所有employees对象
     * @return
     */
    public List<employees> findAll(){
        Connection connection=null;
        Statement statement=null;
        ResultSet resultSet=null;
        List<employees> list=null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String sql="SELECT * FROM EMPLOYEES";
            connection = DriverManager.getConnection("jdbc:mysql:///myemployees", "root", "填自己的数据库密码");
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            employees employees=null;
            list=new ArrayList<>();

            while (resultSet.next()){
                int employee_id = resultSet.getInt(1);
                String first_name = resultSet.getString("first_name");
                String last_name = resultSet.getString("last_name");
                String email = resultSet.getString("email");
                String phone_number = resultSet.getString("phone_number");
                String job_id = resultSet.getString("job_id");
                double salary = resultSet.getDouble(7);
                double commission_pct = resultSet.getDouble(8);
                int manager_id = resultSet.getInt(9);
                int department_id = resultSet.getInt(10);
                Date hiredate = resultSet.getDate("hiredate");
                employees=new employees();
                employees.setEmployee_id(employee_id);
                employees.setFirst_name(first_name);
                employees.setLast_name(last_name);
                employees.setEmail(email);
                employees.setPhone_number(phone_number);
                employees.setJob_id(job_id);
                employees.setSalary(salary);
                employees.setCommission_pct(commission_pct);
                employees.setManager_id(manager_id);
                employees.setDepartment_id(department_id);
                employees.setHiredate(hiredate);
                list.add(employees);

            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return list;
    }
}

第四章 JDBC工具类


4.1工具类实现

url=jdbc:mysql:///students
user=root
password=填自己的数据库密码
driver=com.mysql.cj.jdbc.Driver
package com.priv.demo03util;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

public class Demo01JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    static{
        try {
            Properties properties = new Properties();
            ClassLoader classLoader = Demo01JDBCUtils.class.getClassLoader();
            URL resource = classLoader.getResource("jdbc.properties");
            String path = resource.getPath();
            properties.load(new FileReader(path));
            url=properties.getProperty("url");
            user=properties.getProperty("user");
            password=properties.getProperty("password");
            driver=properties.getProperty("driver");
            Class.forName(driver);
        } catch (ClassNotFoundException | FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     *获取连接
     * @return 连接对象
     */

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    /**
     * 释放资源
     * @param statement
     * @param connection
     */
    public static void close(Statement statement,Connection connection){
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

    public static void close(ResultSet resultSet,Statement statement, Connection connection){
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

}
package com.priv.demo01JDBC;

import com.priv.demo02JDBC.employees;
import com.priv.demo03util.Demo01JDBCUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

public class Demo07JDBC {
    public static void main(String[] args) {
        List<employees> all = new Demo06JDBC().findAll();
        Iterator<employees> iterator=all.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
    /**
     *演示JDBC工具类
     * @return
     */
    public List<employees> findAll(){
        Connection connection=null;
        Statement statement=null;
        ResultSet resultSet=null;
        List<employees> list=null;
        try {
            Connection connection1 = Demo01JDBCUtils.getConnection();
            String sql="SELECT * FROM EMPLOYEES";
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            employees employees=null;
            list=new ArrayList<>();

            while (resultSet.next()){
                int employee_id = resultSet.getInt(1);
                String first_name = resultSet.getString("first_name");
                String last_name = resultSet.getString("last_name");
                String email = resultSet.getString("email");
                String phone_number = resultSet.getString("phone_number");
                String job_id = resultSet.getString("job_id");
                double salary = resultSet.getDouble(7);
                double commission_pct = resultSet.getDouble(8);
                int manager_id = resultSet.getInt(9);
                int department_id = resultSet.getInt(10);
                Date hiredate = resultSet.getDate("hiredate");
                employees=new employees();
                employees.setEmployee_id(employee_id);
                employees.setFirst_name(first_name);
                employees.setLast_name(last_name);
                employees.setEmail(email);
                employees.setPhone_number(phone_number);
                employees.setJob_id(job_id);
                employees.setSalary(salary);
                employees.setCommission_pct(commission_pct);
                employees.setManager_id(manager_id);
                employees.setDepartment_id(department_id);
                employees.setHiredate(hiredate);
                list.add(employees);

            }
        }catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        Demo01JDBCUtils.close(resultSet,statement,connection);
        return list;
    }
}

4.2登录案例

package com.priv.demo01JDBC;

import com.priv.demo03util.Demo01JDBCUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class Demo08JDBC {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = scanner.nextLine();
        System.out.println("请输入密码:");
        String password = scanner.nextLine();
        boolean login = new Demo08JDBC().login(username, password);
        if(login){
            System.out.println("登录成功!");
        }else{
            System.out.println("******用户名或密码错误!******");
        }
    }

    public boolean login(String username,String password){
        Connection connection=null;
        Statement statement=null;
        ResultSet resultSet=null;
        if(username==null||password==null){
            return false;
        }
        try {
            connection = Demo01JDBCUtils.getConnection();
            String sql="SELECT * FROM USER  WHERE username='"+username+"'and password='"+password+"'";
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            return resultSet.next();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            Demo01JDBCUtils.close(resultSet,statement,connection);
        }
        return false;
    }
}

第五章 JDBC控制事务


5.1概述


1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。

2.操作:

  • 开启事务
  • 提交事务
  • 回滚事务

3.使用Connection对象来管理事务

  • 开启事务:** setAutoCommit(boolean autoCommit)**:调用该方法设置参数为false,即开启事务

    在执行sql之前开启事务

  • 提交事务:** commit()**

    当所有sql都执行完提交事务

  • 回滚事务:** rollback()**

    在catch中回滚事务


5.2实现案例


package com.priv.demo01JDBC;

import com.priv.demo03util.Demo01JDBCUtils;

import java.sql.*;

/**
 *事务操作:转账
 */
public class Demo10JDBC {
    public static void main(String[] args) {
        Connection connection=null;
        PreparedStatement preparedStatement1=null;
        PreparedStatement preparedStatement2=null;
        ResultSet resultSet=null;
        try {
            connection = Demo01JDBCUtils.getConnection();
            //开启事务
            connection.setAutoCommit(false);
            String sql1="update account set balance=balance-? where id=?";
            String sql2="update account set balance=balance+? where id=?";
            preparedStatement1 = connection.prepareStatement(sql1);
            preparedStatement2 = connection.prepareStatement(sql2);
            preparedStatement1.setDouble(1,500);
            preparedStatement1.setInt(2,1);

            preparedStatement2.setDouble(1,500);
            preparedStatement2.setInt(2,2);

            preparedStatement1.executeUpdate();
            //手动制造异常
            int i=3/0;
            preparedStatement2.executeUpdate();
            //提交事务
            connection.commit();
        } catch (SQLException throwables) {
            //事务回滚
            try {
                if(connection!=null) {
                    connection.rollback();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            throwables.printStackTrace();
        }finally {
            Demo01JDBCUtils.close(preparedStatement1,connection);
            Demo01JDBCUtils.close(preparedStatement2,null);
        }

    }
}

第六章 数据库连接池


6.1概述


1.概念:其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

2.好处:

  • 节约资源
  • 用户访问高效

3.实现

1.标准接口:DataSource javax.sql包下

​ 1.方法:

​ 获取连接:getConnection()

​ 归还连接:Connection.close() 如果连接对象Connection时从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接

2.一般我们不去实现它,由数据库厂商来实现

  • C3P0:数据库连接池技术
  • Druid:数据库连接池实现技术,由阿里巴巴提供

6.2C3P0


步骤:

1.导入jar包:两个 c3p0-0.9.5.5.jar和mchange-commons-java-0.2.19.jar

2.定义配置文件:

  • 名称:c3p0.properties或者c3p0-config.xml
  • 路径:直接将文件放在src目录下即可。

3.创建核心对象 数据库连接池对象 ComboPooledDataSource

4.获取连接:getConnection

package com.priv.demo04JDBCTemplate;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * C3P0的演示
 */
public class Demo01C3P0 {
    public static void main(String[] args) throws SQLException {
        //创建数据库连接池对象
        DataSource ds = new ComboPooledDataSource();
        Connection connection = ds.getConnection();
        System.out.println(connection);
    }
}

6.3Druid


步骤:

1.导入jar包:druid-1.0.9.jar

2.定义配置文件

  • 是properties形式的
  • 可以叫任意名称,可以放在任意目录下

3.获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory

4.获取连接:getConnection

package com.priv.demo04JDBCTemplate;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class Demo02Druid {
    public static void main(String[] args) throws Exception {
        //1.导入jar包
        //2.定义配置文件
        //3.加载配置文件
        Properties properties = new Properties();
        ClassLoader classLoader = Demo02Druid.class.getClassLoader();
        InputStream resourceAsStream = classLoader.getResourceAsStream("druid.properties");
        properties.load(resourceAsStream);
        //4.获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        //5.获取连接
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
    }
}

工具类

1.定义一个类 JDBCUtils

2.提供静态代码块加载配置文件,初始化连接池对象

3.提供方法

  • 获取连接方法:通过数据库连接池获取连接
  • 释放资源
  • 获取连接池的方法
package com.priv.demo04JDBCTemplate;
/**
 * Druid工具类
 */

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
    private static DataSource dataSource;
    static {

        try {
            Properties properties=new Properties();
            properties.load(JDBCUtils.class.getResourceAsStream("druid.properties"));
            dataSource= DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *获取连接
     */
    public static Connection getConnection() throws SQLException {

        return dataSource.getConnection();
    }
    /**
     * 释放资源
     */
    public static void close(Statement statement,Connection connection){
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();//归还连接
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

    public static void close(ResultSet resultSet,Statement statement, Connection connection){
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        close(statement, connection);
    }

    /**
     * 获取连接池方法
     */
    public static DataSource getDataSource(){
        return dataSource;
    }
}

实现

package com.priv.demo04JDBCTemplate;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 使用新的工具类
 */
public class Demo03Druid {
    public static void main(String[] args) {
        Connection connection =null;
        PreparedStatement preparedStatement =null;
        try {
            connection = JDBCUtils.getConnection();
            String sql="insert into account value(null,?,?) ";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,"张飞");
            preparedStatement.setInt(2,1000);
            int count = preparedStatement.executeUpdate();
            System.out.println(count);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JDBCUtils.close(preparedStatement,connection);
        }

    }
}

第七章 Spring JDBC


7.1JDBCTemplate简介


Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发

步骤:

1.导入jar包

2.创建JDBCTemplate对象。依赖于数据源DataSource

  • ```java
    JdbcTemplate jdbcTemplate=new JdbcTemplate(ds);
    
    3.调用JDBCTemplate的方法来完成CRUD的操作
    
    * ** `update():`**执行DML语句。增、删、改语句
    * ** `queryForMap():`**查询结果将结果集封装为Map集合
    
    注意:这个方法查询的结果集长度只能是1
    
    * ** `queryForList():`**查询结果将结果集封装为List集合
    
    注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
    
    * ** `query():`**查询结果将结果集封装为JavaBean集合
    
    query的参数:RowMapper
    
    一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
    
    new BeanPropertyRowMapper<类型>(类型.class)
    
    * ** `queryForObject():`**查询结果将结果集封装为对象
    
    一般用于聚合函数的查询
    
    ```java
    package com.priv.demo04JDBCTemplate;
    
    import org.springframework.jdbc.core.JdbcTemplate;
    
    /**
     * JDBCTemplate入门
     */
    public class Demo04JDBCTemplate {
        public static void main(String[] args) {
            //导入jar包
            //创建JdbcTemplate对象
            JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
            String sql="update account set balance=5000 where id=?";
            //调用方法
            int count = jdbcTemplate.update(sql,3);
            System.out.println(count);
        }
    }

7.2JDBCTemplate执行DML语句


package com.priv.demo04JDBCTemplate;

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * 案例一:修改1号数据的balance为5000
 */
public class Demo05JDBCTemplateP {
    @Test
    public void test1() {
        JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="update account set balance=5000 where id=?";
        int update = jdbcTemplate.update(sql, 1);
        System.out.println(update);
    }
/**
 * 案例二:添加一条记录
 */
    @Test
    public void test2() {
        JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="insert into account value(null ,?,?)";
        int count = jdbcTemplate.update(sql, "郭靖", "1000");
        System.out.println(count);
    }

/**
 * 案例三:删除刚才添加的记录
 */
    @Test
    public void test3() {
        JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="delete from account where id=?";
        int count = jdbcTemplate.update(sql, "4");
        System.out.println(count);
}
}

7.3JDBCTemplate执行DQL语句


package com.priv.demo04JDBCTemplate;

import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

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

public class Demo06JDBCTemplateP2 {
    /**
     * 案例一:查询id为1的记录,将其封装为Map集合
     */
    @Test
    public void Test1(){
        JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select * from account where id=?";
        Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql, "1");
        System.out.println(stringObjectMap);
    }

    /**
     * 案例二:查询所有记录,将其封装为List集合
     */
    @Test
    public void Test2(){
        JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select * from account";
        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
        for(Map<String, Object> stringObjectMap:maps){
            System.out.println(stringObjectMap);
        }
    }

    /**
     *案例三:查询所有记录,将其封装为account对象的List集合
     */
    @Test
    public void Test3(){
        JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select * from account";
        List<account> list=jdbcTemplate.query(sql, new RowMapper<account>() {
            @Override
            public account mapRow(ResultSet resultSet, int i) throws SQLException {
                account account=new account();
                int id = account.getId("id");
                String username = account.getUsername();
                int balance = account.getBalance();

                account.setId(id);
                account.setUsername(username);
                account.setBalance(balance);
                return null;
            }
        });
        for(account account:list){
            System.out.println(account);
        }
    }

    @Test
    public void Test4(){
        JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select * from account";
        List<account> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<account>(account.class));
        for(account account:query){
            System.out.println(account);
        }
    }

    /**
     *案例四:查询总记录数
     */
    @Test
    public void Test5(){
        JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select count(id) from account";
        Long aLong = jdbcTemplate.queryForObject(sql, long.class);
        System.out.println(aLong);
    }
}