一 概述
JDBC(Java Database Connectivity),是一个规范而非一个实现,Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
二 从SQL到Java数据类型映射的JDBC规范
SQL类型 | Java类型 |
---|---|
CHAR | java.lang.String |
VARCHAR | java.lang.String |
LONGVARCHAR | java.lang.String |
NUMERIC | java.math.BigDecimal |
DECIMAL | java.math.BigDecimal |
BIT | boolean |
TINYINT | byte |
SMALLINT | short |
INTEGER | int |
BIGINT | long |
REAL | float |
FLOAT | double |
DOUBLE | double |
BINARY | byte[] |
VARBINARY | byte[] |
LONGVARBINARY | byte[] |
DATE | java.sql.Date |
TIME | java.sql.Time |
TIMESTAMP | java.sql.Timestamp |
BLOB | java.sql.Blob |
CLOB | java.sql.Clob |
Array | java.sql.Array |
REF | java.sql.Ref |
Struct | java.sql.Struct |
三 从SQL到Java数据类型映射的JDBC规范时的illegalArgumentException异常
注意:Java中数据类型是存在默认值的,SQL的数据类型的默认值是不一样的,一般情况下不给初始值是默认设置为null。
SQL字段定义
SQL字段默认为null
此为SQL数据类型为int的情况,其到Java数据类型映射为int,但是int不给初值是默认为0;
Java字段定义(注意此处l为成员变量不会强制初始化,如果时局部变量被强制初始化)
这就会造成illegalArgumentException。
解决方案:使用int的包装类Integer
四 JDBC实现数据库连接的步骤
1.加载JDBC驱动程序
在连接数据库之前,首先需要加载想要连接的数据库的驱动程序到JVM(Java虚拟机),这时候java.lang.Class类的静态方法forName(String className)。
forName()
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
加载数据库驱动
try {
//加载MySql的驱动类,如果没有成功加载驱动会抛出ClassNotFoundException
Class.forName("com.mysql,jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("数据库驱动类没找到,加载失败!");
e.printStackTrace();
}
//成功加载后,会将Driver类的实例注册到DriverManager类中。
2.提供JDBC连接的URL
连接URL定义了连接数据库时的协议,子协议,数据源标识。
- 协议:JDBC协议是以jdbc开始的。
- 子协议:是连接的驱动程序或者数据库管理系统的名称,如mysql。
- 数据源标识:标记找到数据库来源的地址与连接端口,如localhost:3306。
例如:jdbc:mysql://localhost:3306/test?useUnicode = true&characterEncoding = gbk;
useUnicode=true:表示使用Unicode字符集。
如果characterEncoding设置为gb2312或GBK,本参数设置为characterEncoding = gbk字符编码方式。
3.创建数据库的连接对象
要创建数据库时,需要向java.sql.DriverManager请求并获得Connection对象,该对象代表一个数据库连接。
使用DriverManager的getConncetion(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 e) {
e.printStackTrace();
}
4.实例化一个Statement声明
执行SQL语句之前,必须先获得java.sql.Statement实例
//interface Connection
Statement createStatement() throws SQLException;
Statement stmt = con.createStatement();
PreparedStatement prepareStatement(String sql)throws SQLException;
PreparedStatement pstmt = con.prepareStatement(sql);
CallableStatement prepareCall(String sql) throws SQLException;
CallableStatement cstmt = con.prepareCall(sql);
5.执行SQL语句获得记录集
Statement接口提供了三种执行SQL语句的方法
//interface Statement
ResultSet executeQuery(String sql) throws SQLException; //执行查询并返回一个结果集
int executeUpdate(String sql) throws SQLException;//执行更新数据库操作,返回受影响的记录数。
boolean execute(String sql) throws SQLException;
//interface PreparedStatement extends Statement
ResultSet executeQuery() throws SQLException;//执行查询并返回一个结果集
int executeUpdate() throws SQLException;//执行更新数据库操作,返回受影响的行。
boolean execute() throws SQLException;
//interface CallableStatement extends PreparedStatement
对于上述操作得到的数据可以根据实际情况进行操作。
6 关闭JDBC对象
操作完成以后把所有的JDBC对象全部关闭,以释放JDBC资源,关闭顺序和声明顺序相反的。
- 关闭记录集
- 关闭声明
- 关闭连接对象
if(ResultSet != null ) {//关闭记录集
try {
ResultSet.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
if(stmt != null ) {//关闭声明
try {
stmt.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
if(con != null ) {//关闭连接
try {
con.close();
}catch(SQLException e) {
e.printStackTrace();
}
}