持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解JDBC,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan
JDBC最快上手笔记
JDBC是什么
JDBC是
Java DataBase Connectivity(Java语言连接数据库)
JDBC的本质
JDBC是SUN公司制定的一套接口(interface)
java.sql.*;(位于这个包下)
'本质就是接口
JDBC开发前的准备工作
1、现在对应点数据库官网上下载对应的驱动(jar包)
2、将其配置到环境变量classpath中
注意,在配置classpath的时候,最前方一定要定位到当前目录,也是在路径前方先配置'.;',再配置jar包路径
例如
classpath=.;D:\JDBC\\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar
以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。
IDEA有自己的配置方式。
JDBC编程六步《核心内容》
'第一步
注册驱动(意在告诉Java程序,即将要连接那个数据库)
'第二步
获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信)
'第三步
获取数据库的操作对象(专门执行sql语句的对象)
'第四步
执行SQL语句(DQL DML......)
'第五步
处理查询结果集(只有当第四步执行的是select语句的时候,才会进行第五步)
'第六步
释放资源(使用完自资源以后一定要进行关闭,Java和数据库属于进程间的通信,开启以后一定要关闭)
第一步、连接驱动
1、连接驱动使用
java.sql;包下的'Driver接口
Driver.Manage.registerDriver(Driver对象);
接口对象不能直接new出来,每一个数据库的jar包里都有一个类实现了Driver接口,以mysql为例:
'连接mysql数据库驱动
Driver.Manger.registerDriver(new com.mysql.jdbc.Driver());
//因为com.mysql.jdbc.Driver这个类实现了Driver接口!!!
将以上代码进行拆分;
java.sql.Driver driver = new com.mysql.jdbc.Driver();//注意导包
Driver.Manger.registerDriver(driver);
'异常处理:
注意:RegisterDriver这个方法需要处理异常;SQLException(受检异常需要处理,上抛不合适)
2、利用反射机制来连接驱动
Class.forName(类的位(com.mysql.jdcb.Driver)));
'此处有异常,ClassNotFoundException'
第二步、获取连接
getConnection方法
1、getConnection
public static Connection getConnection(String url,
Properties info)
throws SQLException试图建立到给定数据库 URL 的连接。DriverManager 试图从已注册的 JDBC 驱动程序集中选择一个适当的驱动程序。
参数:
url - jdbc:subprotocol:subname 形式的数据库 url
info - 作为连接参数的任意字符串标记/值对的列表;通常至少应该包括 "user" 和 "password" 属性
返回:
a 到 URL 的连接
抛出:
SQLException - 如果发生数据库访问错误
1、调用getConnection()方法
例子:
String url = "jdbc:mysql://ip(ip地址):port(端口号)/bjpowernode";
String user = "root";
String password = "666";
Connection conn = DriverManager.getConnection(url,user,password);
/*System.out.println("数据库连接对象"+conn);
数据库连接对象com.mysql.jdbc.JDBC4Connection@5a01ccaa*/
URL
URL:统一资源定位符(网络中某个资源的绝对路径)
包括:
协议
IP
PORT
资源名
例如:
'https://www.baidu.com/ 这就是一个URL
'https://ip:port/资源名
第三步、获取数据库操作对象
createStatement方法
createStatement
Statement createStatement()
throws SQLException创建一个 Statement 对象来将 SQL 语句发送到数据库。不带参数的 SQL 语句通常使用 Statement 对象执行。如果多次执行相同的 SQL 语句,使用 PreparedStatement 对象可能更有效。
使用返回的 Statement 对象创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。已创建结果集的可保存性可调用 getHoldability() 确定。
返回:
一个新的默认 Statement 对象
抛出:
SQLException - 如果发生数据库访问错误,或者在关闭的连接上调用此方法
StateMent专门用来执行SQL语句的
StateMent statement = conn.creatStatement();
'切记处理异常'
第四步、执行SQL语句
executeUpdate方法
executeUpdate
int executeUpdate(String sql)
throws SQLException执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
参数:
sql - SQL 数据操作语言(Data Manipulation Language,DML)语句,如 INSERT、UPDATE 或 DELETE;或者不返回任何内容的 SQL 语句,如 DDL 语句。
返回:
(1) 对于 SQL 数据操作语言 (DML) 语句,返回行计数 (2) 对于什么都不返回的 SQL 语句,返回 0
抛出:
SQLException - 如果发生数据库访问错误,在已关闭的 Statement 上调用此方法,或者给定的 SQL 语句生成 ResultSet 对象
String sql = "SQL语句";
(下面这个是专门执行DML语句的(insert delete update))
int count = stmt.executeUpdate(sql);
'返回值是影响数据库中的记录条数
System.out.println(count == "记录条数" ? "执行成功":"执行失败");
记录条数与实际的进行比较来判读是否更新成功
第五步、处理查询结果集
ResultSet rs = stmt.updateQuery(sql语句);
将结果依次取出:
' rs.getString|Int|Double(最终查询的列名);
'while(rs.next())判断是否存在下一行元素
第六步、释放资源
写在finally语句块中,来保证一定个关闭
'注意关闭顺序,先小后大依次关闭
finally{
}
栗子 :执行一个insert语句
import java.sql.*;
public class JDBCTest01{
public static void main(String []args){
//把这两个定义在外边,是为了在finally语句块中能够使用到
//如果定义在try语句块中,则其范围就仅限在try语句块中,在finally语句块中使用不到
Connection conn = null;
Statement stmt = null;
try{
//1、注册驱动
/*static void registerDriver(Driver driver)
向 DriverManager 注册给定驱动程序。*/
Driver driver = new com.mysql.jdbc.Driver();//注意此处的路径,是在SQl的包中找的
DriverManager.registerDriver(driver);
//2、获取连接
String url = "jdbc:mysql://localhost:3306/jinhuan";
String user = "root";
String password = "666";
conn = DriverManager.getConnection(url,user,password);
//合并conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jinhuan","root","666");
/*System.out.println("数据库连接对象"+conn);
数据库连接对象com.mysql.jdbc.JDBC4Connection@5a01ccaa*/
//3、连接数据库对象
stmt = conn.createStatement();
//4、执行SQL语句
//此处的sql语句以字符串的形式用双引号括起来,但是
//SQL语句没有分号!!
String sql = "insert into dept(deptno,dname,loc) values(9999,'尽欢','jinhuan')";
int count = stmt.executeUpdate(sql);
System.out.println(count == 1 ? "执行成功":"执行失败");
//5、处理查询结果集
//6、释放资源
}
catch(SQLException e){
e.printStackTrace();//打印异常信息
}finally{
try{
if(conn != null){//注意在这里进行判断,只对不为空的进行处理
conn.close();
}
}
catch(SQLException e){
e.printStackTrace();
}
//注意在这里分开try的原因是为了防止当最上面那一个出现异常的时候,下面的代码块不执行
try{
if(stmt != null){
stmt.close();
}
}
catch(SQLException e){
e.printStackTrace();
}
}
}
}
栗子:执行一个删除语句
import java.sql.*;
public class JDBCTest02 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
// 1、注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// 2、获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jinhuan","root","666");
// 3、获取数据库操作对象
stmt = conn.createStatement();
// 4、执行SQl语句
String sql = "delete from dept where deptno = '99'";
int count = stmt.executeUpdate(sql);
System.out.println(count == 1 ? "删除成功!" : "删除失败!");
}catch(SQLException e){
e.printStackTrace();
}finally {
try{
if (stmt != null) {
stmt.close();
}
}catch (SQLException e){
e.printStackTrace();
}
try{
if (conn != null) {
conn.close();
}
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
SQl注入
用户输入的信息中含有SQL的关键字,而且这些关键字参与了sql的编译过程
'怎么解决
使用preparedStatement接口
2、位符
1、赋值
实例
import java.util.*;
import java.sql.*;
public class JdbcTest03{
public static void main(String []args){
//定义接口
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
//注册驱动
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
//获取连接
try{
//连接数据库对象
String url = "jdbc:mysql://localhost:3306/jinhuan";
String user = "root";
String password = "666";
conn = DriverManager.getConnection(url,user,password);
//获取数据库操作对象
String sql = "select ename from emp";
ps = conn.prepareStatement(sql);
//执行SQL语句
rs = ps.executeQuery();
//处理查询结果集
while(rs.next()){
System.out.println("ename = "+rs.getString("ename"));
}
}catch(SQLException e){
e.printStackTrace();
}finally{
//释放资源
try{
if(rs != null){
rs.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(ps != null){
ps.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(conn != null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
事务
事务提交机制
禁用自动提交并开启事务:
setAutoCommit
void setAutoCommit(boolean autoCommit)
throws SQLException将此连接的自动提交模式设置为给定状态。如果连接处于自动提交模式下,则它的所有 SQL 语句将被执行并作为单个事务提交。否则,它的 SQL 语句将聚集到事务中,直到调用 commit 方法或 rollback 方法为止。默认情况下,新连接处于自动提交模式。
提交发生在语句完成时。语句完成的时间取决于 SQL 语句的类型:
对于 DML 语句(比如 Insert、Update 或 Delete)和 DDL 语句,语句在执行完毕时完成。
对于 Select 语句,语句在关联结果集关闭时完成。
对于 CallableStatement 对象或者返回多个结果的语句,语句在所有关联结果集关闭并且已获得所有更新计数和输出参数时完成。
注:如果在事务和自动提交模式更改期间调用此方法,则提交该事务。如果调用 setAutoCommit 而自动提交模式未更改,则该调用无操作(no-op)。
参数:
'autoCommit - 为 true 表示启用自动提交模式;为 false 表示禁用自动提交模式
抛出:
SQLException - 如果发生数据库访问错误,在参与分布式事务的同时调用 setAutoCommit(true),或者在关闭的连接上调用此方法
另请参见:
getAutoCommit
boolean getAutoCommit()
throws SQLException获取此 Connection 对象的当前自动提交模式。
返回:
此 Connection 对象的自动提交模式的当前状态
抛出:
SQLException - 如果发生数据库访问错误,或者在关闭的连接上调用此方法
另请参见:
getAutoCommit(), setAutoCommit(boolean)
好啦,关于jdbc的分享就到这里了。最后别忘啦支持一下博主哦,求三连!❤️❤️❤️