JDBC接口的介绍
1.使用JDBC接口技术,操作mysql数据库,将用户名都获取到Java程序中
JDBC是一套接口,接口不能直接使用,要通过它的实现类,这个实现类由mysql数据库厂商提供(驱动Jar包)
2.若想数据库与java程序建立连接,首先必须先将mysql的驱动jar包导入工程.lib中
JDBC四个核心对象:
* 1.DriverManager:用于注册驱动(java程序与mysql数据格式统一就可以通信)
注册方式:
//DriverManager.registerDriver(new Driver());
首先该注册方式有两个问题:第一,注册了两次;第二,过分依赖了mysql的驱动类,扩展性不高
//解决注册2次的问题,那么做到只让Driver类加载一次即可
1.new Driver();
2.Class.forname("全类名");我们可以将全类名抽取到配置文件中,动态地修改数据库连接操作,而不用修改Java代码
* 2.Connection:表示java程序与数据库之间创建的连接,只有拿到Connection才能操作数据库
* 3.Statement:执行sql语句的对象
* 4.ResultSet:结果集或一张虚拟表
JDBC访问数据库的步骤:
* 1.由DriverManager注册驱动程序
* 2.创建连接对象Connection
* 3.由客户端发送sql语句给服务器执行,sql语句封装成statement对象
* 4.查询到的结果集封装成ResultSet对象
* 5.在客户端可以从ResultSet中取出数据
* 6.释放资源,关闭连接对象
* statement接口的常用api:
* boolean execute(String sql)
* 此方法可以执行任意sql语句,返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,
* 且有返回结果时返回true,其它语句都返回false;
*
* int executeUpdate(String sql)
* 根据执行的DML(Insert,update,delete)语句,返回受影响的行数
*
* ResultSet executeQuery(String sql)
* 根据查询语句返回结果集,只能执行select语句
数据记录的增删改查:
增删改:内存中的数据保存到硬盘,输出流
查:硬盘上的数据读取到内存中,输入流
具体实现代码如下:
/*Statement的API介绍
1.boolean execute(String sql)
此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;
true:表示sql是查询操作,返回结果集,statement.getResultSet();
false:表示sql是DML操作,返回受影响的行数,statement.getUpdateCount();
2. int executeUpdate(String sql)
根据执行的DML(INSERT、UPDATE、DELETE)语句,返回受影响的行数
3. ResultSet executeQuery(String sql)
根据查询语句返回结果集,只能执行SELECT语句
> 注意:在MySQL中,只要不是查询就是修改。
> executeUpdate:用于执行增删改
> executeQuery:用于执行查询
*/
import org.junit.Test;
import java.sql.*;
public class Demo03 {
// 1.boolean execute(String sql)
@Test
public void execute() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql:///JDBC", "root", "root");
Statement statement = connection.createStatement();
// String sql = "INSERT INTO user VALUES (NULL ,'zhaoliu',321)";
// String sql = "UPDATE user set password = '123456' where username = 'zhaoliu'";
String sql = "select * from user ;";
boolean execute = statement.execute(sql);
if(execute){
//true:select查询语句
ResultSet resultSet = statement.getResultSet();
while (resultSet.next()){
String username = resultSet.getString("username");
System.out.println(username);
}
resultSet.close();
}else{
//false:增删改语句
int i = statement.getUpdateCount();
System.out.println(i);
}
//6.释放资源
statement.close();
connection.close();
}
// 2. int executeUpdate(String sql)
@Test
public void executeUpdateTest() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql:///JDBC", "root", "root");
Statement statement = connection.createStatement();
// String sql = "INSERT INTO user VALUES (NULL ,'zhaoliu',321)";
String sql = "UPDATE user set password = '12345678' where username = 'zhaoliu'";
int i = statement.executeUpdate(sql);
System.out.println(i);
//6.释放资源
statement.close();
connection.close();
}
// 3. ResultSet executeQuery(String sql)
@Test
public void executeQueryTest() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql:///JDBC", "root", "root");
Statement statement = connection.createStatement();
String sql = "SELECT *from user ";
ResultSet resultSet = statement.executeQuery(sql);
// 5.获取数据
while (resultSet.next()){
String username = resultSet.getString("username");
System.out.println(username);
}
//6.释放资源
resultSet.close();
statement.close();
connection.close();
}
}
ResultSet接口:
结果集的遍历,数据的获取
1.A ResultSet对象维护指向其当前数据行的光标。最初,光标位于第一行之前
2.next方法将光标移动到下一行,如果有数据返回true,如果没有数据返回false
3.因此可以在while循环中使用循环来遍历结果集
while(resultSet.next()){
获取光标所指向的当前行的数据记录
}
4.我们可以通过getXXX(name|index)
XXX:对应字段的java中 的数据类型
name:列名
index:列索引
import org.junit.Test;
import java.sql.*;
public class Demo04 {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql:///JDBC", "root", "root");
statement = connection.createStatement();
String sql = "select *from user";
resultSet = statement.executeQuery(sql);
while(resultSet.next()){
//getXXX(name|index)
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
//indx: java 0基 sql 1基
int id1 = resultSet.getInt(1);
String username1 = resultSet.getString(2);
String password1 = resultSet.getString(3);
System.out.println(id+"--------"+id1);
System.out.println(username+"---------"+username1);
System.out.println(password+"---------"+password1);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
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;//避免内存泄漏
}
}
}
}