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的URL
String 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);
//传入参数 要删除id
pstmt.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);
//传入参数 要删除id
pstmt.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() 方法获取列的数据时建议写列名,这样好识别
Java入门系列-26-JDBC的更多相关文章
- java io系列26之 RandomAccessFile
本文主要介绍 RandomAccessFile. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_26.html 更多内容请参考:java io系列0 ...
- Java入门系列-19-泛型集合
集合 如何存储每天的新闻信息?每天的新闻总数是不固定的,太少浪费空间,太多空间不足. 如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,可以使用Java集合框架. Java 集合框架提 ...
- Java入门系列:实例讲解ArrayList用法
本文通过实例讲解Java中如何使用ArrayList类. Java.util.ArrayList类是一个动态数组类型,也就是说,ArrayList对象既有数组的特征,也有链表的特征.可以随时从链表中添 ...
- Java Web系列:JDBC 基础
ADO.NET在Java中的对应技术是JDBC,企业库DataAccessApplicationBlock模块在Java中的对应是spring-jdbc模块,EntityFramework在Java中 ...
- Java入门系列之hashCode和equals(十二)
前言 前面两节内容我们详细讲解了Hashtable算法和源码分析,针对散列函数始终逃脱不掉hashCode的计算,本节我们将详细分析hashCode和equals,同时您将会看到本节内容是从<E ...
- Java入门系列之字符串创建方式、判断相等(一)
前言 陆续从0开始学习Java出于多掌握一门语言以后的路也会更宽,.NET和Java兼顾,虽然路还很艰难,但事在人为.由于Java和C#语法相似,所以关于一些很基础的内容不会再重头讲,Java系列中所 ...
- Java入门系列之重写
前言 关于所有Java系列文章面向有一定基础的童鞋,所写每一篇希望有一定含金量,有些内容可能会从Java整个语法全局考虑穿插后续要讲解的内容以成系统,若不理解,请看完后再学习.上一节我们讲解完了fin ...
- Java入门系列 泛型
前言 <Java编程思想>第四版足足用了75页来讲泛型——厚厚的一沓内容,很容易让人头大——但其实根本不用这么多,只需要一句话:我是一个泛型队列,狗可以站进来,猫也可以站进来,但最好不要既 ...
- Java入门系列 Java 中的四种引用
Why java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型 ...
随机推荐
- 反省在北京某S2B2C电商小型公司面试时掉链子的问题
昨天,参与北京一家公司面试时,不知道为什么,错了很多题,这些题在该家公司之前已经被问很多次了,当天精神恍惚的没答上来或答错,被问到数据库优化和乐观锁的问题,首先我谈到了存储引擎底层的数据结构 B树/B ...
- Winform Log4net 配置写不同文件
以下配置了二种写文件,第一种根据日期写文件yyyyMMdd.txt,第二种是写固定文件login.txt. 1, 下载Log4net组件: http://logging.apache.org/log4 ...
- WPF 添加OCX控件
1. 在计算机上安装OCX控件 2.创建WPF应用程序 3.打开工具箱 4.单击COM 组件选项卡上,选择安装的控件,,然后单击确定,将控件添加到工具箱 5.在解决方案资源管理器,右键单击UserCo ...
- django admin后台的简单使用
创建自己的model.py文件 from django.db import models from django.contrib.auth.models import ( BaseUserManage ...
- “全栈2019”Java第六十八章:外部类访问内部类成员详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 洛谷P5245 【模板】多项式快速幂
题面 传送门 题解 话说现在还用数组写多项式的似乎没几个了-- \[B(x)=A^k(x)\] \[\ln B(x)=k\ln A(x)\] 求个\(\ln\),乘个\(k\),\(\exp\)回去就 ...
- LVM 认知与扩容操作
继上次 "Linux系统如何迁移至LVM磁盘"反响不错,近三百的访问量吧.这次想续写点东西,主要讲的是"LVM认知和扩容操作".因为网上大多数不准确,可能作者也 ...
- 如何实现 Python 中 selnium 模块的换行
如何实现 Python 中 selnium 模块的换行 三种方法: 直接调用 .submit() 方法,常使用在用户密码登录中 # driver.find_element_by_xpath('//*[ ...
- ResourceBundle和Locale
一.认识国际化资源文件 这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以: 轻松地本地化或翻译成不同的语言 一次处理多个语言环境 ...
- TX2 五种功耗模式
工作模式介绍 Jetson TX2由一个GPU和一个CPU集群组成,CPU集群由双核丹佛2处理器和四核ARM Cortex-A57组成,通过高性能互连架构连接. 拥有6个CPU核心和一个GPU,您可以 ...