一、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. 20155203 杜可欣《网络对抗技术》Exp1 PC平台逆向破解

    1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,ge ...

  2. Android开发——Android进程保活招式大全

    )前台进程(Foreground process),即用户当前操作所必需的进程,通常数量不多.举例如下: //拥有用户正在交互的 Activity(已调用 onResume()) //拥有某个 Ser ...

  3. 利用RMAN转移裸设备到文件系统

    本文只是为了个人备忘. 参考eagyle的:http://www.eygle.com/archives/2005/12/oracle_howto_move_datafile_raw.html 我首先挂 ...

  4. LOJ#2799. 「CCC 2016」生命之环

    题意 给你一个 \(n\) 个 \(\rm 01\) 组成的环,每次操作之后每个位置为1当且仅当他的左右恰好有1个1.输出进行 \(T\) 次操作之后的环. \(n\leq 10^5, T\leq 1 ...

  5. 架构师修炼 III - 掌握设计原则

    关于软件的设计原则有很多,对于设计原则的掌握.理解.实践及升华是架构师的一项极为之必要的修炼. 记得在12年前第一次阅读<敏捷开发>时,五大基本设计原则就深深地植入到我的脑海中一直影响至今 ...

  6. EF Core 新特性——Owned Entity Types

    Owned Entity Types 首先owned entity type是EF Core 2.0的新特性. 至于什么是owned entity types,可以先把他理解为EF Core官方支持的 ...

  7. 搭建CodeReivew 工具 Phabricator

    简介 现在项目成本投入高了,自然对项目的质量要求也愈来愈高,像发布好还发现明显的 bug,或性能低下这种问题已不能接受. 由于产品的质量和代码质量密切相关,而开发团队里并不是每个人都是大神,大家的经验 ...

  8. DokuWiki 使用

    新建文件夹 修改url, 将新文件夹的名称赋值给url上的id, 如要建一个"DokuWiki"的文件夹,并在文件夹下新增一个"QuickStart"的页面,改 ...

  9. Unity实现简单的AR

    ,本篇是我在博客园上第一次写随笔,有什么不对或者问题可以在评论区留言告诉我哈! 关于AR(增强现实技术(Augmented Reality))简单的概念,在这里就不说了,有兴趣的同学可以上网详细了解, ...

  10. 做游戏的小伙伴们注意了,DDoS还可以这样破!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 作者:腾讯DDoS安全专家.腾讯云游戏安全专家haroldchen 摘要:在游戏出海的过程中,DDoS攻 ...