第一章
知识点:
1.JDBC API 能够实现Java程序连接关系型数据库,如MySQL,PostgreSQL,MS SQL Server,Oracle,H2 Database。
2.JDBC是数据库独立的,并非SQL独立。意味着不同的关系型数据库都使用JDBC来连接数据库,而不同的数据库下SQL会有区别。
3.JDBC不适用于Non-Relational 数据库。如Mongo DB,Cassandra,Dynamo,使用这些数据库需要使用该数据库自身提供的驱动driver。

EXAMPLE:

public class JDBCExample1 {

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
//        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://数据库ip地址:端口号/数据库名";
        String userName = "root";
        String password = "密码_";

        Connection connection = DriverManager.getConnection(url, userName, password);

        System.out.println("Current connetion is: "+connection);
        Statement statement = connection.createStatement();
        String sql = "select * from table1";
        ResultSet resultSet = statement.executeQuery(sql);

        while (resultSet.next()){
            int id = resultSet.getInt("table_id");
            System.out.println("id :"+id);
        }
    }
}

可以看到,新版的JDBC连接Mysql已经不需要使用Class.forName来加载驱动了,只需要正确的导入jar包即可。

第二章
JDBC核心组件:JDBC Driver,Connections,Statements,ResultSets。

JDBC基本使用:

A.查询数据库
B.查询源数据库信息(查询数据库关于自身的信息,表定义,每个表中的列,数据类型)
C.更新数据库
D.执行事务(执行处理)。

JDBC 驱动类型:
Type 1: JDBC-ODBC bridge JDBC driver
Type 2: Java + Native code JDBC driver
Type 3: All Java + Middleware translation JDBC driver
Type 4: All Java JDBC driver.

原文链接:http://tutorials.jenkov.com/jdbc/driver-types.html

通过properties来连接数据库:

可以看到,在getConnection方法中可以通过Properties来获取连接。

Connection connection = DriverManager.getConnection(url,properties);

控制自动提交:

connection.setAutoCommit(false);
        try {
            System.out.println("Current connetion is: " + connection);
            Statement statement = connection.createStatement();
            String sql = "select * from table1";
            String insertSql = "insert into table1(table_id) values (50002)";
//            ResultSet resultSet = statement.executeQuery(sql);
            boolean execute = statement.execute(insertSql);
//            while (resultSet.next()) {
//                int id = resultSet.getInt("table_id");
//                System.out.println("id :" + id);
//            }

            System.out.println("Is execute success:"+execute);
            connection.commit();

Connection.setAutoCommit(false)通过这种方式来控制提交。


DatabaseMetaData metaData = connection.getMetaData();
ResultSet catalogs = metaData.getCatalogs();
String driverVersion = metaData.getDriverVersion();
System.out.println("Current driverVersion is:"+driverVersion);

通过MetaData可以获取数据库本身的相关信息。

查询语句:

Statement statement = connection.createStatement();
String sql = "select * from table1";

ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
    int table_id = resultSet.getInt("table_id");
    String table_name = resultSet.getString("table_name");
    BigDecimal table_fee = resultSet.getBigDecimal("table_fee");

    System.out.println("table_id="+table_id);
    System.out.println("table_name="+table_name);
    System.out.println("table_fee="+table_fee);
}

编写查询SQL语句,指定类型来获取相应的值。
更新语句:

String sql = "update table1 set table_name = 'wangwangwang' where table_id =50 " ;
int i = statement.executeUpdate(sql);
System.out.println("i="+i);

String deleteSQL = "delete from table1 where table_id = 5000";
int i1 = statement.executeUpdate(deleteSQL);
System.out.println("i1="+i1);

Statement AND PreparedStatement
PreparedStatement可以重新使用SQL传入不同的参数,而一个Statement必须是哪一个完成的SQL语句。

第三章
ResultSet
ResultSet是查询语句的所有Records。每个Record包含查询的所有Columns。在上述例子中,查询Records如图所示:

ResultSet的类型。

在创建statement的时候可以指定类型,第一个参数resultSetType可以有三种类型
1.ResultSet.TYPE_FORWARD_ONLY
2.ResultSet.TYPE_SCROLL_INSENSITIVE
3.ResultSet.TYPE_SCROLL_SENSITIVE
第一种只可以顺序查看查询结果,第二种可以向前也可以向后查看查询结果。
第二种在其他statement改变数据库的时候不影响查询结果,第三种会影响查询结果。
第二个参数resultSetConcurrency有两种类型。
ResultSet.CONCUR_READ_ONLY
ResultSet.CONCUR_UPDATABLE
第一种表示该statement只可以对数据库进行读取操作,第二种表示
既可以读又可以写。

第三个参数resultSetHoldability有两种类型
ResultSet.CLOSE_CURSORS_OVER_COMMIT
ResultSet.HOLD_CURSORS_OVER_COMMIT

两者的区别是在关闭statement的时候是否要进行提交。

第四章

批量操作:

String sql1 = "insert into table1(table_id) values (502)";
String sql2 = "insert into table1(table_id) values (506)";
String sql3 = "insert into table1(table_id) values (545)";
statement.addBatch(sql1);
statement.addBatch(sql2);
statement.addBatch(sql3);
int[] ints = statement.executeBatch();
System.out.println("ints="+ints);

代码所示,so easy就不再赘述。
使用PreparedStatement进行批操作基本相同。

使用批操作应该注意批操作中的sql对于数据库本身也是单独执行的,所有这些语句中可能会有成功可能会有失败,当需要全部都成功时一定要用事务来进行控制。

事务

connection.setAutoCommit(false);
try {
    String sql3 = "insert into table1(table_id) values (5456)";
    Statement statement1 = connection.createStatement();
    boolean execute = statement1.execute(sql3);
    connection.commit();
    throw new Exception("发生异常");
}catch (Exception e){
    e.printStackTrace();
    connection.rollback();
}

怎么样,是不是so easy,设置自动提交方式为false,发生异常进行回滚。需要更深入了研究请更深入的研究数据库的运行机制。

使用CallableStatement

CallableStatement callableStatement =
        connection.prepareCall("call insertV(?, ?, ?)",
                ResultSet.TYPE_FORWARD_ONLY,
                ResultSet.CONCUR_READ_ONLY,
                ResultSet.CLOSE_CURSORS_AT_COMMIT);

callableStatement.setInt(1, 5684);
callableStatement.setString   (2,"liubh" );
callableStatement.setBigDecimal   (3, new BigDecimal(0.23));
callableStatement.addBatch();
int[] ints = callableStatement.executeBatch();
for (int i: ints){
    System.out.println("i="+i);
}

该方法可以调用数据库的存储过程进行操作。上述例子中使用insertV这样一个方法,在执行的时候需要先定义一个insertV这样一个存储过程。

基本的JDBC的知识就这么多,花上一两个小时就能完全搞定,just so
Easy!!!!当然,开始学习的时候都是很难的,需要花很多时间精力去沉淀自己才能快速提升。

谨记:程序员,不要忘了自己也曾茫然不知所措的样子,永远学徒的心。