一 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. Install fail! Error: EBUSY: resource busy or locked, rename

    https://stackoverflow.com/questions/36566236/npm-install-error-code-ebusy-errono-4082 关闭项目所在的文件夹,cmd ...

  2. Python3笔记017 - 4.2 列表

    第4章 序列的应用 python的数据类型分为:空类型.布尔类型.数字类型.字节类型.字符串类型.元组类型.列表类型.字典类型.集合类型 在python中序列是一块用于存放多个值的连续内存空间. py ...

  3. npm和webpack

    npm是前端开发中常用的一种工具,对于普通开发者来说,便于管理依赖. 往大了说,便于共享代码.写完代码,使用npm发布以后,然后别人用npm可以方便地共享到你的代码. npm的使用: mac环境下的安 ...

  4. flex布局语法+实例

    一.什么是flex布局 flex 是 flexible box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为 flex 布局.你可以将前端页 ...

  5. 「疫期集训day10」玫瑰

    不管我们在怎么抵抗,德国都已经败了----失守苏瓦松后绝望中的德国兵 (貌似今天的题记和内容毫无关系) 觉得以后还是不要抱怨考试失误了,感觉没啥大用 T1暴搜/状压(然俄一看题很像刚写过的二分答案,上 ...

  6. 14.刚体组件Rigidbody

    刚体组件是物理类组件,添加有刚体组件的物体,会像现实生活中的物体一样有重力.会下落.能碰撞. 给物体添加刚体: 选中游戏物体->菜单Component->Physics->Rigid ...

  7. Serverless介绍篇(一)云开发在Serverless方面取得了怎样的新成果?

    过去几年间,Serverless 发展迅猛,与其相伴的还有从小程序.移动端等到前后端一体化的演进与实践,也正因如此,从云计算到前端,众多开发者都极为关注.本文介绍了腾讯云CloudBase 的 Ser ...

  8. Python 图像处理 OpenCV (13): Scharr 算子和 LOG 算子边缘检测技术

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  9. Jmeter系列(43)- 详解 Jmeter 图形化 HTML 压测报告之 Charts 模块

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html Charts 介绍 包含了各种详细信息 ...

  10. Scala 基础(三):Scala语言快速开发入门

    1.Scala执行流程分析 2.Scala程序开发注意事项(重点) Scala源文件以 “.scala" 为扩展名. Scala程序的执行入口是main()函数. Scala语言严格区分大小 ...