一、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();}}}

  

转载于:https://www.cnblogs.com/liuwei6/p/7280399.html

Mysql(五) JDBC相关推荐

  1. mysql和JDBC学习

    1. MySQL 数据库 第一节 数据库简介 1.1 简介 ​ 数据库(DataBase,DB):指长期保存在计算机的存储设备(硬盘)上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合.简单 ...

  2. MySQL数据库+jdbc -- 笔记

    MySQL数据库 @Draven Mysql 1.连接数据库 1.1.下载可视化软件 1.2.连接数据库 1.3.连接命令 1.4.基本语法操作 2.操作数据库 2.1.操作数据库(了解) 2.2.数 ...

  3. MYSQL、JDBC

    目录 一.数据库 二.数据类型 三.表 四.列 五.数据 六.函数 七.笛卡尔集 八.子查询 九.临时表 十.表复制 十一.合并查询 十二.外连接 十三.约束 十四.自增长 十五.索引 十六.事务 十 ...

  4. HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc....Possibly consider using a shorter

    今天使用springboot遇到了这样的问题: springboot项目启动开始可以访问数据库,但是几分钟之后就会报错 idea报错信息: HikariPool-1 - Failed to valid ...

  5. Mysql和JDBC

    Linux操作mysql: 服务器端安装: sudo apt-get install mysql-server 启动服务:sudo service mysql start 查看进程中是否存在mysql ...

  6. mysql使用jdbc连接增加ssl认证

    mysql使用jdbc连接增加ssl认证 1.创建用户并指定ssl连接 grant all on . to 'imooc'@'%' identified by 'imooc require SSL; ...

  7. 警告: Could not load driverClass com.mysql.cj.jdbc.Driver

    警告: Could not load driverClass com.mysql.cj.jdbc.Driver 解决办法:检查每个配置值最后是否有空格,把鼠标放在配置值最后,如果前面有空格,去掉即可. ...

  8. mysql 时差查了13小时_Mysql 时间差了 14 或 13 小时 com.mysql.cj.jdbc.Driver

    解决办法 serverTimezone=CTT spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasour ...

  9. mysql五补充部分:SQL逻辑查询语句执行顺序

    mysql五补充部分:SQL逻辑查询语句执行顺序一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SE ...

最新文章

  1. Redis 的 8 大数据类型,写得非常好!
  2. 出现这四种情况,才是考虑分库分表的时候!
  3. 为什么叫python编程-为什么建议大家学习Python编程呢?老男孩Python入门
  4. ios开发 json数据文件的存取
  5. python进阶(十七)xml(下)
  6. hibernate.hbm2ddl.auto配置及意义
  7. 分块内存映射处理大文件-例子
  8. 爱普生SCARA机器人参考文档列表
  9. 用方框图语言表示指令周期及其流程
  10. anaconda安装numpy_Python3.8如何安装Numpy
  11. 做软件,运气、天赋、智商、勤奋,你占了几样?
  12. UNITY游戏制作流程
  13. 计算机编程和机器人编程哪个有用吗,儿童编程和机器人编程哪个好
  14. luogu P4556 [Vani有约会]雨天的尾巴
  15. 坐车看书的人都是在装逼?
  16. ubuntu中vim编辑模式退格键无法删除,方向键乱入ABCD解决方法
  17. 要么励志故事:要么孤独,要么庸俗
  18. 全民开发者时代到来!华为云开发者日深圳站成功举办
  19. xbox sdk_因此,您只是获得了Xbox Xbox。 怎么办?
  20. 什么是节点流和处理流?

热门文章

  1. 国务院学位委员会关于授予具有研究生毕业同等学力人员硕士、博士学位的规定
  2. 免费科研数据集大搜索,来源于互联网~
  3. 深度神经网络:WX+B vs XW+B,作者原文已经删除,转载过来了~~~
  4. FPGA实验三——计数器的实现并用SignalTap验证
  5. 计算机科学班(原acm班),计算机科学创新实验班(以下简称ACM班)培养计划.doc
  6. 开根号的笔算算法图解_机器学习KNN算法之手写数字识别
  7. matlab2010alinux下载,Linux matlab 2010a 下载与安装过程
  8. 量子物理 詹班 计算机,6量子物理作业答案
  9. mysql为什么使用B+树
  10. php扩展-ioncube组件的安装方法_Windows系统PHPStudy Web环境安装ionCube扩展软件