一、JDBC

JDBC(Java DataBase Connectivity) 是Java 数据库连接API。
    JDBC完成三件事: 与一个数据库连接          向数据库发送SQL语句                处理数据库返回的结果 
    Java.sql包提供了JDBC API,声明了访问数据库的接口和类, 可以通过它编写访问数据库的程序。 
    JDBC API只是定义了相关的规范(提供相应的接口),并不 能直接访问数据库,它依赖于数据库厂商提供具体的实现。

1、相关实现

2、Java.sql包中的接口和类 :

Driver接口和DriverManager类
       Connection接口
       Statement接口
       PreparedStatement接口
       ResultSet接口

(1)Driver接口和DriverManager类

所有JDBC驱动程序都必须实现Driver接口, JDBC驱动程序由 数据库厂商提供。
DriverManager用来建立和数据库的连接已经管理JDBC驱动 程序。
getConnection(String url,String user,String pwd):建立和 数据库的连接,返回Connection对象

(2)Connection接口

Connection接口代表Java程序和数据库的连接, Connection接口常用方法:
 createStatement():创建并返回Statement对象
 prepareStatement(String sql):创建并返回 PreparedStatement对象

(3)Statement接口

Statement用来执行SQL语句。 
 对于insert、 update和delete语句,可以调用 executeUpdate(String sql)方法,该方法返回一个int型数据, 表示受影响的记录数。
 对于select语句,可以调用executeQuery(String sql)方法, 该方法返回一个ResultSet对象(查询结果集)

(4)PreparedStatement接口

PreparedStatement也用来执行SQL语句,不同的是,其可以使 用动态的参数(?)。
在访问数据库时,如果某条SQL语句被多次执行,但每次都参 数不同,在这种情况下,使用PreparedStatement比Statement 更方便, PreparedStatement允许sql语句中包含参数。

(5)ResultSet接口
ResultSet接口表示select语句查询得到的记录结果集合,ResultSet接口的记录行号从1开始,一个Statement对象在同 一时刻只能打开一个ResultSet对象。
 调用ResultSet的next()方法,可以进行顺序查询,可以使游 标定位到下一条记录,该方法返回一个boolean型数据,当 游标移动到最后一行之后返回false。
 调用ResultSet的getXXX()方法,可以获取某个字段的值。 XXX为字段的类型。

3、JDBC程序访问数据库的步骤

4、驱动类名

驱动类的名称由数据库厂商提供,不同的数据库厂商类名也不 相同。

MySQL驱动类: com.mysql.jdbc.Driver。
Oracle驱动类: oracle.jdbc.driver.OracleDriver
SqlServer驱动类: com.microsoft.sqlserver.jdbc.SQLServerDriver

5、建立与数据库的连接

Connection con = DriverManager.getConnection(url,user,password);
url表示连接数据库的地址,不同的数据库, url也不相同。
user和password分别表示连接数据库的用户名和密码。
url的一般形式为:
jdbc:drivertype:driversubtype://parameters
drivertype表示驱动程序的类型, driversubtype是子类型, parameter通常用来设定数据库服务器的IP地址、端口号和数据 库的名称

6、事务处理
在数据库操作中,一项事务是指由一条或多条对数据库更新 的SQL语句所组成的不可分割的工作单元。

只有当事务中的所有操作都正常完成,整个事务才能被提交 到数据库。如果有一项操作没有完成,则必须撤销整个事务。

事务的原则:要么全部完成,要么什么都不做。

在Connection类中提供了3个控制事务的方法:

setAutoCommit(boolean autoCommit):设置是否自动提交事 务
commit():提交事务
rollback():撤销事务

默认情况下,事务为自动提交。即每一条数据库更新的SQL 语句代表一项事务,操作成功后,系统将自动调用commit() 来提交,否则将调用rollback()来撤销事务。 
可以通过调用setAutoCommit(false)来禁止自动提交事务。 可以把多条更新数据库的SQL语句作为一个事务,在所有操 作完成后,调用commit()来进行整体提交。若其中一项SQL操作失败,就不会执行commit(),而是产生相应的SQLException,此时就可以在捕获异常的代码块中调用rollback()方法撤销事务。

7、数据库连接池

之前的数据库连接方式,是在需要时创建一个连接,当访问 数据库结束后,即将创建的连接销毁。

数据库的连接池的基本思想:在数据源中为数据库连接建立 多个连接,保存在连接池(connect pool)中;预先在连接池 中放入一定数量的连接,当Java程序访问数据库时,只需从 连接池中取出一个空闲状态的数据库连接。当程序访问数据 库结束,再将数据库连接放回连接池。这样就可以提高访问
数据库的效率,因为连接池只是将连接回收,而不是销毁。 要清楚,数据库连接的创建与销毁是非常耗费资源的。

二、

1、

/*
* 通过Java连接MySQL数据库。
*/
package day23; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement; public class ConnectionTest {
public static void main(String[] args) {
Connection con = null;
Statement st = null;
try {
// 可以创建驱动类的对象来令驱动类初始化,只是创建
// 的对象是多余的(根本不使用该对象)
// new com.mysql.jdbc.Driver();
// 加载并初始化驱动类。
Class.forName("com.mysql.jdbc.Driver");
// 获得数据库的连接,返回Connection接口类型的对象。
con = DriverManager.getConnection("jdbc:mysql://000.0.0.0:3306/test?useSSL=false", "root", "");
// System.out.println(con);
// 创建可执行的sql语句。
st = con.createStatement();
// 执行更新语句。返回受影响的记录数。
int count = st.executeUpdate("insert into student(id, name) values (8, '新增')");
System.out.println(count);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 资源释放的顺序:
// 先创建的后释放,后创建的先释放。
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}

  

2、TryWithResources:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class TryWithResources {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try (Connection con = DriverManager.getConnection("jdbc:mysql://***.0.0.1:3306/test?useSSL=false", "root", "");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select id, name, age, sex from student");) {

// 判断是否有下一条记录,如果存在,返回true,同时
                                              // 移动游标(指针),使其指向下一条记录。如果不存在,
                                              // 返回false。

			while (rs.next()) {

// 根据字段的索引获得当前记录该字段的值。索引从1开始。
                                                  // int id = rs.getInt(1);
                                               // 根据字段的名字获得当前记录该字段的值。
                                                int id = rs.getInt("id");
                                                String name = rs.getString("name");
                                                 int age = rs.getInt("age");
                                                 String sex = rs.getString("sex");

			}
} catch (SQLException e) {
e.printStackTrace();
}
} }

  3、PreparedStatement

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class DBUtil {
public static Connection getConnection() {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?useSSL=false", "root", "");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
} public static void release(ResultSet rs, Statement st, Connection con) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

  

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement; public class PreparedTest { public static void main(String[] args) { } public void insert(int id, String name, int age, String sex) {
try (Connection con = DBUtil.getConnection(); Statement st = con.createStatement();) {
String sql = "insert into student(id, name, age, sex) values (" + id + ", '" + name + "'," + age + ",'"
+ sex + "')";
StringBuilder bu = new StringBuilder();
bu.append("insert into student(id, name, age, sex) values (").append(id).append(",'").append(name)
.append("',").append(age).append(",'").append(sex).append("')");
st.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
/*
* PreparedStatement与Statement
* PreparedStatement是预处理的SQL语句对象,当重复
* 执行时,PreparedStatement在性能上可能会好于
* Statement(这要取决于底层数据库是否支持预处理)。
* PreparedStatement在程序的可读性上,也好于
* Statement,因此,我们应该总是有限的考虑使用
* PreparedStatement。
*/
public void insert2(int id, String name, int age, String sex) {
try (Connection con = DBUtil.getConnection();
PreparedStatement ps = con
.prepareStatement("insert into student(id, name, age, sex) values(?,?,?,?)")) {
ps.setInt(1, id);
ps.setString(2, name);
ps.setInt(3, age);
ps.setString(4, sex);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
} }

  4、Transaction

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; public class Transaction { public static void main(String[] args) {
Connection con = DBUtil.getConnection();
try (PreparedStatement ps1 = con.prepareStatement("update account set money = money - 100 where id = 1");
PreparedStatement ps2 = con
.prepareStatement("updatedd account set money = money + 100 where id = 2");) {
// 将自动提交设置为假。
con.setAutoCommit(false);
ps1.executeUpdate();
ps2.executeUpdate();
// 事务执行完毕,没有异常,提交。
con.commit();
con.setAutoCommit(true);
} catch (SQLException e) {
try {
// 失败,进行回滚操作。恢复到事务执行之前的
// 状态。
con.rollback();
con.setAutoCommit(true);
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
} }

  

Mysql(五) JDBC的更多相关文章

  1. MYSQL 之 JDBC(十五):数据库连接池

    在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 在主程序(如servlet.bean)中建立数据库连接 进行sql操作 断开数据库连接 这种模式开发存在各种各样的问题,最重要的是:数 ...

  2. MySQL之JDBC编程增删改查

    MySQL之JDBC 一.JDBC是什么 Java DatabaseConnectivity (java语言连接数据库) 二.JDBC的本质 JDBC是SUN公司制定的一套接口(interface). ...

  3. MySql之JDBC环境

    JAVA连接MySql数据库 JDBC对JAVA程序员而言是一套API "========" SQL语法 JDBC相关知识 jar命令的使用 异常的捕获和处理(Exception- ...

  4. 【MySQL】JDBC连接MySQL的一些问题以及解决办法

    [MySQL]JDBC连接MySQL的一些问题以及解决办法 http://blog.csdn.net/baofeidyz/article/details/52017047

  5. com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver的区别

    概述:com.mysql.jdbc.Driver是mysql-connector-java 5中的,而com.mysql.cj.jdbc.Driver是mysql-connector-java 6中的 ...

  6. com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定

    转自: http://blog.csdn.net/superdangbo/article/details/78732700 com.mysql.jdbc.Driver 和 com.mysql.cj.j ...

  7. com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别

    com.mysql.jdbc.Driver 是 mysql-connector-java 5中的,com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的 ...

  8. Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class

    Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdb ...

  9. com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver

    com.mysql.jdbc.Driver 是 mysql-connector-java 5中的,com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的 ...

随机推荐

  1. 开源PaaS工具CloudFoundry落地阿里云

    原文:https://yq.aliyun.com/articles/292815?utm_content=m_37457 云计算技术的不断成熟和完善,尤其是IaaS平台的不断发展,使得越来越多的企业和 ...

  2. 20155204 王昊《网络对抗技术》EXP1 PC平台逆向破解

    20155204 王昊<网络对抗技术>EXP1 PC平台逆向破解 (一)实验内容 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令&qu ...

  3. 20155238 Java第13周课堂实践

    类定义 实验内容及要求 设计并实现一个Book类,定义义成Book.java,Book 包含书名,作者,出版社和出版日期,这些数据都要定义getter和setter.定义至少三个构造方法,接收并初始化 ...

  4. 20155338《网络对抗》Exp6 信息搜集与漏洞扫描

    20155338<网络对抗>Exp6 信息搜集与漏洞扫描 实验过程 外围信息搜集 (1)whois域名注册信息查询 下面是搜索hao123.com得到的结果 下面这个也是同理 (2)nsl ...

  5. VS编程,WPF单独更改TextBlock中部分文字格式的一种方法

    原文:VS编程,WPF单独更改TextBlock中部分文字格式的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/articl ...

  6. windows下如何查看进程、端口占用、杀死进程教程

    一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano 可以查看所有进程 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道 ...

  7. Django高并发负载均衡

    1 什么是负载均衡? 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能.那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台 ...

  8. 设计模式 笔记 备忘录模式 Memento

    //---------------------------15/04/27---------------------------- //Memento 备忘录模式----对象行为型模式 /* 1:意图 ...

  9. DevOps架构下如何进行微服务性能测试?

    一. 微服务架构下的性能测试挑战 微服务与DevOps 微服务是实现DevOps的重要架构 微服务3S原则 DevOps核心点 微服务架构下的业务特点 亿级用户的平台 单服务业务随时扩容 服务之间存在 ...

  10. 强化学习算法Policy Gradient

    1 算法的优缺点 1.1 优点 在DQN算法中,神经网络输出的是动作的q值,这对于一个agent拥有少数的离散的动作还是可以的.但是如果某个agent的动作是连续的,这无疑对DQN算法是一个巨大的挑战 ...