当前位置:网站首页>JDBC看这篇就够了
JDBC看这篇就够了
2022-07-06 09:23:00 【想要进大厂】
前言
学了Mysql数据库后,花了两天时间学习了一下JDBC的使用,这里整理了一下笔者对jdbc的理解(注:本文所有代码针对Mysql数据库进行编码)
提示:以下是本篇文章正文内容,下面案例可供参考
一、JDBC是什么?
JDBC是SUN公司制定的一套接口,接口都有调用者和实现者,面向接口调用、面向接口写实现类、这都属于面向接口编程。
二、JDBC原理图
JDBC API是一系列的接口,它统一和规范了应用程序与数据库的连接,执行SQL语句,并得到返回结果等各类操作,相关类和接口在java.sql和javax.sql包中
三、JDBC的使用步骤
JDBC导入mysql驱动文件
(1) 在Mysql官网下载相应的驱动jar包,根据自己使用的mysql版本选择合适的版本进行下载,如果是Mac本,选择tar.gz文件下载,如果是win系统,选择zip文件下载,最后进行解压即可
(2)在IEDA中导入驱动文件
然后选择
这样就完成了对Mysql数据库驱动文件进行导入
四、JDBC编码步骤
1.注册驱动,获取连接
创建数据库连接的方式有五种,我简单的介绍一下
Driver接口的方法:
Connection | connect(String url, Properties info) 尝试使数据库连接到给定的URL |
返回的connect对象就是连接数据的对象
第一种方式:
public void connect01() throws SQLException {
//注册驱动
Driver driver = new Driver();
//jdbc:mysql://是规定好的协议,localhost:3306代表本机 和监听的端口,xyx_db02表示连接到xyx_db02这张表
String url = "jdbc:mysql://localhost:3306/xyx_db02";
//将 用户名 和 密码 放入到 Properties 对象中
Properties properties = new Properties();
properties.setProperty("user","root"); //用户 ,properties(key,value) key是规定好的 "user"
properties.setProperty("password","123"); //密码
Connection connect = driver.connect(url, properties); //返回一个连接
System.out.println(connect);
}
第二种方式:通过java的反射机制加载Driver类
public void connect02() throws Exception {
//使用反射加载Driver类 ,动态加载,更加的灵活,减少依赖性
Class<?> cls = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) cls.newInstance();
String url = "jdbc:mysql://localhost:3306/xyx_db02";
//将 用户名 和 密码 放入到 Properties 对象中
Properties properties = new Properties();
properties.setProperty("user","root"); //用户 ,properties(key,value) key是规定好的 "user"
properties.setProperty("password","123"); //密码
Connection connect = driver.connect(url, properties); //返回一个连接
System.out.println("方式二"+connect);
}
第三种方式:通过 DriverManager类的registerDriver方法传入driver对象完成对数据库的连接
static Connection | getConnection(String url, String user, String password) 尝试建立与给定数据库URL的连接 |
public void connect03() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
//使用反射加载Driver
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
//创建url 和 user 和password
String url = "jdbc:mysql://localhost:3306/xyx_db02";
String user = "root";
String password = "xuyuxuan0724";
DriverManager.registerDriver(driver); //注册Driver驱动
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("第三种方式= " + connection);
}
第四种方式:Class.forName()方法,自动完成注册驱动
public void connect4() throws ClassNotFoundException, SQLException {
//com.mysql.jdbc.Driver
//使用反射加载Driver类
Class.forName("com.mysql.jdbc.Driver");
//创建url 和 user 和password
String url = "jdbc:mysql://localhost:3306/xyx_db02";
String user = "root";
String password = "xuyuxuan0724";
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("第四种方式 = " +connection);
}
这里两点需要说明:
1.Mysql驱动5.1.6之后可以无需Class.forName("com.mysql.jdbc.Driver");
2.从jdk1.5使用了jdbc4,不再需要显示调用Class.forName()注册驱动,而是自动调用驱动jar包下META-INF\services\java.sql.Driver文本中的类名称去注册
第五种方式:写入配置文件,让mysql连接更灵活,减少代码冗余
public void connect05() throws IOException, ClassNotFoundException, SQLException {
//通过Properties对象获取相关配置文件的信息
Properties properties = new Properties();
properties.load( new FileInputStream("src//mysql.Properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式五 " +connection);
}
DriverManager不调用registerDriver()方法传入driver是为什么?
是因为在类加载的时候,Driver类底层的static代码块中已经调用了该方法,是自动注册驱动
这里附上Driver类的底层源码:
public class Driver extends NonRegisteringDriver implements java.sql.Driver{
static {
try{
java.sql.DriverManager.registerDriver(new Driver());
} catch(SQLException E) {
throw new RuntomeExceptione("Can't register driver!");
}
}
好了,相信小伙伴看到这里,对JDBC连接数据库的方式有了一个大概的认识,这里我们进入下一个步骤
2.组织SQL语句
String sql = "Update actor set name = '周星驰' ";
//用于操作 sql语句
Statement statement = connect.createStatement(); //
int rows = statement.executeUpdate(sql); //如果是 dml语句 返回的就是影响的行数
System.out.println(rows >0 ?"成功":"失败"); // 1
代码测试过,返回的是成功;
这里有一个问题,Statement类在开发中是不允许使用的,因为它存在一个SQL注入问题,我们来看一个典型的SQL注入问题:
如果我们使用select语句,这里会判断where后面的sql语句,我们原本想要查询的数据 name ='tom',pwd='123',而上图的sql语句就相当于写了个万能条件语句,name='1' 或者 pwd = ' 或者'1=1',这里显然是可以查询出我们想要的数据的,据说在2000年左右,因为sql注入问题让很多企业损失惨重,后面这个问题才被解决
这里我们介绍一下Statement类
Statement类
基本介绍:
1.用于执行静态Sql语句并返回其生成结果
2.在连接建立后,需要对数据库进行访问,执行命名或是SQL语句,可以通过Statement(存在SQL注入问题)PrepardStatement(预处理) CallableStatement(存储过程)
3.Statement对象执行SQL语句,存在SQL注入风险
4.SQL注入是利用某些系统没有对用户输入对数据进行充分对检查,而在用户输入数据中注入非法对SQL语句段或命令,恶意攻击数据库
5.要防范SQL注入,只要用PreparedStatement(从Statement扩展而来),取代Statement就可以了
聊到select语句,在这里介绍一下ResultSet类
ResultSet类
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet
对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next
方法将光标移动到下一行,并且由于在ResultSet
对象中没有更多行时返回false
,因此可在while
循环中使用循环来遍历结果集。
我们来看一下ResultSet底层
rows所有行,是一个ArrayList数组,internalRowDate是一个对象数组,每个对象数组包含各行的数据,比如说0对应的是49是id为1的ASCll码,1对应的name中的‘周星驰‘,UTF-8中每一个汉字占三个字节,所以对应了九个ascll码以此类推
由于只是测试,表我们已经建好了
mysql> select * from actor; +----+-----------+-----+---------------------+-------+ | id | name | sex | borndate | phone | +----+-----------+-----+---------------------+-------+ | 1 | 周星驰 | 男 | 1970-11-11 00:00:00 | 110 | | 3 | 刘德华 | 男 | 1970-12-12 00:00:00 | 110 | | 4 | 吴孟达 | 男 | 1969-01-01 00:00:00 | 1231 | +----+-----------+-----+---------------------+-------+
//1.注册驱动
Class.forName(driver);
//2.得到连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.得到Statement
Statement statement = connection.createStatement();
//4.组织sql语句
String sql = "select id,name,sex,borndate from actor";
//执行给定的sql语句,该语句返回单个 ResultSet对象
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){ //会让光标向后移动,如果没有更多行,则会返回false
int id = resultSet.getInt(1);//获取该行第一列数据
String name = resultSet.getString(2); //获取该行第二列数据
String sex = resultSet.getString(3);//获取该行第三列数据
Date date = resultSet.getDate(4);
System.out.println(id+"\t"+name+"\t"+sex+"\t"+date);
}
返回结果为:
3.关闭资源
在JDBC编码过程中,我们创建了resultSet,statement,connection等资源,这些资源在使用完毕后一定要进行关闭资源,关闭的过程中遵循从里到外的原则,因为在增删改查中的操作中都要用到这样的关闭操作
resultSet.close();
statement.close();
connection.close();
下面附上关于select查询语句的完整代码:
import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
@SuppressWarnings({"all"})
public class ResultSet_ {
public static void main(String[] args) throws Exception {
//通过Properties对象获取相关配置文件的信息
Properties properties = new Properties();
properties.load( new FileInputStream("src//mysql.Properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
//1.注册驱动
// Class.forName(driver);
//2.得到连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.得到Statement
Statement statement = connection.createStatement();
//4.组织sql语句
String sql = "select id,name,sex,borndate from actor";
//执行给定的sql语句,该语句返回单个 ResultSet对象
ResultSet resultSet = statement.executeQuery(sql);
//5.使用while取出数据
/*
mysql> select * from actor;
+----+-----------+-----+---------------------+-------+
| id | name | sex | borndate | phone |
+----+-----------+-----+---------------------+-------+
| 1 | 周星驰 | 男 | 1970-11-11 00:00:00 | 110 |
| 3 | 刘德华 | 男 | 1970-12-12 00:00:00 | 110 |
| 4 | 吴孟达 | 男 | 1969-01-01 00:00:00 | 1231 |
+----+-----------+-----+---------------------+-------+
*/
while (resultSet.next()){ //会让光标向后移动,如果没有更多行,则会返回false
int id = resultSet.getInt(1);//获取该行第一列数据
String name = resultSet.getString(2); //获取该行第二列数据
String sex = resultSet.getString(3);//获取该行第三列数据
Date date = resultSet.getDate(4);
System.out.println(id+"\t"+name+"\t"+sex+"\t"+date);
}
//6.关闭资源
resultSet.close();
statement.close();
connection.close();
}
}
JDBC编程的内容就这些了,如果你已经全部掌握,还有事务,获取自增,连接池等等内容可以自行了解一下
边栏推荐
- Callback function ----------- callback
- Interpretation of iterator related "itertools" module usage
- 强化学习基础记录
- 7-1 output all primes between 2 and n (PTA programming)
- 7-8 7104 约瑟夫问题(PTA程序设计)
- HackMyvm靶機系列(3)-visions
- 【MySQL-表结构与完整性约束的修改(ALTER)】
- [experiment index of educator database]
- 7-9 制作门牌号3.0(PTA程序设计)
- Record once, modify password logic vulnerability actual combat
猜你喜欢
HackMyvm靶機系列(3)-visions
HackMyvm靶机系列(5)-warez
How to understand the difference between technical thinking and business thinking in Bi?
Hackmyvm target series (2) -warrior
攻防世界MISC练习区(gif 掀桌子 ext3 )
Intel oneapi - opening a new era of heterogeneity
内网渗透之内网信息收集(二)
Renforcer les dossiers de base de l'apprentissage
Hackmyvm target series (7) -tron
强化学习基础记录
随机推荐
强化学习基础记录
Mixlab unbounded community white paper officially released
网络基础详解
实验七 常用类的使用
Callback function ----------- callback
[VMware abnormal problems] problem analysis & Solutions
SQL注入
7-14 error ticket (PTA program design)
7-9 制作门牌号3.0(PTA程序设计)
7-15 h0161. Find the greatest common divisor and the least common multiple (PTA program design)
[paper reproduction] cyclegan (based on pytorch framework) {unfinished}
记一次,修改密码逻辑漏洞实战
Middleware vulnerability recurrence Apache
Using qcommonstyle to draw custom form parts
7-11 mechanic mustadio (PTA program design)
HackMyvm靶机系列(3)-visions
Intensive literature reading series (I): Courier routing and assignment for food delivery service using reinforcement learning
Spot gold prices rose amid volatility, and the rise in U.S. prices is likely to become the key to the future
Matlab opens M file garbled solution
实验六 继承和多态