概述
一、JDBC4.2常用接口和类简介
1.什么是JDBC?
- Java Database Connectivity ,即Java数据库连接技术,具体指的就是JDK中提供的一组数据库编程接口
2.JDBC接口
JDK提供了一组Java连接数据库编程接口, 位于java.sql包中
接口名 | 作用 |
Connection | 数据库连接 |
Statement | SQL语句执行 |
PreparedStatement | 预编译SQL语句执行 |
CallableStatement | 调用存储函数存储过程语句执行 |
ResultSet | 查询语句返回的结果集 |
3.JDBC驱动包--代码库
各大数据库厂商提供了对JDBC接口的实现类, 并封装为jar包, 称为JDBC驱动包,驱动包中有驱动类
数据库 | 驱动包 | 驱动类 |
MySQL | ????mysql-connector-java-5.1.47.jar | com.mysql.jdbc.Driver |
Oracle | ????ojdbc8-19.7.0.0.jar | oracle.jdbc.OracleDriver |
4.Java工程中引入JDBC驱动包
1.DriverManager:用于管理JDBC驱动的服务类,主要功能式获取Connecton对象
public static synchronized Connection getConnection(String url,String user,String pass) throws SQLException;
2.Connection:代表数据库的连接对象,每个Connection代表一个物理连接会话,要想访问数据库,必须先获取数据库的连接
* Statement createStatement() throws SQLException:该方法是返回一个Statement对象
*PreparedStatement prepareStatement(String sql)throws SQLException:该方法是返回预编译的Statement对象,就是将sql提交到数据库进行预编译
*CallableStatement prepareCall(String sql) throws SQLException:该方法是返回CallableStatement对象,该对象用于调用存储过程
3.Statement:用于执行SQL语句的工具接口
*该对象用于执行DDL,DCL,也可以用于执行DML,还可以用于SQL查询
//SQL查询返回的是结果集
ResultSet executeQuery(String sql) throws SQLException
//执行DML语句,返回受影响的行数 返回0
int executeUpdate(String sql) throws SQLException
//执行任何的SQL语句 如果是ResultSet对象,返回true,如果是受影响的行数,返回false
boolean execute(String sql) throws SQLException
4.ResutlSet:结果集对象
*void close():释放ResultSet对象
boolean absolute(int row):将结果集记录指针移动到row行,如果row是负数,则移动到倒数第row行
booean next()将ResultSet的记录指针定位到下一行
二、JDBC编程步骤
1.加载数据库驱动 通常使用Class.forName()静态方法来加载驱动
//加载数据库驱动
driverClass=com.mysql.jdbc.Driver
Class.forName(driverClass);
2.通过DriverManager获取数据库的连接
String url = "jdbc:mysql://localhost:3306/ems?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "root";
Connection connection = null;
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
数据库url地址的组成部分
协议://数据库IP地址:端口号/数据仓库名称?属性=值&属性=值
协议 | jdbc:mysql |
数据库IP地址 | 本地连接写localhost, 非本地连接写具体的IP地址 |
端口号 | 默认3306 |
数据仓库名称 | 指定本次连接哪个数据仓库 |
? | 表示后面拼接参数, 参数格式是属性=值 |
& | 多组参数之间使用 & 拼接 |
- 使用DriverManager.getConnection() 方法可以建立Java客户端(指当前Java工程)与数据库之间的连接
- 该方法接受三个参数, 分别是url地址, 数据库用户名, 数据库密码,该方法执行成功返回一个Connection类型的连接对象
- 该方法抛出一个数据库异常 SQLException,该异常是一个编译时异常,必须捕捉处理。
- 出现这个异常的原因会有很多种情况:
- url 地址格式写错,IP地址写错,或数据库名写错等
- 用户名或密码写错
- 没有网络
- 数据库服务器没有启动
- 数据库服务器防火墙没有关闭等, 都有可能造成数据库连接失败, 触发异常
3. 通过Connection对象创建Statement对象
* createStatement():创建基本对象
*prepareStatement(String sql)创建预编译的Statement对象
*prepareCall(String sql)根据传入的SQL语句创建prepareCall对象
4.使用statement去执行SQL语句
* executeQuery()只执行查询语句
*executeUpdate()执行DDL语句和DML语句
*execute()执行任何语句,但是比较麻烦
5.操作结果集
*next(),previous(),first()
*getXxx()获取记录指针指向行,特定列的值
6.回收数据库的连接
大体的步骤
代码演示
package package01;
import java.sql.*;
public class Test {
public static void main(String[] args) {
//加载驱动:
String driver = "com.mysql.jdbc.Driver";
try {
Class.forName(driver);
System.out.println("驱动加载成功");
} catch (ClassNotFoundException e) {
System.out.println("驱动加载失败");
e.printStackTrace();
}
String url="jdbc:mysql://localhost:3306/ems?useUnicode=true&characterEncoding=utf-8";//数据库的地址,就好比电话号码
//数据库url组成部分:协议://数据库IP地址:端口号/数据仓库名称?属性=值&属性=值
String user="root";//数据库用户名
String password="root";//数据库密码
//拨号链接数据库--用DriverManager.getConnection();方法
//声明connection变量存储连接会话对象。才能保持通话
Connection connection=null;//声明在try作用域的外面,这样在try里面和外面都可访问
//外面可以访问里面。但是里面不能访问外面
try {
//建立连接
//1.建立完后保存连接
//connection声明在里面后外面的访问不了connection
connection=DriverManager.getConnection(url,user,password);
System.out.println("数据连接成功");
//声明sql变量存储本次会话内容(会话内容及为一条sql命令)
String sql="select * from cainfly";
//通过连接对象connection获取sql执行对象statement
Statement statement=connection.createStatement();//创建执行语句的方法
//2.用执行对象调用执行方法,执行sql命令,返回查询的结果集对象
ResultSet resultSet = statement.executeQuery(sql);//查询的方法executeQuery()--alt回车
//3.resultSet结果集对象
//4.迭代resultSet对象,每循环一次取结果中的一行
while(resultSet.next()){//如果结果集中有下一行就进入下一行
//在循环中。resultSet指向当前这行数据,然后一格一格的取出数据
int id=resultSet.getInt("id");
String name=resultSet.getString("name");
String age= resultSet.getString("age");
String phone = resultSet.getString("phone");
System.out.println(id+"t"+name+"t"+age+"t"+phone);
}
} catch (SQLException e) {
System.out.println("数据库连接失败");
e.printStackTrace();
}finally {
//5.挂掉电话=关闭连接:释放资源,因为连接数是有上限的,不是无限的
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
使用execute()方法执行SQL语句
该方法只是在不知道SQL语句类型的情况下使用
该方法执行SQL语句的返回值是boolean值,判断是否返回了ResultSet对象
statement提供了两种执行结果
1.getResultSet():获取该statement执行查询语句所返回的ResultSet()对象
2.getUpdateCount():获取该statement执行的DML语句所影响的行数
使用占位符?来代替相似的语句
insert into cainfly values(null,?,?);
注意的是:插入自增长的id时需要在prepareStatement(sql,Statement.Statement.RETURN_GENERATED_KEYS)
使用setXxx()里面插入的数据要和表中一一对应且要满足表中的约束
为了满足这种功能JDBC提供了prepareStatement接口
优点:1.预编译SQL语句,性能更好
2. 无需拼接SQL语句,编程更简单
3.可以防止SQL注入,安全性更好
package JDBCTEST;
import java.sql.*;
public class Test7 {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("加载驱动成功");
} catch (ClassNotFoundException e) {
System.out.println("加载驱动失败");
e.printStackTrace();
}
String url="jdbc:mysql://localhost:3306/test?userUnicode=true&characterEncoding=utf-8";
String user="root";
String pass="root";
Connection connection=null;
try {
connection= DriverManager.getConnection(url,user,pass);
System.out.println("数据库连接成功");
//connection.setAutoCommit(false);
String sql="select * from cainfly";
Statement statement = connection.createStatement();
//遍历结果集
System.out.println("旧的数据库内容");
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
int id=resultSet.getInt("id");
String name=resultSet.getString("name");
double balance=resultSet.getDouble("balance");
System.out.println("编号id:"+id+"t"+"姓名:"+name+"t"+"收入:"+"t"+balance);
}
//插入数据
String sql1="insert into cainfly(id,name,age,phone,balance) values(null,?,?,?,?)";
PreparedStatement s= connection.prepareStatement(sql1, Statement.RETURN_GENERATED_KEYS);
s.setObject(1,"刘鹏飞");
s.setObject(2,"25");
s.setObject(3,"99999999");
s.setObject(4,"100000");
s.executeUpdate();
//connection.commit();
sql="select *from cainfly";
Statement statement1 = connection.createStatement();
ResultSet rs = statement1.executeQuery(sql);
System.out.println("新的数据库内容");
while(rs.next()){
int id=rs.getInt("id");
String name=rs.getString("name");
double balance=rs.getDouble("balance");
System.out.println("编号id:"+id+"t"+"姓名:"+name+"t"+"收入:"+"t"+balance);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
三、JDBC的事务支持
JDBC连接事务由Connection提供,Connection默认打开自动提交==关闭事务
1.调用Connection的setAutoCommit()方法来关闭自动提交==开启事务
connection.setAutoCommit(false);
2.执行完所有的事务后可以调用Connection的commit()方法来提交事务
connection.commit();
3.如果任何一条SQL语句执行失败,可以调用Connection的rollback()方法来回滚事务
connection.rollback();
package JDBCTEST;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
//事务
public class Test4 {
public static void main(String[] args) {
String driver="com.mysql.jdbc.Driver";
try {
Class.forName(driver);
System.out.println("加载驱动成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("加载驱动失败");
}
String url="jdbc:mysql://localhost:3306/test?userUnicode=true&characterEncoding=utf-8";
String user="root";
String pass="root";
Connection connection=null;
try{
connection= DriverManager.getConnection(url,user,pass);
System.out.println("数据库连接成功");
//开启事务==关闭自动提交
connection.setAutoCommit(false);
Statement statement = connection.createStatement();
//主键1价格减去3000
String sql="update cainfly set balance=balance-3000 where id=1";
statement.executeUpdate(sql);
//主键2价格增加3000
sql="update cainfly set balance=balance+3000 where id=9";
statement.executeUpdate(sql);
//提交事务
connection.commit();
System.out.println("数据修改成功");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据库连接失败");
try {
//如果SQL发生错误,发生回滚
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
}
最后
以上就是聪明毛巾为你收集整理的JDBC典型用法一、JDBC4.2常用接口和类简介二、JDBC编程步骤三、JDBC的事务支持的全部内容,希望文章能够帮你解决JDBC典型用法一、JDBC4.2常用接口和类简介二、JDBC编程步骤三、JDBC的事务支持所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复