一 JDBC简介

Java DataBase Connectivity Java语言连接数据库

官方(Sun公司)定义的一套操作所有关系型数据库的规则(接口) 各个数据库厂商去实现这套接口 提供数据库驱动JAR包 可以使用这套接口(JDBC)编程 真正执行的代码是驱动JAR包中的实现类

二 JDBC初体验

1. 新建一个Maven项目

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hy.jdbc</groupId>
<artifactId>jdbc-demo</artifactId>
<version>1.0-SNAPSHOT</version> <!-- 定义依赖版本号 -->
<properties>
<junit.version>4.12</junit.version>
<mysql-connector-java.version>8.0.11</mysql-connector-java.version>
<druid.version>1.1.10</druid.version>
</properties> <!-- 管理jar版本号 -->
<dependencyManagement>
<dependencies>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
</dependencies>
</dependencyManagement> <dependencies>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
</dependencies>
</project>

sql

CREATE TABLE account (
aid INT PRIMARY KEY,
aname VARCHAR(100),
amoney DOUBLE
);

2. 插入

@Test
public void test01() {
Connection connection = null;
PreparedStatement statement = null;
try {
// 注册驱动 MySQL5之后的驱动JAR包可以省略该步骤
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库连接对象 Connection
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy", "root", "root");
// 开启事务
connection.setAutoCommit(false);
// 定义SQL
String sql = "insert into account values(?, ?, ?)";
// 获取执行SQL的对象 PreparedStatement
statement = connection.prepareStatement(sql);
// 设置参数
statement.setInt(1, 1); //'?' 位置的编号 从1开始
statement.setString(2, "No1"); //'?' 位置的编号 从1开始
statement.setDouble(3, 2000); //'?' 位置的编号 从1开始
// 执行SQL 返回受影响的行数
int count = statement.executeUpdate();
// 提交事务
connection.commit();
// 处理结果
System.out.println("count = " + count); } catch (Exception e) {
e.printStackTrace();
// 回滚事务
if (null != connection) {
try {
connection.rollback();
} catch (SQLException exception) {
exception.printStackTrace();
}
} } finally {
// 释放资源
if (null != statement) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (null != connection) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

3. 删除

@Test
public void test02() {
Connection connection = null;
PreparedStatement statement = null;
try {
// 注册驱动 MySQL5之后的驱动JAR包可以省略该步骤
//Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库连接对象 Connection
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy", "root", "root");
// 开启事务
connection.setAutoCommit(false);
// 定义SQL
String sql = "delete from account where aid = ?";
// 获取执行SQL的对象 PreparedStatement
statement = connection.prepareStatement(sql);
// 设置参数
statement.setInt(1, 1); //'?' 位置的编号 从1开始
// 执行SQL 返回受影响的行数
int count = statement.executeUpdate();
// 提交事务
connection.commit();
// 处理结果
System.out.println("count = " + count); } catch (Exception e) {
e.printStackTrace();
// 回滚事务
if (null != connection) {
try {
connection.rollback();
} catch (SQLException exception) {
exception.printStackTrace();
}
} } finally {
// 释放资源
if (null != statement) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (null != connection) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

4. 修改

@Test
public void test03() {
Connection connection = null;
PreparedStatement statement1 = null;
PreparedStatement statement2 = null;
try {
// 注册驱动 MySQL5之后的驱动JAR包可以省略该步骤
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库连接对象 Connection
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy", "root", "root");
// 开启事务
connection.setAutoCommit(false);
// 定义SQL
String sql1 = "update account set amoney = amoney + ? where aid = ?";
String sql2 = "update account set amoney = amoney - ? where aid = ?";
// 获取执行SQL的对象 PreparedStatement
statement1 = connection.prepareStatement(sql1);
statement2 = connection.prepareStatement(sql2);
// 设置参数
statement1.setDouble(1, 500); //'?' 位置的编号 从1开始
statement1.setInt(2, 1); //'?' 位置的编号 从1开始
statement2.setDouble(1, 500); //'?' 位置的编号 从1开始
statement2.setInt(2, 2); //'?' 位置的编号 从1开始
// 执行SQL 返回受影响的行数
statement1.executeUpdate();
int i = 3 / 0; //模拟异常
statement2.executeUpdate();
// 提交事务
connection.commit(); } catch (Exception e) {
e.printStackTrace();
// 回滚事务
if (null != connection) {
try {
connection.rollback();
} catch (SQLException exception) {
exception.printStackTrace();
}
} } finally {
// 释放资源
if (null != statement2) {
try {
statement2.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (null != statement1) {
try {
statement1.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (null != connection) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

5. 查询

@Test
public void test04() {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 注册驱动 MySQL5之后的驱动JAR包可以省略该步骤
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库连接对象 Connection
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy", "root", "root");
// 开启事务
connection.setAutoCommit(false);
// 定义SQL
String sql = "select * from account";
// 获取执行SQL的对象 PreparedStatement
statement = connection.prepareStatement(sql);
// 执行SQL 返回结果集
resultSet = statement.executeQuery();
// 提交事务
connection.commit();
// 处理结果
while (resultSet.next()) {
int id = resultSet.getInt(1); //代表列的编号 从1开始
String name = resultSet.getString("aname"); //代表列的名称
double money = resultSet.getDouble(3); //代表列的编号 从1开始
System.out.println(id + "---" + name + "---" + money);
} } catch (Exception e) {
e.printStackTrace();
// 回滚事务
if (null != connection) {
try {
connection.rollback();
} catch (SQLException exception) {
exception.printStackTrace();
}
} } finally {
// 释放资源
if (null != resultSet) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (null != statement) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (null != connection) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

三 数据库连接池

一个存放数据库连接的容器

当系统初始化后 容器被创建 容器中会申请一些连接对象 当用户访问数据库时 从容器中获取连接对象 用户访问完之后 会将连接对象归还给容器 这样可以节约资源 提高访问效率

常见的数据库连接池有 Druid C3P0...

Druid初体验

druid.properties

url=jdbc:mysql://localhost:3306/demo_hy
driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=root
maxActive=10
minIdle=5

XTest.java

@Test
public void test05() {
InputStream stream = null;
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 加载配置文件
Properties properties = new Properties();
stream = XTest.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(stream);
// 获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
// 获取数据库连接对象 Connection
connection = dataSource.getConnection();
// 开启事务
connection.setAutoCommit(false);
// 定义SQL
String sql = "select * from account";
// 获取执行SQL的对象 PreparedStatement
statement = connection.prepareStatement(sql);
// 执行SQL 返回结果集
resultSet = statement.executeQuery();
// 提交事务
connection.commit();
// 处理结果
while (resultSet.next()) {
int id = resultSet.getInt(1); //代表列的编号 从1开始
String name = resultSet.getString("aname"); //代表列的名称
double money = resultSet.getDouble(3); //代表列的编号 从1开始
System.out.println(id + "---" + name + "---" + money);
} } catch (Exception e) {
e.printStackTrace();
// 回滚事务
if (null != connection) {
try {
connection.rollback();
} catch (SQLException exception) {
exception.printStackTrace();
}
} } finally {
// 释放资源
if (null != resultSet) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (null != statement) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (null != connection) {
try {
connection.close(); //归还连接
} catch (SQLException e) {
e.printStackTrace();
}
} if (null != stream) {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

最后

学习java不易,需要持续的坚持,如果有想学习java的基础知识或者进阶java的可以私信“学习”获取学习联系方式

2020想学习JAVA的同学看过来,最基础的编程CRUD你会了没?的更多相关文章

  1. 想成为Java高级工程师的看过来

    想成为Java高级工程师,有哪些要求呢? 1.Core Java,就是Java基础.JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看 ...

  2. 学习Java JDBC,看这篇就够了

    JDBC (Java DB Connection)---Java数据库连接 JDBC是一种可用于运行SQL语句的JAVA API(ApplicationProgramming Interface应用程 ...

  3. java初学者必看的学习路线

    不管在编程语言的排行榜中,还是在大多数企业应用的广泛程度来看,Java一直都是当之无愧的榜首.Java语言有着独特的魅力吸引着广大的年轻人去学习,每个人学习的方式方法不一样. 第一步:首先要做好学习前 ...

  4. 零基础如何学习java更有效呢?

    零基础学java,不知道该如何入手?也不知道学习的方向,很多人会问零基础怎么样学习,有没有什么入门的书籍推荐:只要方法正确,零基础学好java也是有机会的哦. 一.理解Java思想 Java是一门面向 ...

  5. 假如时光倒流,我会这样学习Java

    回头看看, 我进入Java 领域已经快15个年头了, 虽然学的也一般, 但是分享下我的心得,估计也能帮大家少走点弯路. [入门] 我在2001年之前是C/C++阵营, 有C和面向对象的基础, 后来转到 ...

  6. 学习Java的方法

    许多人在刚开始学习Java时,会因为学习方法的不正确,而丧失信心,从而半途而废.所以,今天,巩固就要教教大家学习Java的方法. 1.多练习 编程其实是一个非常抽象的东西,要想学好它,就不能只是看看书 ...

  7. 学习java需要英语很好吗?

    学习java需要英语很好吗? 编程语言起源于美国,是由英文构成的,其中包括几十个英文的关键字以及几百个英文的函数,除非需要对文本进行处理,否则一般不会出现中文.但是,它们都是孤立的单词,不构成任何语句 ...

  8. 学习java分为几个阶段,分别是什么?

    多年前我自学的时候是很茫然,上网问问题,总是一堆外行的人说很难啊,你需要这样需要那样,不然就是,一堆人说一些空话,多看多写,买好书,我很无语,除了这些就没有自己的一些想法吗? 首先很多人认为学JAVA ...

  9. 学习java知道这五个网站就够了

    "这个国家的每个人都应该学习编程计算机,因为它教你如何思考." 当乔布斯几年前这么说时,他再次被证明是一个真正的有远见的人. 好吧,这很难反驳!如今,编程比以往任何时候都更加蓬勃发 ...

随机推荐

  1. The main method caused an error: java.util.concurrent.ExecutionException: org.apache.flink.runtime.client.JobSubmissionException: Failed to submit JobGraph.

    在使用flink run命令提交任务可能会遇到如下错误: The program finished with the following exception: org.apache.flink.cli ...

  2. day19__生成器,迭代器

    一.列表解析 l1 = ['鸡蛋%s' % i for i in range(10) if i > 5] print(l1) # ['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9'] 这种方 ...

  3. TreeMap实现

  4. Plink v0.1.0 发布——基于Flink的流处理平台

    Plink是一个基于Flink的流处理平台,旨在基于 [Apache Flink]封装构建上层平台. 提供常见的作业管理功能.如作业的创建,删除,编辑,更新,保存,启动,停止,重启,管理,多作业模板配 ...

  5. Windows系统VSCode、VBox搭建C/C++开发环境

    好几年没有写过C/C++代码,基本上都忘光了,之前是使用VC++6.0写代码的,最近用VSCode成功搭建了C/C++开发环境,这里记录一下搭建过程. 1. 安装VSCode 在官网https://c ...

  6. 每日一题 - 剑指 Offer 52. 两个链表的第一个公共节点

    题目信息 时间: 2019-07-03 题目链接:Leetcode tag: 单链表 难易程度:简单 题目描述: 输入两个链表,找出它们的第一个公共节点. 示例: A: a1 -> a2 \ - ...

  7. 介绍web开发中实现会话跟踪的常用技术方法

    由于http是无状态的协议,这种特性严重阻碍了客户端与服务器进行动态交互,例如购物车程序,客户在购物车中添加了商品,服务器如何知道购物车已有的物品呢?为了支持客户端与服务器之间的交互,为了弥补http ...

  8. yml配置基本使用

    1.yml 基本知识 1.1 常识 基本结构 k: v 的结构 注意:冒号和v之间必须有空格,否则会出现问题: 大小写敏感 1.2 v 多种写法 看一下下面的这个例子: # rabbitmq 初始化配 ...

  9. redis基础02-redis的5种对象数据类型

    表格引用地址:http://www.cnblogs.com/xrq730/p/8944539.html 参考书籍:<Redis设计与实现>,<Redis运维与开发> 1.对象 ...

  10. day35 socket套接字介绍

    目录 一.套接字发展史与分类 二.套接字工作流程 三.基于tcp的套接字 一.套接字发展史与分类 套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD U ...