第一、JDBC概念

JDBC(JAVA DataBase Connection)即JAVA数据库连接技术;JDBC API是一个Java API,可访问任何类型表列数据,特别是存储在关系数据库中的数据。 
JDBC库中所包含的API通常连接数据库的操作大致一下四步:

① 连接到数据库;

② 编写或生成SQL语句;

③ 在数据库中执行SQL查询;

④ 新增、修改、查看、删除数据库中的数据记录。

第二、数据库驱动与常用接口

JDBC API使用数据库驱动连接并操作数据库,就是数据库厂商的JDBC接口的实现,即对Connection等接口的实现类的jar包。 
本文使用MySql数据库作为案例,所以要使用MySql提供的数据库驱动包mysql-connector-java-5.1.40-bin.jar。 
驱动包一般会提供很多操作数据库的接口,常用的有一下四个:

1)Driver接口:加载驱动类,在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法,MySql驱动装载方法为:Class.forName(“com.mysql.jdbc.Driver”);

 

2)Connection接口:Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password) // 该方法可获取相应的数据库连接。

MySql数据库连接获取方法为:

Connection conn = DriverManager.getConnection(“jdbc:mysql://host:port/database”, “user”, “password”)。

该接口包含了几个常用的方法: 
1、createStatement():创建向数据库发送sql语句的statement对象; 常用语查询数据。
2、prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象; 常用语新增,修改,删除操作。
3、setAutoCommit(boolean):设置数据库事务是否自动提交; 
4、commit():提交事务; 
5、rollback():事务回滚。

 

3)Statement接口:用于执行静态SQL语句并返回它所生成结果的对象。一般有三种Statement对象: 
1、Statement:由createStatement创建,用于发送简单的SQL语句(不带参数); 
2、PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement; 
3、CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。 
以下是几个常用的Statement方法: 
1、execute(String sql):运行语句,返回是否有结果集; 
2、executeQuery(String sql):运行select语句,返回ResultSet结果集; 
3、executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数; 
4、addBatch(String sql) :把多条sql语句放到一个批处理中; 
5、executeBatch():向数据库发送一批sql语句执行。

 

4)ResultSet接口:ResultSet提供检索不同类型字段的方法,常用的有: 
1、getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象; 
2、getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象; 
3、getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据; 
4、getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据; 
5、getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。 
相比于以上方法,ResultSet接口提供了更常用的对于结果集的处理方法: 
1、next():移动到下一行; 
2、Previous():移动到前一行; 
3、absolute(int row):移动到指定行; 
4、beforeFirst():移动resultSet的最前面; 
5、afterLast() :移动到resultSet的最后面。

第三、JDBC使用步骤

1、JDBC标准流程为:

加载JDBC驱动程序→建立数据库连接Connection→创建执行SQL的语句Statement→处理执行结果ResultSet→释放资源

2、释放资源顺序为:

ResultSetStatementConnection

第四、代码示例 

1、JDBC 基层类

package com.example.jdbc;

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

/**
 * Created by Liuxd on 2018/8/19.
 */
public class MyJdbc {
    private final static String driver = "com.mysql.jdbc.Driver";
    private final static String url = "jdbc:mysql://127.0.0.1:3306/foo?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8&useSSL=false";
    private final static String user = "root";
    private final static String password = "root";

    //  声明 Connection 对象
    private Connection connection = null;
    //  声明 Statement 对象
    private Statement statement = null;

    public Connection getConnection() {
        try {
//          加载驱动
            Class.forName(driver);
//          创建连接
            connection = DriverManager.getConnection(url, user, password);

        } catch (Exception e) {
            e.printStackTrace();

            if (null != connection) {
                try {
                    connection.close();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }

        }

        return connection;
    }

    /**
     * 关闭连接
     */
    public void closeConnection() {
        if (null == connection) {
            return;
        }

        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    /**
     * 创建 Statement 对象
     *
     * @param connection
     * @return
     */
    public Statement getStatement(Connection connection) {
        if (null == connection) {
            return null;
        }

        try {
            statement = connection.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return statement;
    }

     /**
     * 关闭Statement 对象
     */
    public void closerStatement() {
        if (null == statement) {
            return;
        }
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


}

2、Dao类

package com.example.jdbc;

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

/**
 * Created by Liuxd on 2018/8/19.
 */
public class UserDao {

    public List<Object[]> query() {

        MyJdbc myJdbc = new MyJdbc();
        Connection connection = myJdbc.getConnection();
        if (null == connection) {
            System.out.println("获取数据库连接异常");
            return null;

        }

        Statement statement = myJdbc.getStatement(connection);
        if (null == statement) {
            System.out.println("创建事务失败");
            myJdbc.closeConnection();
            return null;
        }

        List<Object[]> list = new ArrayList<Object[]>();
        ResultSet resultSet = null;
        try {

            String sql = "select t.* from user t";

            resultSet = statement.executeQuery(sql);

            while (resultSet.next()) {
                Long id = resultSet.getLong("uid");
                String name = resultSet.getString("name");
                Integer age = resultSet.getInt("age");
                String phone = resultSet.getString("phone");
                String passwd = resultSet.getString("passwd");

                Object[] objects = new Object[]{id, name, age, phone, passwd};

                list.add(objects);
            }


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(null != resultSet) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            myJdbc.closerStatement();
            myJdbc.closeConnection();
        }

        return list;
    }

    public void update(long id, String name, int age, String phone, String passwd) {
        MyJdbc myJdbc = new MyJdbc();
        Connection connection = myJdbc.getConnection();
        if (null == connection) {
            System.out.println("修改操作获取数据库连接异常");
            return;

        }


        PreparedStatement preparedStatement = null;

        String sql = "UPDATE USER t SET t.name=? ,t.age=?,t.phone=?,t.passwd=? WHERE t.uid=?";

        try {
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, name);
            preparedStatement.setInt(2, age);
            preparedStatement.setString(3, phone);
            preparedStatement.setString(4, passwd);
            preparedStatement.setLong(5, id);
//          执行sql
            preparedStatement.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            myJdbc.closeConnection();

        }
    }

    public void delete(int id) {
        MyJdbc myJdbc = new MyJdbc();
        Connection connection = myJdbc.getConnection();
        if (null == connection) {
            System.out.println("删操作获取数据库连接异常");
            return;

        }


        PreparedStatement preparedStatement = null;

        String sql = "DELETE FROM USER WHERE uid=?";

        try {
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, id);

            preparedStatement.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            myJdbc.closeConnection();

        }
    }

    public void add(String name, int age, String phone, String passwd) {
        MyJdbc myJdbc = new MyJdbc();
        Connection connection = myJdbc.getConnection();
        if (null == connection) {
            System.out.println("新增操作获取数据库连接异常");
            return;

        }


        PreparedStatement preparedStatement = null;

        String sql = "insert into `user` (`name`, `age`, `phone`, `passwd`) values(?,?,?,?)";

        try {
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, name);
            preparedStatement.setInt(2, age);
            preparedStatement.setString(3, phone);
            preparedStatement.setString(4, passwd);

            preparedStatement.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            myJdbc.closeConnection();

        }
    }
}

3、业务类

package com.example.jdbc;

import java.util.List;

/**
 * Created by Liuxd on 2018/8/19.
 */
public class Userservice {

    private UserDao userDao = new UserDao();

    public List<Object[]> query() {
        List<Object[]> list = userDao.query();
        return list;

    }

    public void add(String name, int age, String phone, String passwd) {
        userDao.add(name, age, phone, passwd);
    }

    public void update(long id, String name, int age, String phone, String passwd) {
        userDao.update(id, name, age, phone, passwd);
    }

    public void delete(int id) {
        userDao.delete(id);
    }


}

4、测试类

package com.example.jdbc;

import java.util.List;

/**
 * Created by Liuxd on 2018/8/19.
 */
public class Test {


    public static void main(String[] args) {
        Userservice userservice = new Userservice();

        List<Object[]> list = userservice.query();
        if (null != list && list.size() > 0) {
            for (Object[] objects : list) {
                for (int i = 0; i < objects.length; i++) {
                    System.out.print(objects[i] + "    ");
                }
                System.out.println();
            }
        }

        String name = "菲菲";
        int age = 6;
        String phone = "13800138000";
        String passwd = "abc123";

        userservice.add(name, age, phone, passwd);
        userservice.update(1, "张伦", 12, "13800138001", "admin");

        userservice.delete(2);


    }


}

5、sql脚本

create table `user` (
	`uid` bigint (20),
	`name` varchar (75),
	`age` int (3),
	`phone` varchar (360),
	`passwd` varchar (36)
); 
insert into `user` (`uid`, `name`, `age`, `phone`, `passwd`) values('1','张伦','12','13800138001','admin');
insert into `user` (`uid`, `name`, `age`, `phone`, `passwd`) values('2','张明','89','1233213123','admin');
insert into `user` (`uid`, `name`, `age`, `phone`, `passwd`) values('4','李威','12','23','admin');
insert into `user` (`uid`, `name`, `age`, `phone`, `passwd`) values('5','莉莉','18','13800138000','abc123');
insert into `user` (`uid`, `name`, `age`, `phone`, `passwd`) values('6','小宝','18','13800138000','abc123');
insert into `user` (`uid`, `name`, `age`, `phone`, `passwd`) values('7','李金刚','18','13800138000','abc123');
insert into `user` (`uid`, `name`, `age`, `phone`, `passwd`) values('8','李金刚','18','13800138000','abc123');
insert into `user` (`uid`, `name`, `age`, `phone`, `passwd`) values('9','菲菲','6','13800138000','abc123');

声明:

1、文章概描述信息,参考

2、代码编写尽量面向对象封装

3、代码简略分层

4、错误和不到之处,希望大家指正