JDBC
what?
jdbc: (Java Database Connectivity),java数据库连接。
:它是一套用于执行sql语句的java API;应用程序可以通过这套API连接到关系型数据库,并使用sql语句完成对数据库的查询,新增,更新和删除等操作。
:应用程序使用JDBC访问特定的数据库的时候,需要使用不同的数据库驱动进行连接,由于数据库厂商提供的数据库驱动是不同,所以,在提供了访问数据库的API的同时,还需要封装与各种数据库服务器通信的细节。这样才能建立真正的连接。
JDBC的具体过程
: JDBC驱动管理器: 负责注册特定的JDBC驱动器,主要同java.sql.DriverManager类来实现。
: JDBC驱动器API:主要接口是java.sql.Driver。
: JDBC驱动器:实现了JDBC驱动器API,负责与特定的数据库进行连接,以及处理通信细节。
Driver接口
Driver接口时JDBC驱动器必须要实现的接口,该接口提供给数据库厂商使用,需要将jar包加载到项目中。
DriverManager
DriverMananger类用于加载JDBC并且创建于数据库的连接。
方法:
registerDriver(Driver driver) 注册给定的JDBC驱动程序
Connection getConnection(String url,String user,String pwd); 用于建立于数据库的连接,并且返回一个Connection的对象。
Connection接口
Connection接口代表java程序和数据库的连接,获得改连接对象之后才可以访问数据库,并操作数据库。
接口中的方法
: getMetaData() 用于返回数据库中的元数据的DatabaseMetaData对象
: createStatement() 用于创建一个statement对象来将sql语句发送到数据库
: prepareStatement(String sql) 用于创建一个PrepareStatement对象来将参数化的SQL语句发送到数据库
: prepareCall(String sql) 用于表示CallableStatement对象来调用数据库存储过程
Statement接口
Statement接口用于执行静态的SQL的语句,并返回一个结果对象(ResultSet),Statement接口对象可以通过Connection中的createStatement()方法获得,该对象将静态的sql的语句发送到数据库中编译执行,然后返回数据库的处理结果。
方法:
: boolean execute(String sql) 用于执行sql语句,返回一个boolean类型的值,如果返回为true,表示能查到结果,可以通过Statement中的getResultSet()方法得到结果集。
: int executeUpdate(String sql) 用于执行SQL中的insert,update,delete的语句,返回一个int类型的值,表示数据库中受SQL语句影响的语句条数。
: ResultSet executeQuery(String sql) 用于执行SQL中的select的语句,返回一个表示查询到结果的ResultSet对象。
PrepareStatement
prepareStatement是statement的子接口,用于执行预编译的SQL语句,它的扩展时带有参数SQL语句的执行操作,该接口中的SQL语句可以使用?来代替参数,然后使用setXxx()方法为SQL语句的参数赋值。
其中的方法如下:
: 其中的:setDate()方法可以设置日期内容,Date的类型时java.sql.Date
: 为参数设置值;
preparedStatement.setString(1,"34");
preparedStatement.setString(2,"bo");
ResulstSet接口
用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中,在ResultSet内部有一个指向表格数据行的游标(指针),开始时,游标指向第一行之前,可通过next()方法将游标移动到下一行,通常使用next()方法作为while循环的条件来迭代ResultSet结果集。
方法:
: String getString( int columnIndex) 用于获取指定字段的String类型的值,参数columnIndex代表字段的索引
: String getString(String columnName) 用于获取指定字段的String类型的值,参数columnName代表字段的名称
: String getInt(int columnIndex) 同上
: String getInt(String columnName) 同上
: Date getDate(int columnIndex) 同上
: Date getDate(String columnName) 同上
: boolean next() 向下移动一个游标
: boolean absolute(int Index) 定位到指定的游标
: afterLast()
: beforeFirst()
: previous() 将游标向前移动一个
: last()
实现JDBC
:关闭原则,释放资源: 先出现的后关闭;
: 关闭资源时:将关闭语句放在finally中,是为了无论是否发生异常,它都会执行。
: 注册数据库驱动器,使用Class.forName(“com.mysql.jdbc.Driver”) ,而不用DriverManager中的 registerDriver()方法,是因为这个方法注册了两次。
/*
* 加载并注册数据库驱动
* 通过DriverManager获取数据库连接
* 通过Connection对象获取Statement对象
* 使用Statement执行SQL语句
* 操作ResultSet结果集
* 关闭连接,释放资源
* */
public class jdbc {
public static void main(String[] args) throws SQLException {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
//1加载并注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2通过DriverManager获取数据库连接
String url = "jdbc:mysql://localhost:3306/yun6";
String userName = "root";
String passWord = "root";
connection = DriverManager.getConnection(url, userName, passWord);
//通过Connection对象获取Statement对象
statement = connection.createStatement();
//使用Statement执行SQL语句
String sql = "select * from user";
resultSet = statement.executeQuery(sql);
//操作ResultSet结果集
System.out.println("id | name" );
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println(id + "|" + name);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭连接,释放资源
if(connection != null){
connection.close();
}
if(statement != null){
statement.close();
}
if(resultSet != null){
resultSet.close();
}
}
}
}
PrepareStatement对象的使用
/*
加载并注册数据库驱动
* 通过DriverManager获取数据库连接
* 通过Connection对象获取prepardStatement对象,指定要执行的sql的语句,为sql语句中的参数赋值。
* 使用preaprdStatement执行SQL语句
* 操作ResultSet结果集
* 关闭连接,释放资源* */
public class jdbc1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//加载并注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过DriverManager获取数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3360/yun6", "root", "root");
//通过Connection对象获取prepardStatement对象,指定要执行的sql的语句
String sql = "insert into user (id,name) values (?.?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//为sql语句中的参数赋值。
preparedStatement.setString(1,"34");
preparedStatement.setString(2,"biao");
//使用preaprdStatement执行SQL语句
int count = preparedStatement.executeUpdate();
System.out.println("受影响的行数" + count);
//关闭连接,释放资源
connection.close();
preparedStatement.close();
}
}
ResultSet对象
public class jdbc2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/yun6";
String name = "root";
String passWord = "root";
Connection connection = DriverManager.getConnection(url, name, passWord);
String sql = "select * from user";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
//对ResultSet结果集进行定位
resultSet.absolute(2);
System.out.print("第二行数据中name属性下的值");
System.out.println(resultSet.getString("name"));
resultSet.first();//将它移动到第一行的前面
resultSet.next();//移动到第一行
System.out.print("第一行数据中name属性下的值");
System.out.println(resultSet.getString("name"));
resultSet.last();//将光标移动到最后一行
resultSet.previous();//将光标移动一行
System.out.print("第一行数据中name属性下的值");
System.out.println(resultSet.getString("name"));
}
}
Date的使用
:注意:Date()使用的时java.sql.Date
java.sql.Date 是子类 java.util.Date是父类
两种Date之间的转换:
java.util.Date date = new java.sql.Date
java.sql.Date date = new java.sql.Date(new java.util.Date.getString()).