JDBC的一些基础认识,写的不是特别完善,希望大家看的时候别太介意嘿嘿嘿
JDBC
1,概念和本质
Java DataBase Connectivity Java 数据库链接, Java语言操作数据库
JDBC的本质:是一套操作所有关系型数据库的规则(接口)而JDBC所有的实现类,数据库驱动jar包,都由数据库的厂商自己实现。我们可以用这套接口进行编程,但真正执行的代码是驱动jar包的实现类。
## 2,快速入门
步骤
1,导入驱动jar包
网上搜一下,记得注意版本,不同数据库的版本是不一样的!2,注册驱动
Class.forName("com.mysql.jdbc.Driver");3,获取数据库链接对象 Connection
DriverManager类的静态方法getConnection获取Connection对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localgost(这里想主机名):3306(这里是端口号)/zhoupeng(数据库名)","root","root");4,定义sql语句
String sql="update book set `bauthor`='南派三叔' where `bid`='b1'";
这里sql语句后面不要加分号5,获取执行sql语句的对象 Statement
Connection对象调用createStatement方法,获取Statement对象
Statement statement = connection.createStatement();6,执行sql,接受返回结果
int i = statement.executeUpdate(sql);7,处理结果
System.out.println(i==1?"操作成功":"操作失败");8,释放资源
connection.close();
statement.close();
2,对象详解
1,DriverManager :驱动管理对象
功能
驱动注册
static void registerDriver(Driver driver)
向 DriverManager 注册给定驱动程序。写代码使用:Class.forName("com.mysql.jdbc.Driver");通过查看源码可知,com.mysql.jdbc.Driver 这个类中存在静态代码块如下
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}这里我们就会发现,实际上注册驱动的,是 DriverManager.registerDriver(new Driver()) 这句代码,所以在代码中,实际上进行注册的是 DriverManager 这个类
所以所谓的注册驱动,事实上是告诉程序,我们在使用哪个数据库
注意:
在mysql5之后的版本,这一步实际上是可以省略的!获取数据库连接
方法:
static Connection getConnection(String url , String user , String password);
参数:
url:指定连接的路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
例子:jdbc:mysql://localhost:3306/zhoupeng;
这里说一下,如果连接的是本地mysql,并且mysql的默认端口号是3306,那么url可以简写为:
jdbc:msyql:///数据库名;user:用户名
password:密码
2,Connection :数据库连接对象
功能
获取执行sql对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)管理事务
开始事务
viod setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务提交事务
viod commit()回滚事务
void rollback()
3,Statement :执行sql对象
执行sql:
int executeUpdate(String sql) ;
执行DML(增删改)语句,DDL(对表和库的操作)语句
但一般只用于DML语句
这个返回值,表示的是影响行数!我们可以通过影响的行数,判断DML语句有没有执行成功
ResultSet executeQuery(String sql)
执行DQL(select)语句
4,ResultSet :结果集对象,封装查询结果
方法:
boolean next() 游标向下移动一行
判断当前这一行是否有数据,有数据返回true
没有数据返回false
getXxx(参数):获取数据
XXX:代表数据类型,,比如:int getInt() String getString()
参数:
1, int : 代表列的编号,从1开始 如:getString(1)
2, String : 代表列的名称, 如: getInt("id")
遍历 ResultSet :
a1是 ResultSet 类型
for (; a1.next() ; ) {
System.out.println(a1.getString(1)+"----"+a1.getString(2)+"----"+a1.getString(3)+"----"+a1.getString(4));
}
5,PreparedStatement :功能更加强大的执行sql对象
SQL注入问题:在拼接sql时,有一些特殊的关键字参与字符串的拼接,会造成安全性问题!
如:登录问题,,输入用户名随便,然后密码输入 a' or '1' = '1
此时的sql语句会形成:
select * from user where 账号='随便输入' and 密码 = 'a' or 'a' = 'a';
解决sql问题,使用PreparedStatement来解决
PreparedStatement会预编译sql,参数使用?作为占位符
步骤:
步骤
1,导入驱动jar包
2,注册驱动
3,获取数据库链接对象 Connection
4,定义sql语句
注意:使用参数?作为占位符,比如
select * from user where `账号`=? and `密码` = ?;
5,获取执行sql语句的对象 PreparedStatement
Connection对象调用prepareStatement方法,获取PreparedStatement对象
PreparedStatement preparedStatement = c.prepareStatement(sql语句);
6,给?赋值
方法:sexXxx(参数1,参数2)
参数1,是?的位置,从1开始
参数2,是你要赋的值7,执行sql,接受返回结果
int i = statement.executeUpdate(sql);
或
ResultSet r = statement.executeQuery(sql);8,处理结果
System.out.println(i==1?"操作成功":"操作失败");
9,释放资源
注:后面基本都用的是PreparedStatement对象
两个好处:1,防止SQL注入
2,效率更高
JDBC的一些基础认识,写的不是特别完善,希望大家看的时候别太介意嘿嘿嘿的更多相关文章
- iOS开发UI基础—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- day08文件操作的三步骤,基础的读,基础的写,with...open语法,文件的操作模式,文件的操作编码问题,文件的复制,游标操作
复习 ''' 类型转换 1.数字类型:int() | bool() | float() 2.str与int:int('10') | int('-10') | int('0') | float('-.5 ...
- Jmeter使用基础笔记-写一个http请求
前言 本篇文章主要讲述2个部分: 搭建一个简单的测试环境 用Jmeter发送一个简单的http请求 搭建测试环境 编写flask代码(我参考了开源项目HttpRunner的测试服务器),将如下的代码保 ...
- 老哥你能写篇 SpringCloud Alibaba 全家桶吗? 看视频太累 太枯燥了 !
最喜欢的一句话: 1.01的365次方=37.78343433289 >>>1 0.99的365次方= 0.02551796445229, 每天进步一点点的目标,贵在坚持 前端时间有 ...
- Swift基础之OC文件调用Swift代码(在上次的基础上写的)
前两天刚写过Swift调用OC,今天在原来的基础上,实现OC调用Swift. 首先,创建一个OneSwiftFile.swift文件,创建一个继承于NSObject的类(这个地方你可以自己选择继承的父 ...
- Python学习宝典,Python400集让你成为从零基础到手写神经网络的Python大神
当您学完Python,你学到了什么? 开发网站! 或者, 基础语法要点.函数.面向对象编程.调试.IO编程.进程与线程.正则表达式... 当你学完Python,你可以干什么? 当程序员! 或者, 手写 ...
- JDBC一(web基础学习笔记七)
一.JDBC Java数据库的连接技术(Java DataBase Connectivity),能实现Java程序以各种数据库的访问 由一组使用Java语言编写的类和接口(JDBC API)组成,它j ...
- Java基础之写文件——从多个缓冲区写(GatheringWrite)
控制台程序,使用单个写操作将数据从多个缓冲区按顺序传输到文件,这称为集中写(GatheringWrite)操作.这个功能的优势是能够避免在将信息写入到文件中之前将信息复制到单个缓冲区中.从每个缓冲区写 ...
- Java基础之写文件——将素数写入文件中(PrimesToFile)
控制台程序,计算素数.创建文件路径.写文件. import static java.lang.Math.ceil; import static java.lang.Math.sqrt; import ...
随机推荐
- count(*), count(1), count(列名)的区别
1.从结果上来看 count(1)和count(*)之间没有区别,因为count(*)count(1)都不会去过滤空值,但count(列名)就有区别了,因为count(列名)会去过滤空值. 2.从执行 ...
- 关于Jenkins-Item-Office 365 Connector-下的多选框的参数定义
在Jenkins的Item中Office 365 Connector下,我们有时会使用到,多选框(复选框),目的是可选择多个多个条目赋值给指定的变量 然后在Build Triggers中可以进行引用, ...
- Docker | 镜像浅析,以及制作自己的镜像
分层下载,docker image 的核心: 联合文件系统 镜像是什么 镜像就是一个轻量的.独立的软件包.用来打包运行环境和基于运行环境开发的软件.它包含软件运行所需的所有内容(包括代码.运行时.库. ...
- Vue3解决ElementPlus Drawer或弹出对话框不生效的问题
第一时间检查你是否还在使用 :visible.sync="drawer" 来绑定事件框的隐藏和显示,vue3.0 已经更改为通过 v-model 来绑定事件框的显示与隐藏.
- redis 分布式锁 PHP
redis分布式 1.redis是单线程操作 2.分布式会出现的问题,死锁 3.redis分布式(集群).多台服务器里面都有多个单机redis.然后这些redis之间相互链接.还有查看各个单台服务器之 ...
- 齐博x1如果把万能表单直接插入到内容中去
很多时候,你创建了一个万能表单可能像下面这个情况,在文章中加一个链接叫别人点击填表,其实这个很不人性化,用户也容易忽略. 其实你完全可以像下面这样,把表单直接引用到文章中来.给用户更直观的感觉 那是如 ...
- 8.pygame-定时器
使用定时器添加敌机 游戏启动后,每隔一秒出现一架敌方飞机 每架飞机向屏幕下方飞行,速度各不相同 没加敌机出现的水平位置也不进相同 当敌机从屏幕下方飞出,不会再飞回到屏幕中 定时器 pygame中使 ...
- 【React】学习笔记(二)——组件的生命周期、React脚手架使用
原教程视频:ttps://www.bilibili.com/video/BV1wy4y1D7JT?p=2&spm_id_from=pageDriver 目录 一.组件的生命周期 1.1.生命周 ...
- Python 学习思路 思维导图 Xmind
如果需要,请在评论区留下邮箱,我看到后会一次发送.
- SpringBoot使用poi实现导出excel
//实体类 //导出的数据的实体 public class User { private String id; private String name; private String year; // ...