JDBC技术所涉及到的类需要导入的包:
import java. sql.Connection;
import java. sql.DriverManager ;
import java. sql.PreparedStatement;
import java. sql.ResultSet;
JDBC是一种用于执行SQL语句的Java API, 由一组类与接口组成。
所涉及到的类有:
- 驱动程序接口: Driver
- 驱动程序管理器类: DriverManager
- 数据库连接接口类: Connection
- 执行SQL语句接口类: Statement
- 执行动态SQL语句接口类: PreparedStatement
- 访问结果集类: ResultSet
类或接口 | 作用 |
---|---|
java.sql.DriverManager | 该类处理驱动程序的加载和建立新数据库连接 |
java.sql.Connection | 该接口实现对特定数据库的连接 |
java.sql.Satement | 该接口用于执行静态SQL语句并返回它所生成结果的对象 |
java.sql.PreparedStatement | 该接口表示预编译的SQL语句的对象,派生自Satement,预编译SQL效率高且支持参数查询 |
java.sql.CallableStatement | 该接口表示用于执行SQL语句存储过程的对象。派生自PreparedStatement,用于调用数据库中的存储过程 |
java.sql.ResultSet | 该接口表示数据库结果集的数据表,该数据表通过执行查询数据库的语句生成 |
1.驱动程序接口: Driver
每种数据库( MySQL、SQL Server、oracle 等等)都提供了数据库驱动程序,并且都提供了一个实现java.sql.Driver接口的类,简称Driver类。.
- 在应用程序开发中,需要通过java. lang. Class类的静态方法加载该Driver类:
Class. forName( String className);
- 对于MySQL数据库,其驱动程序加载格式:
Class. forName ("com.mysql.cj.jdbc.Driver");
- 创建自己的实例对象(采用默认的对象名称),并向java. sql. DriverManager类注册该实例
2.驱动程序管理器: DriverManager
DriverManager类负责管理JDBC驱动程序的基本服务,是JDBC的管理层,主要用于在数据库和驱动程序之间建立连接。
- DriverManager类提供的创建连接对象的方法是:
Connection getConnection (String url);
该方法为静态方法,用来获得数据库连接,有1个入口参数,为连接字符串。 - 对于MySQL数据库的连接对象,可采用如下方式创建:
String url1=" jdbc : mysql://数据库服务器IP :3306/数据库名";
String url2=" ?user=root&password=密码”;
String url3=" &useUni code= true&characterEncoding =UTF- 8”; // 支持汉字编码
Connection conn=Dr iverManager. getConnection(url); //获取 数据库连接对象
3.数据库连接接口: Connection
Connection接口负责与特定数据库的连接,形成连接对象。
- Connection接口的常用方法
方法名称 | 功能描述 |
---|---|
createStatement() | 创建并返回一个Statement实例,通常在执行无参数的SQL语句时创建该实例 |
prepareStatement() | 创建并返回一个PreparedStatement实例,在执行包含参数的SQL语句时创建该实例,并对SQL语句进行了预编译处理 |
close() | 立即释放Connection实例占用的数据库和JDBC资源,即关闭数据库连接 |
- 使用带参数的SQL语句(“?”表示参数值),创建PreparedStatement对象。
例如:
String ss=" select * from stu_ info where age>=? and sex=?" ;
PreparedStatement pstmt= conn.preparedStatement (ss);
注意:在SQL语句中,没有指定具体的年龄和性别,在实际执行该SQL前,需要利用pstmt对象,设置参数值.
4.执行动态SQL语句接口: PreparedStatement
PreparedStatement接口继承于Statement接口,是Statement接口的扩展,使用更灵活。
- PreparedStatement接口提供的常用方法:
方法名称 | 功能描述 |
---|---|
executeQuery() | 执行SELECT语句,并返回一个ResultSet实例对象(查询结果集合) |
executeUpdate() | 执行INSERT、UPDATE或DELETE语句,返回int型数值,为更新记录数 |
setXxx(position,value) | 为指定参数设置Xxx型值,注意: position是从1开始的 |
close() | 关闭PreparedStatement对象,释放资源 |
- 使用示例
String sq1= “select xh, name,cj from stu where cj>=? and name=?”; // 查询SQL语句 PreparedStatement pstmt= conn.prepareStatement (sq1) ; pstmt.setInt(1, 60); //根据?所在的位置号,给出对应的具体数据。 pstmt. setString(2,”张三”): Rrsul tSet rs=pstmt. executeQuery() ; //执行,得到查询结果集合,注意,这里是空参数
5.访问结果集接口: ResultSet——获得查询结果并进行处理
ResultSet实例是通过执行查询数据库的语句生成。即:ResultSet对象是由查询结果构成的数据表。
对查询结果的处理,一般需要,首先定位记录位置,然后对确定记录的字段项实现操作。
- ResultSet接口提供的记录定位方法:
方法名称 | 功能描述 |
---|---|
first() | 移动第一行 |
last() | 移动最后一行 |
previous() | 向上移动一行 |
next() | 向后移动一行。注意:对于查询结果集,其指针最初位于第一行之前,第一次调用该方法将移动到第一行; 如果存在下一行则返回true,否则返回false |
getRow() | 获得当前行的索引编号(编号从1开始) |
- 读取指定字段的数据操作:
两种格式:
利用整数指定字段的索引(索引从1开始)
利用字段名来指定字段。
下表列出采用“指定字段的索引号”获取各种类型的字段值的方法:
方法名称 | 方法说明 |
---|---|
boolean getBoolean(int ColumnIndex) | 返回指定字段的以Java的booelan类型表示的字段值 |
String getString(int Columnlndex) | 返回指定字段的以Java的String类型表示的字段值 |
byte getByte(int ColumnIndex) | 返回指定字段的以Java的byte类型表示的字段值 |
int getlnt(int ColumnIndex) | 返回指定字段的以Java的int类型表示的字段值 |
byte[ ] getBytes(int ColumnIndex) | 返回指定字段的以Java的字节数组类型表示的字段值 |
Date getDate(int ColumnIndex) | 返回指定字段的以Java.sql.Date的Date类型表示的字段值 |
-
修改指定字段的数据操作.
移到指定的数据行后,可使用updateXxx ()方法设置字段新的数值,
其中:“Xxx” 指的是Java的数据类型。方法: updateXxx(字段名或字段序号,新数值) 中的参数也有两种格式:
使用整数指定字段的索引(索引从1开始)
使用字段名来指定字段
实现步骤:
1.利用Java实现对MySQL数据库访问,需要搭建支持环境。
- 从MySQL数据库下载其连接驱动程序:
(mysql-connector-java-5.1.7-bin.jar) - 将其复制到Web.工程(对于Java工程先创建1ib)的lib子目录下(导入该支持程序)
2.使用JDBC访问数据库,其访问流程是:
- 注册驱动(加载驱动程序) : Class. forName (com. mysql. jdbc. Driver);
- 建立连接(Connection):
Connection conn=DriverManager. getConnection(url): //创建连接对象
注意: url如何形成? URL连接字格式一定要正确,否则会出现连接数据库错 误! ! ! - 创建数据库操作对象用于执行SQL的语句:
PreparedStatement pstmt= conn. prepareStatement (sql) ; - 执行语句; (分两种类型:查询和更新操作)。
Resul tSet rs=pstmt.executeQuery(); //执行,得到查询结果集合,注意,这里是空参数
或int n=pstmt.executeUpdate(): //执行, 返回实际删除记录的条数, - 对于查询要处理执行结果(ResultSet)。
- 释放资源。
3.命令行中文乱码问题:
现象: mysql 的默认编码设置为utf-8,页面以utf-8的编码方式写入到数据库。用工具查看一切正常, 但从mysql的命令行读数据出来总是乱码
原因: mysql 的客户端根本无法以utf- 8的形式返回数据
解决如下:
set names gb2312;//改成支持汉字的国标编码
4.查看mysq1数据库的字符编码
mysql> show variables like 'character%';//查询当前mysql数据库的所有属性的字符编码
5.修改mysql数据库的字符编码
mysql> SET character_set_client=utf8 ;
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
添加记录:
public class Add_db {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
String driverName="com.mysql.cj.jdbc.Driver";
String userName ="root" ;//数据库用户名
String userPwd ="190211" ;//密码
String dbName ="student" ;//数据库名
String url1="jdbc:mysql://localhost :3306/" +dbName;
String url2 ="?user=" +userName+"&password=" +userPwd;
String url3="&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
String url =url1+url2+url3;//形成带数据库读写编码的数据库连接字
Class.forName(driverName);
Connection conn =DriverManager.getConnection(url) ; //创建连接对象 (创建桥)
//第2步:利用SQL语句,创建执行语句(执行对象: pstmt) ,并执行SQL,得到结果
String sql="insert into stu(id,sno,sname,sex,bjid,fen) value(?,?,?,?,?,?)";
//更 新数据库的:添加、删除、修改操作的SQL语句,可以有参数
PreparedStatement pstmt= conn.prepareStatement(sql);
pstmt.setInt(1, 10);
//根据?所在的位置号,从1开始编号,给出对应的具体数据。
pstmt.setString(2, "001");
pstmt.setString(3,"张济");
pstmt.setString(4,"男");
pstmt.setString(5, "2001");
pstmt.setInt(6, 69);
int n=pstmt. executeUpdate();
//执行,返回实际影响记录的条数,注意,这里是空参数
//第3步:对执行结果处理
//对数据n进行判定并给出相应的处理
//第4步:关闭对象,释放资源
if(n>0) {
System.out.println("添加成功,共添加了"+n+"条记录");
}else {
System.out.println("添加不成功");
}
pstmt. close() ;
conn. close();
}
}
删除记录:
public class Del_db {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String driverName="com.mysql.cj.jdbc.Driver";
String userName ="root" ;//数据库用户名
String userPwd ="190211" ;//密码
String dbName ="web_01" ;//数据库名
String url1="jdbc:mysql://localhost :3306/" +dbName;
String url2 ="?user=" +userName+"&password=" +userPwd;
String url3="&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
String url =url1+url2+url3;//形成带数据库读写编码的数据库连接字
Class.forName(driverName);
Connection conn =DriverManager.getConnection(url) ; //创建连接对象 (创建桥)
//第2步:利用SQL语句,创建执行语句(执行对象: pstmt) ,并执行SQL,得到结果
String sql="delete from stu where grade<?";
//更 新数据库的:添加、删除、修改操作的SQL语句,可以有参数
PreparedStatement pstmt= conn.prepareStatement(sql);
pstmt.setInt(1, 60);
//根据?所在的位置号,从1开始编号,给出对应的具体数据。
int n=pstmt. executeUpdate();
//执行,返回实际影响记录的条数,注意,这里是空参数
//第3步:对执行结果处理
//对数据n进行判定并给出相应的处理
//第4步:关闭对象,释放资源
if(n>0) {
System.out.println("删除成功,共删除了"+n+"条记录");
}else {
System.out.println("删除不成功");
}
pstmt. close() ;
conn. close();
}
}
查询记录:
public class Select {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String driverName="com.mysql.cj.jdbc.Driver";
String userName ="root" ;//数据库用户名
String userPwd ="190211" ;//密码
String dbName ="web_01" ;//数据库名
String url1="jdbc:mysql://localhost :3306/" +dbName;
String url2 ="?user=" +userName+"&password=" +userPwd;
String url3="&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
String url =url1+url2+url3;//形成带数据库读写编码的数据库连接字
Class.forName(driverName);
Connection conn =DriverManager.getConnection(url) ; //创建连接对象 (创建桥)
//第2步:利用SQL语句,创建执行语句(执行对象: pstmt) ,并执行SQL,得到结果
String sql="select id,name,grade from stu where grade>=?";
//更 新数据库的:添加、删除、修改操作的SQL语句,可以有参数
PreparedStatement pstmt= conn.prepareStatement(sql);
pstmt.setInt(1, 90);
//根据?所在的位置号,从1开始编号,给出对应的具体数据。
ResultSet n=pstmt.executeQuery();
//执行,返回实际影响记录的条数,注意,这里是空参数
//第3步:对执行结果处理
//对数据n进行判定并给出相应的处理
//第4步:关闭对象,释放资源
while(n.next()) {
int a=n.getInt("id");
String b=n.getString("name");
int c=n.getInt("grade");
String x="id="+a+" name="+b+" grade="+c;
System.out.println(x);
}
pstmt. close() ;
conn. close();
}
}
修改记录:
public class Set_db {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String driverName="com.mysql.cj.jdbc.Driver";
String userName ="root" ;//数据库用户名
String userPwd ="190211" ;//密码
String dbName ="web_01" ;//数据库名
String url1="jdbc:mysql://localhost :3306/" +dbName;
String url2 ="?user=" +userName+"&password=" +userPwd;
String url3="&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
String url =url1+url2+url3;//形成带数据库读写编码的数据库连接字
Class.forName(driverName);
Connection conn =DriverManager.getConnection(url) ; //创建连接对象 (创建桥)
//第2步:利用SQL语句,创建执行语句(执行对象: pstmt) ,并执行SQL,得到结果
String sql="update stu set grade=? where id=?";
//更 新数据库的:添加、删除、修改操作的SQL语句,可以有参数
PreparedStatement pstmt= conn.prepareStatement(sql);
pstmt.setInt(1, 100);
pstmt.setInt(2, 2);
//根据?所在的位置号,从1开始编号,给出对应的具体数据。
int n=pstmt. executeUpdate();
//执行,返回实际影响记录的条数,注意,这里是空参数
//第3步:对执行结果处理
//对数据n进行判定并给出相应的处理
//第4步:关闭对象,释放资源
if(n>0) {
System.out.println("修改成功,共修改了"+n+"条记录");
}else {
System.out.println("修改不成功");
}
pstmt. close() ;
conn. close();
}
}