@author StormWangxhu
@date 2017/12/10
通常,JDBC的使用可以按照以下几个步骤进行:
DriverManager.registerDriver(Driver driver);
或
Class.forName("DriverName");
Connection conn = DriverManager.getConnection(String url,String username,String password);
说明:getConnection()
方法中有三个参数,分别表示连接数据库的地址、登录数据库的用户和密码。以MySql为例。
其地址书写方式如下:
jdbc:mysql://hostname:port/databasename
说明:jdbc:mysql:
是固定的写法,mysql指的是MySql数聚库
。hostname
指的是主机的名称(若主机在本机中,hostname为localhost或127.0.0.1;若要连接的主机在其他计算机上,则hostname为所要连接计算机的IP)。port
指的是端口,Mysql默认端口为3306。databasename
为MySql中数据库名称。
(1)createStatement(): 创建基本的Statement对象。
(2)prepareStatement():创建PreparedStatement对象。
(3)preparedCall():创建CallableStatement对象。
以创建基本Statement对象为例:
Statement stmt = conn.createStatement();
所有的Statement都有如下3种执行SQL语句的方法。
(1)exeecute(): 可执行任何SQL语句。
(2)executeQuery(): 通常执行查询语句,执行后返回代表结果集得ResultSet对象
(3)executeUpdate():主要执行DML语句和DDL语句。执行DML语句,如insert,update,delete
时,返回受SQL语句的行数,执行DDL语句返回0。
//执行SQL语句,获取结果集ResultSet
ResultSet rs =stmt.executeQuery(sql) ;
若执行SQL语句是查询语句,执行结果将返回一个ResultSet对象,该对象里保存了SQL语句查询的结果。程序可以通过操作该ResultSet对象来获取查询结果。
每次操作操作数据库结束后,都要关闭数据库连接,释放资源,包括关闭ResultSet,Statement,和Connection等资源。
练习:
(1)搭建数据库环境
(2)创建项目环境
鼠标右击—-new—-folder,命名为lib,将下载好的MySql数据库驱动文件复制到项目的lib中,并使用鼠标右键单击该jar包,build path ——add to bulid path
(3)编写JDBC程序
类一:读取数据库中的users表,并将结果输出到控制台
package cn.itcast.jdbc.example;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
public class JDBCExample {
public static void main(String[] args) {
Statement statement = null ;
ResultSet resultSet = null ;
Connection connection = null ;
try {
//1:注册数据库的驱动
Class.forName("com.mysql.jdbc.Driver");
//2.通过DriverManager获取数据库连接
String url = "jdbc:mysql://localhost:3306/jdbc"; //连接数据库的地址
String username = "root";
String password = "xiaohu";
connection = (Connection) DriverManager.getConnection(url, username, password);
//3.通过Connection对象获取Statement对象
statement = (Statement) connection.createStatement(); //用于创建一个Statement对象,将SQL语句发送到数据库。
//4.使用Statement对象执行SQL语句
String sql ="select * from users";
resultSet =statement.executeQuery(sql); //该方法返回一个表示查询结果的ResultSet对象。
//5.操作ResultSet结果集
System.out.println("id | name | password"+"| email | birthday");
while (resultSet.next()) {
int id = resultSet.getInt("id"); //通过列名获取指定字段值
String name = resultSet.getString("name");
String password1 = resultSet.getString("password");
String email = resultSet.getString("email");
Date birthday = resultSet.getDate("birthday");
System.out.println(id+" | "+name+" | "+password1+" | "+email+" | "+birthday);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
//6.收回数据库资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
resultSet = null ;
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
statement = null ;
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
connection =null ;
}
}
}
}
注意:
(1).虽然使用DriverManager.registerDriver(new com.mysql.jdbc.Driver)方法也可以完成注册,但此方法会使数据库驱动被注册两次。这是因为Driver类的源码中,已经在静态代码块中完成了数据库的驱动注册。所以,为了避免数据库驱动被重复注册,只需要在程序中使用Class.forName()方法加载驱动类即可!
(2)释放资源
应该将释放资源的代码操作放在finally代码块中。
使用PreparedStatement对象对数据库进行插入操作。
package cn.itcast.jdbc.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCExample2 {
public static void main(String[] args) {
Connection connection = null ;
PreparedStatement pStatement = null ;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "xiaohu";
//创建应用程序与数据库连接的Connectin对象
connection=DriverManager.getConnection(url, username, password);
//执行SQL语句
String sql="insert into users(name,password,email,birthday)"+"values(?,?,?,?)"; //使用?通配符来代替参数,然后使用setXxx()方法为SQL语句赋值。
//1.创建执行SQL语句的PrepareedStatement对象
pStatement = connection.prepareStatement(sql);
//2.为SQL语句中参数赋值
pStatement.setString(1,"stormwang" );
pStatement.setString(2, "123456");
pStatement.setString(3, "[email protected]");
pStatement.setString(4, "1998-05-04");
//3.执行SQL语句
pStatement.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//回收数据库资源
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (pStatement != null) {
try {
pStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
使用ResultSet对象取出指定数据的信息。
package cn.itcast.jdbc.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCExampe3 {
public static void main(String[] args) {
Connection connection= null ;
Statement statement = null ;
try {
//注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/jdbc";
String username ="root";
String password="xiaohu";
//连接数据库
connection=DriverManager.getConnection(url, username, password);
//SQL语句
String sql="select * from users";
Statement statement2 = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//执行SQL语句并将获取的数据信息存放在ResultSet中
ResultSet resultSet =statement2.executeQuery(sql);
//取出ResultSet中指定的数据信息
System.out.print("第二条数据的name为:");
resultSet.absolute(2); //将指针定位到结果集中的第2行数据
System.out.println(resultSet.getString("name"));
System.out.print("第一条数据的name值为:");
// System.out.println(resultSet.getString("name"));
resultSet.beforeFirst(); //将指针定位到结果集中第一行数据前
resultSet.next(); //将指针向后滚动
System.out.println(resultSet.getString("name"));
System.out.print("第4条数据的name值为:");
resultSet.afterLast(); //将指针定位到结果集中最后一条数据之后
resultSet.previous(); //将指针向前滚动
System.out.println(resultSet.getString("name"));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//释放资源
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}