Java入门系列-26-JDBC
认识 JDBC
JDBC (Java DataBase Connectivity) 是 Java 数据库连接技术的简称,用于连接常用数据库。
Sun 公司提供了 JDBC API ,供程序员调用接口和类,集成在 java.sql 和 javax.sql 包中。
Sun 公司还提供了 DriverManager 类用来管理各种不同的JDBC驱动。
不同数据库厂商提供各自的JDBC驱动,所以我们想要连接数据库除了要了解 JDBC API 还需要下载各数据库厂商的驱动 jar 包。
JDBC API
JDBC API主要用于与数据库建立连接、执行SQL语句、处理结果,其中核心类和接口如下:
- DriverManager:依据数据库的不同,管理JDBC驱动
- Connection:负责连接数据库并担任传送数据的任务
- Statement:由 Connection 产生、负责执行SQL语句
- ResultSet:负责保存 Statement 执行后所产生的查询结果
JDBC 编码模板
1、与数据库建立连接并获取连接
Connection connection=DriverManager.getConnection(URL,数据库用户名,密码);
2、发送SQL语句,得到执行结果
Statement stmt=connection.createStatement();
ResultSet rs=stmt.executeQuery(SQL语句);
3、处理返回结果
while(rs.next()){int a=rs.getInt("a");String b=rs.getString("b");Date d=rs.getDate("d");……
}
4、释放资源
rs.close();
stmt.close();
connection.close();
使用 JDBC 连接到 MySQL 数据库
本例适合已经会使用 MySQL 数据库的同学,首先我们下载 JDBC 的驱动 jar 包。这个网址提供了 MySQL 各种语言连接数据库的驱动 https://www.mysql.com/products/connector/,MySQL Connector / J 8.0与从MySQL 5.5开始的所有MySQL版本兼容。
8.0下载地址
下载完成后解压,后将jar添加依赖到项目中。
连接到MySQL数据库
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DemoConnectMySQL {public static void main(String[] args) {//连接MySQL的URLString url="jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";//MySQL数据库用户名String user="root";//MySQL数据库的密码String password="1234";Connection connection=null;try {connection=DriverManager.getConnection(url, user, password);System.out.println("连接成功");} catch (SQLException e) {e.printStackTrace();}finally {try {connection.close();System.out.println("连接关闭");} catch (SQLException e) {e.printStackTrace();}}}
}
url指定数据库的连接字符串,格式为:
jdbc:数据库://ip或域名:端口号?参数&参数……
这里的参数 useUnicode=true 使用Unicode字符,characterEncoding=utf8 设置编码防止中文乱码,serverTimezone=UTC 设置时区,useSSL=false 不使用SSL
jdbc4.0不需要加载驱动
PreparedStatement 增删改
PreparedStatement 继承了 Statement 接口,表示预编译的 SQL 语句对象,SQL 语句被预编译并存储在 PreparedStatement 对象中,可以使用此对象多次高效地执行该语句。(还避免了 SQL 注入的隐患)
先准备好数据库 books
表 book
字段 | 类型 | 属性 |
---|---|---|
id | 整数 | 主键,自增 |
bName | 字符串 | 非空 |
price | 小数 | 非空 |
脚本也准备好了
#创建数据库
CREATE DATABASE books;
USE books;
#创建表
CREATE TABLE book ( id INT primary key auto_increment, bName VARCHAR ( 255 ) NOT NULL, price FLOAT NOT NULL
);
PreparedStatement添加数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestInsert {public static void main(String[] args) {Connection connection=null;PreparedStatement pstmt=null;String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";String user="root";String password="1234";try {connection=DriverManager.getConnection(url,user,password);//sql语句String sql="insert into book(bName,price) values (?,?)";pstmt=connection.prepareStatement(sql);//传入参数pstmt.setString(1, "《java入门到改行》");pstmt.setFloat(2, 11.11f);int result=pstmt.executeUpdate();System.out.println("受影响行数:"+result);} catch (SQLException e) {e.printStackTrace();}finally {if (pstmt!=null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
说明:
1、连接字符串要修改数据库名字为 books
String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
2、插入数据库的数据不能拼接而是要用 ?
代替
String sql="insert into book(bName,price) values (?,?)";
3、?
代替的参数要通过 set类型(位置,值)
传入
pstmt.setString(1, "《java入门到改行》");
pstmt.setFloat(2, 11.11f);
pstmt.setXxx()的位置从 1 开始!
4、增删改的SQL语句都使用这个方法,返回受影响行数
int result=pstmt.executeUpdate();
删除数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestDelete {public static void main(String[] args) {Connection connection=null;PreparedStatement pstmt=null;String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";String user="root";String password="1234";try {connection=DriverManager.getConnection(url,user,password);//sql语句String sql="delete from book where id=?";pstmt=connection.prepareStatement(sql);//传入参数 要删除idpstmt.setInt(1, 1);int result=pstmt.executeUpdate();System.out.println("受影响行数:"+result);} catch (SQLException e) {e.printStackTrace();}finally {if (pstmt!=null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
修改数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestUpdate {public static void main(String[] args) {Connection connection=null;PreparedStatement pstmt=null;String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";String user="root";String password="1234";try {connection=DriverManager.getConnection(url,user,password);//sql语句String sql="update book set bName=?,price=? where id=?";pstmt=connection.prepareStatement(sql);//传入参数 要删除idpstmt.setString(1, "《MySQL从删库到跑路》");pstmt.setFloat(2, 16.66f);pstmt.setInt(3, 2);int result=pstmt.executeUpdate();System.out.println("受影响行数:"+result);} catch (SQLException e) {e.printStackTrace();}finally {if (pstmt!=null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
增、删、改操作的写法都一样,都调用 executeUpdate() 方法返回一个受影响行数,唯一不同的 SQL语句。
PreparedStatement 查询数据
查询数据需要用到 ResultSet 类保存返回的结果集,我们获取数据要操作 ResultSet 获取。
ResultSet 常用方法
方法名 | 说明 |
---|---|
boolean next() | 将游标从当前位置向下移动一行 |
void close() | 关闭 ResultSet 对象 |
int getInt(int colIndex) | 以int形式获取结果集当前行指定列号值 |
int getInt(String colLabel) | 以int形式获取结果集当前行指定列名值 |
float getFloat(String colLabel) | 以float形式获取结果集当前行指定列名值 |
String getString(String colLabel) | 以 String 形式获取结果集当前行指定列名值 |
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestSelect {public static void main(String[] args) {Connection connection=null;PreparedStatement pstmt=null;ResultSet rs=null;String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";String user="root";String password="1234";try {connection=DriverManager.getConnection(url,user,password);//sql语句String sql="select bName,price,id from book where id=?";pstmt=connection.prepareStatement(sql);//传入查询条件pstmt.setInt(1, 2);rs=pstmt.executeQuery();while(rs.next()) {//通过列名获取列的值int id=rs.getInt("id");//通过位置获取列的值String bName=rs.getString(1);float price=rs.getFloat("price");System.out.println(id+" "+bName+" "+price);}} catch (SQLException e) {e.printStackTrace();}finally {if(rs!=null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (pstmt!=null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
关闭对象时注意关闭的顺序,后使用的先关闭:rs.close()->pstmt.close()->connection.close()
ResultSet 对象存在一个光标,光标所指行为当前行。想要获取列的数据需要先指向一行,所以要先指定 next() 方法用于指向一行,如果没有数据next()方法返回false,有数据返回true。
使用 getXxx() 方法获取列的数据时建议写列名,这样好识别
转载于:https://www.cnblogs.com/AIThink/p/9940542.html
Java入门系列-26-JDBC相关推荐
- Java入门系列——Java语言基础(小康小白)
我是小康小白,一个平平无奇的Java,Python小白.热爱有趣的文字,生活和远方. 个人博客:https://blog.csdn.net/weixin_45791445 有问题欢迎QQ联系:1059 ...
- Java入门系列-16-继承
这一篇文章教给新手学会使用继承,及理解继承的概念.掌握访问修饰符.掌握 final 关键字的用法. 继承 为什么要使用继承 首先我们先看一下这两个类: public class Teacher {pr ...
- Java入门系列-09-循环结构
这篇文章为你搞懂5个问题 while 循环如何使用 do-while 循环的使用 for 循环的使用 break.continue 的使用 循环结构的嵌套使用 生活中有很多事情需要我们重复的去做,比如 ...
- Java入门系列-11-类和对象
这篇文章为你搞懂类和对象的使用 对象:用来描述客观事物的实体,由一组属性和方法组成,万物皆对象. 属性:就是对象的特征,像身高.体重.颜色 方法:对象的行为,如跑.跳 类:类是模子,定义对象将会拥有的 ...
- Java入门系列-22-IO流
File类的使用 Java程序如何访问文件?通过 java.io.File 类 使用File类需要先创建文件对象 File file=new File(String pathname);,创建时在构造 ...
- Java入门系列-20-异常
为什么要进行异常处理 下面这段代码能否正常执行 public class DemoCalc {public static void main(String[] args) {int a=0;int b ...
- Java入门系列-24-实现网络通信
互联网上那么多设备,java 是如何与其他设备通信的呢?这次的内容是网络通信的基础,有了它咱们才能上网页.玩游戏.视频聊天. Socket 客户端套接字 Socket 客户端套接字,用于连接互联网提供 ...
- Java入门系列之访问修饰符作用范围
前言 本节只讲解学习Java中访问修饰符一些需要注意的地方或者从概念上不太好理解我们会通过实际例子来说明,若有错误之处,还请批评指正.欢迎大家在评论区纠错,或者可以把你想了解的评论在底下之后我会尽可能 ...
- K8S入门系列(26)-K8S之Schedule
Schedule 调度器是主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行. kube-scheduler 是 Kubernetes 集群的默认调度器, ...
最新文章
- Java:定时启动线程
- ext3文件系统反删除利器-ext3grep
- 语言ppt课件猜拳_人教版初中数学七年级下册阅读与思考 一次方程组的古今表示及解法公开课优质课课件教案视频...
- 想换工作?阿里技术战略部招人啦!
- C++学习之路 | PTA乙级—— 1017 A除以B (20分)(精简)
- dos命令测试网络连通情况
- MYSQL----(3)SQL 基本操作
- 不写代码不用Excel,销售总监的数据分析,10分钟你就可以学会
- JavaScript30秒, 从入门到放弃之Array(七)
- JS中的 回调函数(callback)
- 汽车控制器自研AUTOSAR开发工具链需要哪些?
- Window XP驱动开发(二) 环境搭建(VS2008+WDK+DDKWzard)及示例源码分析
- 【最新】2020年注册测绘师考试测绘综合能力真题及参考答案
- python 3d图
- 教你一招:复制不能复制的网页文字(通用篇)
- 基于FPGA的CAN通信,FPGA驱动SJA1000T芯片代码,实现标准帧与扩展帧的通信驱动
- 谈谈对Spring IOC(控制反转)的理解
- sklearn 的基本机器学习(分类方法)
- ExcelVBA之更改文件路径
- MySQL讲义第 39 讲——select 查询之函数(2):日期时间型函数
热门文章
- imagick php 缩放,php使用imagick模块实现图片缩放、裁剪、压缩示例
- boost原理与sklearn源码_机器学习sklearn系列之决策树
- android自动化持续集成,基于持续集成的Android自动化测试.pdf
- 《dp补卡——完全背包问题》
- 智能车复工日记【6】:有bug的模糊PID记录
- typedef 字符串_typedef在C中使用字符数组(定义别名来声明字符串)的示例
- AAS的完整形式是什么?
- 树存储结构(代码、分析、汇编)
- linux与windows编码转化
- tornado 学习注意事项--00