JDBC具体原理这里就不写了,《Java核心技术卷II》写的还是很详细的,java本科教材也写的很好,可惜当时没有动手实践,上课也没认真听。
一、JDBC应用执行的基本流程
简单的说在给定程序启动程序(驱动程序,这个和具体连接使用的数据库有关)、数据源(使用哪个数据库)、数据库用户名和口令之后,执行的流程为:
- 由DriverManager类取得Connection对象(类方法 DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD));//连接数据库,运行结果为空则检查连接
- 有Connection对象创建Statement对象;// 执行SQL语句之前必须要创建 Statement 对象(或者是PreparedStatement对象)
- 有Statement对象执行sql语句并返回执行结果(executeQuery()返回结果集对象 ResultSet,executeUpdate()返回受影响的行数,execute两者都可以);
以MySQL5.x为例,下载后在安装文件下有目录Connector J 5.1.20.0,其中有一个.jar文件mysql-connector-java-5.1.20-bin.jar, 在window下可以设置环境变量classpath为这个.jar文件的绝对路径。以后再程序中写驱动程序地址变量是只要设置一个string类型的变量DB_Driver = "com.mysql.jdbc.Driver"; 该jar包下的.class文件。
另外一种方式就是比较直接,在Eclipse中设置添加外部jar包即可。那么程序中国就无需像前面那样显示设置DB_Driver变量;
三、简单例子
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] argStrings)
{
Connection conn = null;
Statement stmt = null;
PreparedStatement prepstmt = null;
final String DB_DRIVER = "com.mysql.jdbc.Driver";
final String DB_URL = "jdbc:mysql://localhost:3306/test? autoReconnector = true&useUnicode = true";
//final String DB_URL = "jdbc:mysql://localhost:3306/test";
final String DB_USER = "root";
final String DB_PASSWORD = "whu123";
try {
Class.forName(DB_DRIVER);
//System.setProperty("jdbc.drivers", DB_DRIVER);
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
String sql = "select * from testusr where id > 1002";
//stmt = conn.createStatement();
//ResultSet rs = stmt.executeQuery(sql);
prepstmt = conn.prepareStatement(sql);
//prepstmt.setString(numb,string);
ResultSet rs = prepstmt.executeQuery();
while(rs.next())
{
int id = rs.getInt(1);
String nameString = rs.getString(2);
System.out.println("id=" + id + ";name=" + nameString);
}
conn.close();
conn = null;
}
catch (ClassNotFoundException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
本例子中在数据库连接后获得Connection对象,执行SQL语句之前由Connection对象创建的是 PrepareStatement对象,其实面向的使用对象更应该是查询语句中有不确定的列值,并且多次使用此结构查询(唯一不同之处就是列值得不确定性),那么使用setString方法可以对不确定值赋值,程序中注释部分的两个参数分别是(第几个变量, 变量值),当然还有setInt等方法。这样数据库执行查询时只需第一次计算查询策略,无需每次计算,从而提高查询效率。Statement对象就比较直接,执行的SQL语句为确定性语句。
另外程序中没有使用批处理功能(executeBatch), 具体详见 JDBC batch批处理Statement executeBatch 详解
本例子使用的DB URL是final String DB_URL = "jdbc:mysql://localhost:3306/test? autoReconnector = true&useUnicode = true";
分析下: JDBC URL中的协议总是jdbc,子协议是mysql,它是驱动程序名或是数据库连接机制,主机名hostname是本机(localhost,没有使用IP地址,本机IP地址127.0.0.1),端口号port为3306(MySQL数据库默认的端口号); 数据库名dbname为 test。 后面的参数值为 autoreconnect表示当数据库连接丢失时是否自动连接,取值true/false;参数值useunicode表示是否使用unicode输出,取值为true/false; 这两个参数值是可选的,但是如果使用的话必须使用?和前面的数据库名隔开;目前不知道默认值是什么;