20145231第九周学习笔记

20145231 《Java程序设计》第九周学习总结

教材学习内容总结

第十六章:整合数据库

JDBC简介

•JDBC全名Java DataBase Connection,是Java联机数据库的标准规范,它定义一组标准类与接口,应用程序需要联机数据库时调用这组标准API,而标准API中的接口会由数据库厂商操作,通常称为JDBC驱动程序;如图:

•JDBC标准分为两个部分:JDBC应用程序开发接口者以及JDBC驱动程序开发者接口;

•JDBC应用程序开发接口相关API主要在java.sql与javax.sql两个包中;

•更换数据库时,应用程序无需进行修改,只需要更换数据库驱动程序成果,即可对另一个数据库进行操作;

连接数据库

步骤如下

一、 注册Driver对象;

在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。


try{   
//加载MySql的驱动类   
Class.forName("com.mysql.jdbc.Driver") ;   
}catch(ClassNotFoundException e){   
System.out.println("找不到驱动程序类 ,加载驱动失败!");   
e.printStackTrace() ;   
}   

成功加载后,会将Driver类的实例注册到DriverManager类中。

提供JDBC连接的URL:


//例如:(MySql的连接URL)   
jdbc:mysql:   
//localhost:3306/test?useUnicode=true&characterEncoding=gbk ;   
useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为   
gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。 

二、 取得Connection操作对象;

要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象, 该对象就代表一个数据库的连接。

使用DriverManager的getConnectin(String url , String username ,String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和 密码来获得。


//连接MySql数据库,用户名和密码都是root   
 String url = "jdbc:mysql://localhost:3306/test" ;    
 String username = "root" ;   
 String password = "root" ;   
 try{   
Connection con =    
         DriverManager.getConnection(url , username , password ) ;   
 }catch(SQLException se){   
System.out.println("数据库连接失败!");   
se.printStackTrace() ;   
 }  

要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3种类型:

*执行静态SQL语句。通常通过Statement实例实现。 *
*执行动态SQL语句。通常通过PreparedStatement实例实现。 *
*执行数据库存储过程。通常通过CallableStatement实例实现。 *

·具体的实现方式:


 Statement stmt = con.createStatement() ;   
   PreparedStatement pstmt = con.prepareStatement(sql) ;   
   CallableStatement cstmt =    
                        con.prepareCall("{CALL demoSp(? , ?)}") ;  

处理结果有两种情况:
1.执行更新返回的是本次操作影响到的记录数。 2.执行查询返回的结果是一个ResultSet对象。

三、 关闭Connection操作对象;

操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:

1.关闭记录集
2.关闭声明
3.关闭连接对象


  if(rs != null){   // 关闭记录集   
    try{   
        rs.close() ;   
    }catch(SQLException e){   
        e.printStackTrace() ;   
    }   
      }   
      if(stmt != null){   // 关闭声明   
    try{   
        stmt.close() ;   
    }catch(SQLException e){   
        e.printStackTrace() ;   
    }   
      }   
      if(conn != null){  // 关闭连接对象   
     try{   
        conn.close() ;   
     }catch(SQLException e){   
        e.printStackTrace() ;   
     }   
   }  

使用Statement、ResultSet

•要执行SQL,必须取得java.sql.Statement操作对象,可以使用Connection的createStatement()来建立Statement对象,然后使用executeUpdate()、executeQuery()等方法来执行SQL;

具体实现代码:

 ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;   
int rows = stmt.executeUpdate("INSERT INTO ...") ;   
boolean flag = stmt.execute(String sql) ;   

使用PreparedStatement、CallableStatement

•要让SQL执行生效,要执行executeUpdate()或executeQuery()方法,在此次SQL执行完毕后,调用clearParemeters()清除设置的参数,就可以再次调用PreparedStatement实例;

JDBC进阶

•DriverManager类讲解

Jdbc程序中的DriverManager用于加载驱动,并创建与数据库的链接,这个API的常用方法:
DriverManager.registerDriver(new Driver()) DriverManager.getConnection(url, user, password)  

•注意:在实际开发中并不推荐采用registerDriver方法注册驱动。原因有二:

 
1.查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象。
2.程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。

•推荐方式:Class.forName("com.mysql.jdbc.Driver");

采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。

•Connection类讲解

JDBC程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,这个对象的常用方法:

·createStatement():创建向数据库发送sql的statement对象。

·prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。

·prepareCall(sql):创建执行存储过程的callableStatement对象。

·setAutoCommit(boolean autoCommit):设置事务是否自动提交。

·commit() :在链接上提交事务。

·rollback() :在此链接上回滚事务。

•ResultSet类卷动、更新数据

JDBC程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:

1.获取任意类型的数据
getObject(int index)

getObject(string columnName)  

2.获取指定类型的数据,例如:

getString(int index)

getString(String columnName)

3.ResultSet还提供了对结果集进行滚动的方法:

next():移动到下一行

Previous():移动到前一行

absolute(int row):移动到指定行

beforeFirst():移动resultSet的最前面。

afterLast() :移动到resultSet的最后面。

教材中遇到的问题及解决方法

对于JDBC数据库的使用有了一定了解,但是对于其的实际意义还不太明确。

其他(感悟、思考等,可选)

通过本周学习了解了JDBC连接数据库的使用。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 21/41
第三周 450/950 3/7 22/63
第四周 450/1365 2/9 20/83
第五周 450/1815 2/11 20/113
第六周 450/2315 2/13 20/133
第七周 300/2615 2/15 15/148
第八周 300/2915 2/17 15/163
第九周 200/3115 2/19 10/173 了解了JDBC

参考资料

原文地址:https://www.cnblogs.com/xzh20145231/p/5451290.html