前言 : 数据库编程的必备条件
- 编程语言,如Java,C、C++、Python等
- 数据库,如Oracle,MySQL,SQL Server等
- 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提
供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的, 要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。
1. Java的数据库编程:JDBC
JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
JDBC优势:
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
1.1 JDBD使用步骤
- 创建项目 :在IDEA中创建一个新的项目。
- 引入依赖:JDBC编程需要用到 mysql的驱动包.(驱动包就是把 mysql自身的api给转换成jdbc风格的)驱动包是mysql官方提供的。
- 下载驱动包:
数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的,要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。
在吗 maven(中央仓库)里面搜索mysql,出现以下页面:
选择第一个 MySQL Connector,然后找到自己对应的版本号: 如果安装的是5.*版本,就在里面下载对应的5.1.x系列,这里所下载的驱动版本要和MySQL的版本号相对应!
点击下载驱动包,得到一个jar这样的文件(就相当于.zip这样的压缩包一样),jar里面就是一些其他人写好的.class文件。
- 创建个目录,随便起个名字,例如叫做lib;
- 把刚才下载的jar 文件拷贝到刚才的目录中;
- 右键刚才的目录,有一个选项,叫做
Add as library ,点击这个选项,才能把这个jar 引入到项目中,此时项目才会从jar里面读取内部的.class ,否则,代码就找不到jar 中的一些类。 到这里我们进行JDBC代码编写的准备工作就完成了,下面就可以进行代码的编写:
4. JDBC使用
4.1创建数据源
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java102?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("1963");
对于这里的URL:
"jdbc:mysql://127.0.0.1:3306/java102?characterEncoding=utf8&useSSL=false"
jdbc:mysql :表示这里的URL是用于jdbc mysql的url。 127.0.0.1 :IP地址,mysql 服务器所在的主机的IP地址,IP地址就描述了网络上一个主机的位置。这是一个特殊的IP地址就表示你的本机 IP(环回IP)。 3306 :端口号,访问你这个主机上的哪个程序;3306表示了mysql服务器 (安装 mysql的时候,有个环节就是设置了mysql服务器的端口号.默认就是3306),每个服务器程序启动的时候,都关联一个端口号。 java102 :自己的数据库里面所创建的数据库名。 characterEncoding=utf8 :指定字符集是utf8。 useSSL=false :不需要加密传输。
4.2 与数据库服务器建立连接
Connection connection=dataSource.getConnection();
这里所选择的Connection 是java.sql 包下的。
4.3 操作数据库. 以插入数据为例
关键所在就是构造一个 SQL 语句
String sql="insert into student values(?,?)";
此处光是一个 String 类型的 sql 还不行, 需要把这个 String 包装成一个 “语句对象”
PreparedStatement statement=connection.prepareStatement(sql);
执行 SQL,返回值就表示这个操作, 影响到了 几行. 就相当于在控制台里输入 sql 之后, 得到的数字。
int ret=statement.executeUpdate();
System.out.println(ret);
此时 SQL 已经执行完毕. 然后还需要释放资源.
statement.close();
connection.close();
DataSource/MysqlDataSource 用来描述数据源,描述数据库的地址,端口,数据库名,用户名,密码. getConnection、Connection 表示数据库连接~~ PreparedStatement 通过这个对象来描述要执行的SQL. executeUpdate :增删改 executeQuery :查找
5.数据库操作(CURD 增删改查)
注意我们要实现操作的条件在控制台里面输入,所以在设置SQL语句对象时候使用相应数量的 ? ; 然后通过 SQL语句对象statement方法中的setxxx方法来实现控制台输入:
System.out.println("请输入学号:");
int id=scanner.nextInt();
System.out.println("请输入姓名:");
String name=scanner.next();
String sql="insert into student values(?,?)";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("statement:"+statement);
5.1 插入(executeUpdate )
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class TestJDBC {
public static void main(String[] args) throws SQLException {
Scanner scanner=new Scanner(System.in);
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java102?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("1963");
Connection connection=dataSource.getConnection();
System.out.println("请输入学号:");
int id=scanner.nextInt();
System.out.println("请输入姓名:");
String name=scanner.next();
String sql="insert into student values(?,?)";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("statement:"+statement);
int ret=statement.executeUpdate();
System.out.println(ret);
statement.close();
connection.close();
}
}
执行代码结果如下: 在MySQL客服端中测试插入是否成功: 插入成功
5.2 删除(executeUpdate )
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class TestJDBCDelete {
public static void main(String[] args) throws SQLException {
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java102?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("1963");
Connection connection=dataSource.getConnection();
Scanner scanner=new Scanner(System.in);
System.out.println("请输入一个要删除的id:");
int id=scanner.nextInt();
String sql="delete from student where id=?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,id);
int ret=statement.executeUpdate();
System.out.println("ret="+ret);
statement.close();
connection.close();
}
}
id为100的数据成功被删除:
5.3 更新数据(executeUpdate )
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class TestJDBCUpdate {
public static void main(String[] args) throws SQLException {
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java102?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("1963");
Connection connection=dataSource.getConnection();
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要修改的学生的id:");
int id=scanner.nextInt();
System.out.println("请输入修改后的姓名:");
String name=scanner.next();
String sql="update student set name=? where id=?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2,id);
System.out.println("statement: "+statement);
int ret=statement.executeUpdate();
System.out.println("ret="+ret);
statement.close();
connection.close();
}
}
将id为520的学生姓名给为小红:
5.4 查询数据 (executeQuery)
相关解释在代码中以注释形式给出 : 查找操作与增,删,改 操作不同,步骤较以上三个操作更为复杂 : 主要体现在:
- 需要遍历结果集合,返回临时表,先获取到每一行,再获取到这一行中的每一列
- next方法表示获取到一行记录,同时把光标往后移动一行
- 如果遍历到的表结束,此时的next直接返回FALSE了
while (resultSet.next()){
int id=resultSet.getInt("id");
String name=resultSet.getString("name");
System.out.println("id="+id+" "+","+"name="+name);
}
针对select * from student 这一SQL语句jdbc代码如下:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestJDBCSelect {
public static void main(String[] args) throws SQLException {
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java102?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("1963");
Connection connection = dataSource.getConnection();
String sql="select * from student";
PreparedStatement statement=connection.prepareStatement(sql);
ResultSet resultSet=statement.executeQuery();
while (resultSet.next()){
int id=resultSet.getInt("id");
String name=resultSet.getString("name");
System.out.println("id="+id+" "+","+"name="+name);
}
resultSet.close();
statement.close();
connection.close();
}
}
6.JDBC使用步骤总结
- 创建数据库连接Connection
- 创建操作命令Statement
- 使用操作命令来执行SQL
- 处理结果集ResultSet
- 释放资源
7.JDBC常用接口和类
7.1 JDBC API
在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全 解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java数据库编程。
7.2 数据库连接Connection
Connection接口实现类由数据库提供,获取Connection对象通常方式为:
- 通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象。
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("rootPassWord");
Connection connection = ds.getConnection();
- DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接
是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收。
7.3 Statement对象
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。 实际开发中最常用的是PreparedStatement 对象,以下对其的总结: 主要需要掌握两种执行SQL的方法:
- executeQuery() 方法执行后返回单个结果集的,通常用于select语句
- executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete
语句
7.4 ResultSet对象
ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供 了对这些行中数据的访问。 ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当 前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next() 方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
具体见上述关于select语句的jdbc
|