2020想学习JAVA的同学看过来,最基础的编程CRUD你会了没?
一 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你会了没?的更多相关文章
- 想成为Java高级工程师的看过来
想成为Java高级工程师,有哪些要求呢? 1.Core Java,就是Java基础.JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看 ...
- 学习Java JDBC,看这篇就够了
JDBC (Java DB Connection)---Java数据库连接 JDBC是一种可用于运行SQL语句的JAVA API(ApplicationProgramming Interface应用程 ...
- java初学者必看的学习路线
不管在编程语言的排行榜中,还是在大多数企业应用的广泛程度来看,Java一直都是当之无愧的榜首.Java语言有着独特的魅力吸引着广大的年轻人去学习,每个人学习的方式方法不一样. 第一步:首先要做好学习前 ...
- 零基础如何学习java更有效呢?
零基础学java,不知道该如何入手?也不知道学习的方向,很多人会问零基础怎么样学习,有没有什么入门的书籍推荐:只要方法正确,零基础学好java也是有机会的哦. 一.理解Java思想 Java是一门面向 ...
- 假如时光倒流,我会这样学习Java
回头看看, 我进入Java 领域已经快15个年头了, 虽然学的也一般, 但是分享下我的心得,估计也能帮大家少走点弯路. [入门] 我在2001年之前是C/C++阵营, 有C和面向对象的基础, 后来转到 ...
- 学习Java的方法
许多人在刚开始学习Java时,会因为学习方法的不正确,而丧失信心,从而半途而废.所以,今天,巩固就要教教大家学习Java的方法. 1.多练习 编程其实是一个非常抽象的东西,要想学好它,就不能只是看看书 ...
- 学习java需要英语很好吗?
学习java需要英语很好吗? 编程语言起源于美国,是由英文构成的,其中包括几十个英文的关键字以及几百个英文的函数,除非需要对文本进行处理,否则一般不会出现中文.但是,它们都是孤立的单词,不构成任何语句 ...
- 学习java分为几个阶段,分别是什么?
多年前我自学的时候是很茫然,上网问问题,总是一堆外行的人说很难啊,你需要这样需要那样,不然就是,一堆人说一些空话,多看多写,买好书,我很无语,除了这些就没有自己的一些想法吗? 首先很多人认为学JAVA ...
- 学习java知道这五个网站就够了
"这个国家的每个人都应该学习编程计算机,因为它教你如何思考." 当乔布斯几年前这么说时,他再次被证明是一个真正的有远见的人. 好吧,这很难反驳!如今,编程比以往任何时候都更加蓬勃发 ...
随机推荐
- postman无法正常启动
想请教下各位大神,我电脑的postman打开之后就一直转,没法启动是怎么回事?重装了不同版本的也是同样的情况,重启电脑也没用...同样的安装包,在别的电脑上就能正常打开!有什么办法解决吗? 0 20 ...
- SharePoint删除图片库文件
SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite site = new SPSite(SPContext.Current. ...
- 安卓移动端line-height垂直居中出现偏移的原因,及解决方法
目前在移动端安卓手机上使用line-height属性,让它的值等于height,结果发现是不居中的.出现了一定位置的偏移情况,如果略微只有两三个像素差距是看不出来的. 左图中的字号是12px,右图中的 ...
- WPF 最基本的前后台代码对照
最基本的3D代码对照 xaml代码 <Viewport3D> <Viewport3D.Camera> <PerspectiveCamera Position=" ...
- 双向绑定和 vuex 是否冲突
在严格模式下确实有问题,解决方案: https://vuex.vuejs.org/zh/guide/forms.html
- 007.Nginx虚拟主机
一 虚拟主机 1.1 虚拟主机概念 对于Nginx而言,每一个虚拟主机相当于一个在同一台服务器中却相互独立的站点,从而实现一台主机对外提供多个 web 服务,每个虚拟主机之间是独立的,互不影响的. 1 ...
- 某cms代码审计
前言 前几个礼拜上课老师带着挖cms的洞,挖出个cookie反序列化注入漏洞,和报错注入并且提交了cnvd.昨天去找源码的时候发现它更新了一个版本,更新日志上也没说修复,就想着看看漏洞还存不存在, ...
- scrapy 源码解析 (一):启动流程源码分析(一)命令行启动
前言 虽然爬虫的入门级编写并不难,但要让爬虫真正稳定可靠的运行起来,真不是一件容易的事.首先,要用到scrapy,就必须要读懂scrapy这个爬虫框架,如果连这个框架的执行逻辑都搞不懂,那么爬虫也很难 ...
- 前端07 /jQuery初识
前端07 /jQuery初识 目录 前端07 /jQuery初识 1.jquery介绍 1.1 jquery的优势 1.2 jquery是什么? 1.3 jquery的导入 2.jQuery的使用 2 ...
- LDAP脚本批量导出用户
背景:工作原因,搭建了LDAP服务,然后用户数过多,因为懒所以就通过python代码生成ldap脚本进行批量导入用户 1.整理用户名单,格式如下: 注:上述格式影响代码中的excel读取代码 2.py ...