您的位置:首页 > 编程语言 > Java开发

java程序使用JDBC接口连接数据库

2016-05-22 22:12 686 查看
本文主要总结了这两天学习的关于Java使用JDBC连接数据库的实现方法。使用JDBC连接数据库一般步骤有:

1、加载驱动程序

Class.forName(“com.mysql.jdbc.Driver”);

2、创建连接对象

Connection conn = DriverManager.getConnection(String url,String user, String password);

3、创建执行sql语句的对象

4、对结果集进行处理

5、关闭资源

一、加载连接数据库的驱动到JVM(Driver接口)

1、使用JDBC接口连接数据库的第一步:加载连接数据库的驱动即Driver到JVM. Driver接口是由数据库厂家提供的,对于我们java开发者而言,只需要使用Driver接口就可以了.SUN公司只提供JDBC接口,具体实现交由各个数据库厂商实现具体的连接类。

2、加载Mysql驱动

Class.forName(“com.mysql.jdbc.Driver”);注意在加载驱动前需要引进jar包。

二、使用ManagerDriver接口创建连接对象

1、这个接口用于管理驱动,是JDBC的管理层。

2、ManagerDriver跟踪可用的驱动程序,并且建立驱动程序与数据库之间的连接。

3、具体实现连接方法

Connection conn = DriverManager.getConnection(String url,String user, String password);

其中url = “jdbc:mysql://localhost/xxxx”,localhost代表本机,当然也可以使用回送IP地址127.0.0.1,xxxx代表自己创建的数据库;

4、建立连接比较耗时,实际中一般采用连接池来管理连接,从而提高效率。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 测试加载连接数据库的驱动到JVM,然后建立连接
* @author Liubangxin
*
*/
public class DBDemo03 {
public static void main(String[] args) {
Connection conn = null;
try {
//1、加载驱动到JVM
Class.forName("com.mysql.jdbc.Driver");
long d1= System.currentTimeMillis();
//2、建立连接,其实连接内部包含了socket对象,是一个远程连接对象,比较耗时
//真正的开发中,为了提高效率,通常会使用连接池来管理连接
conn = DriverManager.getConnection("jdbc:mysql://localhost/lbx","root","19930701");
long d2 = System.currentTimeMillis();
System.out.println("创建连接耗时:"+(d2-d1)+"ms");
System.out.println(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}


控制台输出结果:

创建连接耗时:231ms

com.mysql.jdbc.JDBC4Connection@2dda6444

三、创建执行sql语句的对象

Statement接口:用于执行静态 SQL 语句并返回它所生成结果的对象。

1、三种Statement类

①、statement:

由createStatement创建,用于执行简单的sql语句,不带参数。一般很少。

Statement stmt = conn.createStatement();

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 测试Statement :The object used for executing a static SQL statement
* and returning the results it produces.
* @author Liubangxin
*
*/

public class DBDemo04 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
//1、加载驱动到JVM
Class.forName("com.mysql.jdbc.Driver");
//2、建立连接,其实连接内部包含了socket对象,是一个远程连接对象,比较耗时
//真正的开发中,为了提高效率,通常会使用连接池来管理连接
conn = DriverManager.getConnection("jdbc:mysql://localhost/lbx","root","19930701");
//3、执行sql语句,实际中很少用statement因为可能会有sql注入现象
stmt = conn.createStatement();
//          String name = "zhang";
//          String sql = "insert into persons values (7,'Li','"+name+"','Ding Street','Nanjing',52)";
//          stmt.execute(sql);
//测试sql注入
String name = "1 or 1=1";   //一直未true,所以数据全没了
String sql = "delete from dogs where id="+name;
stmt.execute(sql);

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}


②、PreparedStatement:

1、表示预编译的 SQL 语句的对象。SQL 语句被预编译并存储在 PreparedStatement对象中。然后可以使用此对象多次高效地执行该语句。

2、继承Statement接口,由prepareStatement(sql)创建。比Statement效率更高,并且可以防止sql注入。一般使用这个。

测试代码:

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
* 测试PreparedStatement的使用:SQL 语句被预编译并存储在 PreparedStatement
*  对象中。然后可以使用此对象多次高效地执行该语句。
* @author Liubangxin
*  */
public class DBDemo05 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/lbx","root","19930701");

String sql = "insert into dogs values(?,?,?)";  //?占位符
stmt = conn.prepareStatement(sql);
//          stmt.setInt(1,1);
//          stmt.setString(2, "Tom");
//          stmt.setDate(3, new Date(System.currentTimeMillis()));
//或者为了方便可以用如下写法
stmt.setObject(1, 2);
stmt.setObject(2, "Jomi");
stmt.setObject(3, new Date(System.currentTimeMillis()));
stmt.execute();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}


执行后:


3、程序说明:

1、 String sql = “insert into dogs values(?,?,?)”;其中?表示占位符。

2、给相应的占位符指定值

stmt.setInt(1,1);

stmt.setString(2, “Tom”);

stmt.setDate(3, new Date(System.currentTimeMillis()));

③、CallableStatement:

继承PreparedStatement接口。由方法prePareCall创建,用于调用存储过程。

2、常用的Statement方法

①、execute()

运行一般sql语句,返回类型为boolean。如果返回一个结果集(ResultSet)则为true,比如执行查询数据库语句,如果没结果或者只是更新数据库则为false,比如执行update语句。

②、executeQuery()

运行select语句,返回一个结果集(ResultSet)

③、executeUpdate()

执行update,delete,insert语句。返回操作的行数。

四、获取与处理结果集

ResultSet接口:statement执行executeQuery()方法返回一个结果集。

经常如下使用:

ResultSet rst = stmt.executeQuery();
while(rst.next()){
System.out.println(rst.getInt(1)+"--"+rst.getString(2)+"--"+rst.getDate(3));
}


五、关闭接口

操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源。关闭接口遵循如下规则: 关闭顺序和声明顺序相反:即关闭顺序:rst—>stmt—>conn。并且三个捕获异常要分开写。

查询数据库的代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 测试ResultSet: A table of data representing a database result set, which
* is usually generated by executing a statement that queries the database.
* @author Liubangxin
*
*/
public class DBDemo06 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rst = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/lbx","root","19930701");

String sql = "select * from dogs where id>=?";  //?占位符
stmt = conn.prepareStatement(sql);
stmt.setObject(1, 1);
rst = stmt.executeQuery();
while(rst.next()){
System.out.println(rst.getInt(1)+"--"+rst.getString(2)+"--"+rst.getDate(3));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
//后打开的先关闭 而且将三个分开写
try {
rst.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}


控制台输出结果:

1–Tom–2016-05-22

2–Jomi–2016-05-22
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: