课堂笔记【java JDBC】
目录
JDBC简介
JDBC:JDBC在应用程序与数据库之间起到了一个桥梁作用,当应用程序使用JDBC访问特定的数据库时,只需要通过不同的数据库驱动与其对应的数据库进行连接,连接后即可对该数据库进行相应的操作。
工作原理:

工作过程:

JDBC驱动与连接
JDBC驱动
由JDBC驱动直接访问数据库
优点:纯java,快,跨平台
缺点:访问不同的数据库需要下载专用的JDBC驱动
连接JDBC驱动
1.下载特定数据库的JDBCjar包
到使用的数据库的官网上下载,本文会提供mysql-connector-java-5.1.39-bin.jar jar包
2.加载并注册数据库驱动
方法一:写代码(只用于一次程序,不推荐)
//Class.forName("Driver全名");
Class.forName("com.mysql.jdbc.Driver");//以mysql数据库为例
方法二:将jar包复制到java运行环境jre文件中(适用于JDBC4.0以后)
(1)找到java文件,将jar包放到jdk下,jre下,lib下,ext中。
(2)找到java文件,将jar包放到jre下,lib下,ext中。
注意:如果使用第三方软件编程(如:eclipse)则一定要复制jar包到公共jre中



3.连接驱动
(1)getConnection方法详解
DriverManager.getConnection(String url,String user,String password);
/*url:定位符,找到本机数据库
*jdbc:数据库服务名://主机名:端口号/创建的数据库名*/
//user:连接数据库时登录的用户名
//password:连接数据库时的登录密码
//例:
//1、加载并注册数据库驱动。
Class.forName("com.mysql.jdbc.Driver");
//2、通过DriverManager获取数据库连接。
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
JDBC常见API
1.Driver:Driver接口是所有JDBC驱动程序必须实现的接口,用于加载驱动。一次程序的运行中,只需要加载一次。
2.DriverManager:使用该类注册驱动
3.Connection:连接数据库的对象
4.Statement:执行静态的SQL语句,并返回一个结果对象(繁琐,不安全)
5.ResultSet:结果集对象(封装了查询结果的数据)
6.PreparedStatement:Statement的子接口,用于执行预编译的SQL语句。(也是通过Connection进行获取)
JDBC数据查询
一般查询
1.接口详解
一般查询需要JDBC API中的Statement接口与ResultSet接口
Statement接口:
(1)由Connection产生;
(2)Statement对象用于将SQL语句发送到数据库中;
(3)在JDBC API 中通常有3种Statement对象,它们都可以作为在给定连接上执行SQL语句的容器。
| Statement | 用于无参数的查询 |
|
PreparedStatement (预编译SQL语句) |
用于带参数的查询,当SQL语句多次运行,使用该对象可提高运行效率。 |
| CallableStatement | 用于调用存储过程 |
(4)Statement与PreparedStatement对象的创建
//使用Connection对象的createStatement方法,创建Statement对象(conn为Connection对象)
Statement stmt=conn.createStatement();
//使用Connection对象的prepareStatement方法,创建PreparedStatement对象
PreparedStatement pstmt =conn.prepareStatement("要执行的SQL语句");
(5)Statement对象的方法
//适用于执行select语句
public ResultSet executeQuery()throws SQLException;
//适用于执行insert,update,delete等数据修改和维护语句
public 行数 executeUpdate(String sql)throws SQLException;
ResultSet接口:
(1)ResultSet对象用于包含符合SQL语句中条件的所有记录,它的组织结构类似于一张临时表。
(2)ResultSet接口自带游标,只有使用next()方法才可使游标转到ResultSet对象中的第一行。
(3)getXxx()方法,用于返回当前行中指定列索引columnNumber或列名字columnName的数据。
/*语法:
XXX getXXX (int columnNuber);
XXX getXXX (String columnName);*/
//例:
int id =resultSet.getInt("id");
String name=resultSet.getString("name");
(4)close()用于关闭ResultSet对象
2.一般查询示例程序
(1)一般查询执行步骤

(2)一般查询执行程序(以mysql为例)
public static void main(String[] args) {
try {
//1.注册驱动(已将JDBC Driver jar包放入ext文件中可不写)
Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接对象
//如果对象是主机,并端口号是默认值:3306,url可简写:"jdbc:mysql:///jdbc"
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.获取SQL语句的执行对象
//此处使用Statement接口的子接口PreparedStatement更安全
PreparedStatement pstmt=conn.prepareStatement("select*from users");
//4.执行SQL语句,调用executeQuery查询方法
ResultSet resultSet=pstmt.executeQuery();
//5.处理结果集
while(resultSet.next()){//next方法返回值为boolean类型
int id =resultSet.getInt("id");//getXxx方法:可以根据列号与列名获取
String name=resultSet.getString("name");
String password=resultSet.getString(3);
String email=resultSet.getString(4);
System.out.println(id+" "+name+" "+password+" "+email);
}
//6.关闭流释放资源
conn.close();
pstmt.close();
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
}
JDBC数据维护
会使用到的Statement的方法
//适用于执行insert,update,delete等数据修改和维护语句
public 行数 executeUpdate(String sql)throws SQLException;
数据维护一般流程

更新数据
例1:
public static void main(String[] args) throws Exception {
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.获取SQL语句的执行者
PreparedStatement pstmt=conn.prepareStatement("UPDATE users SET NAME='tc' WHERE id=?");
//给占位符进行填充数据
pstmt.setObject(1, "1");//
//4.执行SQL语句
int count=pstmt.executeUpdate();//返回值是int数组
//5.处理结果集
if(count>0){
System.out.println(count+"行受到影响");
}else{
System.out.println("更改失败");
}
//6.释放资源
conn.close();
pstmt.close();
}
例2:
String sql="update users set email='ef@.com' where name='ert'";
插入数据
1.插入单条记录
请回顾Statement接口详解
例1:
public static void main(String[] args) {
try{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.准备insert SQL语句
String sql="INSERT INTO users(name,password,email,birthday) VALUES(?,?,?,?)";
//4.设置参数,注意所使用的参数的数据类型
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setString(1, "cm");pstmt.setString(2, "1234556");
pstmt.setString(3, "228567@qq.com");
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );//设置日期格式
java.util.Date date = sdf.parse( "2002-5-6" );//设置日期参数
long lg = date.getTime(); // 日期 转 时间戳
pstmt.setDate(4, new java.sql.Date( lg ));
//5.执行SQL语句
int count=pstmt.executeUpdate();
//6.判断执行结果,返回值大于1则成功插入一条数据
if(count>0){
System.out.println("记录成功");
}else{
System.out.println("记录失败");
}
conn.close();
pstmt.close();
}catch(Exception e){
e.printStackTrace();
}
}
例2:
public static void main(String[] args) {
try{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.准备insert SQL语句
String sql="insert into users(name,password,email,birthday) values('wm','123456','wer@.com','1984-05-17');";
PreparedStatement pstmt=conn.prepareStatement(sql);
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );//设置日期格式
java.util.Date date = sdf.parse( "2002-5-6" );//设置日期参数
long lg = date.getTime(); // 日期 转 时间戳
pstmt.setDate(4, new java.sql.Date( lg ));
//4.执行SQL语句
int count=pstmt.executeUpdate();
//5.判断执行结果,返回值大于1则成功插入一条数据
if(count>0){
System.out.println("记录成功");
}else{
System.out.println("记录失败");
}
//6.关闭接口
conn.close();
pstmt.close();
}catch(Exception e){
e.printStackTrace();
}
}
2.批量插入数据
采用批量提交的方式,使用addBatch(String sql)方法添加批量操作SQL语句,然后用executeBath()方法对所提交的多个SQL语句进行批量操作。
注:批量操作只适用于DML(增删改操作)
Satement对象的executeBath()方法
public int[] executeBatch() throws SQLException;//该语句不能执行具有返回结果集的SQL语句
//例:
public static void main(String[] args) throws Exception {
//1.加载驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.准备3个插入SQL语句
String sql="INSERT INTO users(name,password,email)VALUES(?,?,?)";
//4.创建PreparedStatement对象
PreparedStatement pstmt=conn.prepareStatement(sql);
//5.设置参数
pstmt.setString(1, "jdh");
pstmt.setString(2, "3452");
pstmt.setString(3, "32438@.com");
//6.添加一次预定义参数
pstmt.addBatch();
//7.设置参数
pstmt.setString(1, "jdsh");
pstmt.setString(2, "34322");
pstmt.setString(3, "132438@.com");
//8.再添加一次预定义参数
pstmt.addBatch();
//9.批量执行预定义SQL
int []count=pstmt.executeBatch();
//10.判断执行结果,返回值大于1则成功插入一条数据
if(count[0]>0){
System.out.println("记录成功");
}else{
System.out.println("记录失败");
}
//11.关闭流
conn.close();
pstmt.close();
}
删除数据
例1:
public static void main(String[] args) throws Exception {
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.准备DELETE SQL语句
String sql="DELETE FROM users WHERE id=?";
//4.使用Connection接口的prepareStatement方法创建PreparedStatement对象
//将SQL语句发送到数据库中
PreparedStatement ps=conn.prepareStatement(sql);
//5.设置参数
ps.setString(1,"1");
//6.//执行SQL语句
int ret=ps.executeUpdate();
//7.//判断执行结果
if(ret>0){
System.out.println("记录删除成功!!");
}else{
System.out.println("记录删除失败!!");
}
//8.关闭Connection和PreparedStatement对象
conn.close();
ps.close();
}
例2:
String sql="delete from users where name='tsa'";
拓展
JDBC中设置Date类型参数
1.手动设置时间
PreparedStatement 的 setDate 方法使用的是 java.sql.Date 类型的日期参数。
设置这种参数的方法,例子:
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );//设置时间格式
java.util.Date date = sdf.parse( "2015-5-6 10:30:00" );//设置时间
long lg = date.getTime(); // 日期 转 时间戳
PreparedStatement pst = conn.prepareStatement(sql); // 创建 PreparedStatement 对象
ps.setDate( 3, new java.sql.Date( lg ) );
2.自动获取本地时间
如果要在java代码中向数据库插入数据,可使用TimeStamp对象:创建java.util.Date对象,转换成TimeStamp对象(java.sql.Date对象不能保存时间,utils的可以)插入数据库(TimeStamp继承自java.sql.Date,数据库中自动转换成Date)
(1)ps.setTimestamp(1, new java.sql.Timestamp(System.currentTimeMillis()));
(2)java.sql.Date date = new java.sql.Date(System.currentTimeMillis());//获取当前时间
java.util.Date date = new java.util.Date(); // 获取一个Date对象
Timestamp timeStamp = new Timestamp(date.getTime());
// 将日期时间转换为数据库中的timestamp类型
pstmt.setTimestamp(2, timeStamp);
注:本文参考:杨夏老师的《java核心技术》课程、王敏老师的《java高级开发》课程、Java 2 实用教程(耿祥义)、网络上的资料。
课堂笔记【java JDBC】的更多相关文章
- 线程(java课堂笔记)
1.两种方式的差异 2.线程的生命周期 3.线程控制(线程的方法) 4.线程同步 5.线程同步锁 一. 两种方式的差异 A extends Thread :简单 不能再继承其他类了(Java单继承)同 ...
- Java课堂笔记(零):内容索引
回想自己学习和使用Java的时间也是很长了.本科期间课堂上浅尝辄止地学习了点皮毛,后来也是搁置不用,未曾深入研究.研究生期间因为项目和实习的原因,基本算是重新拾起Java这门语言,并且接触到了Spri ...
- Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案
内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...
- Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案
多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...
- Java JDBC批处理插入数据操作
在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...
- Java JDBC批处理插入数据操作(转)
在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...
- 九章算法系列(#3 Binary Tree & Divide Conquer)-课堂笔记
前言 第一天的算法都还没有缓过来,直接就进入了第二天的算法学习.前一天一直在整理Binary Search的笔记,也没有提前预习一下,好在Binary Tree算是自己最熟的地方了吧(LeetCode ...
- ocp11g培训内部教材_052课堂笔记(042)_体系架构
OCP 052 课堂笔记 目录 第一部分: Oracle体系架构... 4 第一章:实例与数据库... 4 1.Oracle 网络架构及应用环境... 4 2.Oracle 体系结构... 4 3. ...
- Java JDBC 数据库链接小结随笔
Java JDBC 数据库链接小结随笔 一.链接数据库的步骤 二.关于Statement 和 PrepareStatement 两者区别 用法 三.关于 ResultSet 的一些小结 四.自定义 ...
- java jdbc 连接mysql数据库 实现增删改查
好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...
随机推荐
- GANSS 87C键盘在Linux无法正常使用的解决办法
前几天在狗东入手可以一把GANSS的87C键盘,满心欢喜拆开来用却发现在开发电脑(Deepin和ubuntu)上F1-F12都不能正常使用,这对一个搞web开发的人来说,无疑是要了我的老命,无奈找各种 ...
- SAP S/4HANA 2020安装实录
欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 今天开始试着安装SAP S/4HANA 2020版本,也是目前SAP ERP最高的版本,总安装文件大小大概50GB,数据库版本必须是HANA ...
- 【Kata Daily 190919】Sort Out The Men From Boys(排序)
题目: Scenario Now that the competition gets tough it will Sort out the men from the boys . Men are th ...
- OJ-1:时钟问题【九度1553】
题目描述: 如图,给定任意时刻,求时针和分针的夹角(劣弧所对应的角). 输入: 输入包含多组测试数据,每组测试数据由一个按hh:mm表示的时刻组成. 输出: 对于每组测试数据,输出一个浮点数,代表时针 ...
- NodeJs 加入Windows开机自启动服务
首先需要到http://nssm.cc/download/?page=download 下载 nssm,下下来之后是压缩包形式的解压之后,在命令行模式下进入到nssm的目录.之后运行:nssm ins ...
- 要求用户输入用户名和密码,只要不是admin、888888就
要求用户输入用户名和密码,只要不是admin.888888就一直提示用户名或密码错误,请重新输入 Console.WriteLine("输入账号和密码"); string a = ...
- 4、Python语法之变量
一 引入 我们学习Python语言是为了控制计算机.让计算机能够像人一样去工作,所以在Python这门语言中,所有语法存在的意义都是为了让计算机具备人的某一项技能,这句话是我们理解后续所有Python ...
- 16、Auth认证组件
1 Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码 ...
- Jenkins(9)- 汉化 Jenkins 网站
如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html 下载插件 安装这两个插件,然后重启 ...
- 14flask 渲染富文本编辑器
转载一个flask 渲染富文本编辑器: https://blog.csdn.net/qq_32198277/article/details/53355249 这里会产生一个问题: 通过富文本编辑器的数 ...