第一章
知识点:
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!!!!当然,开始学习的时候都是很难的,需要花很多时间精力去沉淀自己才能快速提升。
谨记:程序员,不要忘了自己也曾茫然不知所措的样子,永远学徒的心。