内容简介:jdbc是一种Java编程语言和各种数据库之间在没有JDBC之前,我们需要编写不同的程序对接不同厂商的数据库系统,像下图所示,需要针对不同的数据库api编程,可想而知,当我们需要更换数据库系统而产生的大量重复工作,增加不必要的开发成本而JDBC的出现,统一了Java程序访问不同数据库系统的api,应用程序通过调用JDBC来操作数据库时,实际上是右数据库系统厂商提供的JDBC驱动程序来完成的。这样一来,即使要更换数据库系统,也仅仅是更换相应的驱动程序就可以了。(本文使用mysql的驱动程序)
jdbc是一种 Java 编程语言和各种数据库之间 数据库无关
连接的行业标准, JDBC API为基于 SQL 的数据库访问提供了调用级API
数据库无关
在没有JDBC之前,我们需要编写不同的程序对接不同厂商的数据库系统,像下图所示,需要针对不同的数据库api编程,可想而知,当我们需要更换数据库系统而产生的大量重复工作,增加不必要的开发成本
而JDBC的出现,统一了Java程序访问不同数据库系统的api,应用程序通过调用JDBC来操作数据库时,实际上是右数据库系统厂商提供的JDBC驱动程序来完成的。这样一来,即使要更换数据库系统,也仅仅是更换相应的驱动程序就可以了。(本文使用 mysql 的驱动程序)
JDBC API主要完成以下三个工作:
- 建立与数据库的连接或访问任何表格数据源
- 发送SQL语句到数据库
- 处理数据返回的结果
这三个工作中都有其对应的jdbc api来完成各自的任务。应用程序可以使用这些api 来操作数据库系统了
JDBC API
DriverManager
管理JDBC驱动的服务类,主要功能是获取 Connection
对象(示例程序中的第2步)
getConnection方法
Connection getConnection(url,username,password)
- url写法:jdbc:mysql://localhost:3306/mydb 本地数据库简写:jdbc:mysql:///mydb
- jdbc:协议
- mysql:子协议
- localhost:主机名
- 3306:端口号
- mydb:数据库名称
Connection
数据库连接对象,每个 Connection
对象表示一个连接会话。
Connection的常用方法
1. 返回 Statement
对象
-
Statement createStatement()
-
PreparedStatement PreparedStatement(String sql)
:Statement
的子类,将SQL语句提交到数据库进行预编译 -
CallableStatement prepareCall(String sql)
:Statement
的子类,处理存储过程
2. 处理事务的常用方法
-
void setAutoCommit(boolean autoCommit)
:设置是否自动提交,默认true
-
void commit
:提交事务 -
void rollback
:事务回滚 -
Savepoint setSavepoint
:创建一个保存点 -
Savepoint setSavepoint(Stirng name)
:指定名称来创建一个保存点 -
void rollback(Savepoint savepoint)
:将事务回滚到指定的保存点 -
void setTransactionIsolation(int level)
:设置事务隔离级别
Statement
执行具体的SQL语句,以及执行DDL、DCL、DML语句。
Statement子类 PreparedStatement
预编译的 Statement
对象
SQL语句一次编译多次执行
允许数据库预编译SQL语句(常带有参数或者叫占位符),这样一来,以后每次只需要改变SQL命令的参数,而不需要每次都编译SQL语句,性能得到了提升
PreparedStatement主要方法
-
void setXXX(int parmIndex,XXX value)
:设置预编译语句的参数
Statement常用方法
-
ResultSet executeQuery(String sql)
:只能执行查询语句,返回ResultSet
-
int executeUpdate(String sql)
:主要用于执行DML语句的,返回受影响行数。 -
boolean execute(String sql)
:执行任何SQL语句 -
addBatch(String sql)
:添加到批处理 -
executeBatch()
:执行批处理 -
clearBatch()
:清空批处理
ResultSet
结果集:查询结果的封装
ResultSet主要方法
移动指针的方法
-
next()
:移动指针到ResultSet记录的下一行,如果存在该条记录返回true
- .......
获取当前行、指定列的值
getInt()、getString() <T> T getObject(int columnIndex,Class<T> type)、<T> T getObject(String columnLabel,Class<T> type)
JDBC实际操作
建库建表的SQL语句
-- 建库 CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci; -- 建表 CREATE TABLE IF NOT EXISTS `user`( `id` INT UNSIGNED AUTO_INCREMENT, `username` VARCHAR(100) NOT NULL, `password` VARCHAR(40) NOT NULL, `name` VARCHAR(40) NOT NULL, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; 复制代码
示例程序框架
我们会在业务逻辑代码start的地方开始具体的执行操作
public void excute() throws SQLException { Connection conn = null; PreparedStatement smt = null; ResultSet resultset = null; try { //1、加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2、获取Connection对象 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8", "root", "******"); if (conn != null) { System.out.println("连接成功"); } conn.setAutoCommit(false); //业务逻辑代码start //插入数据操作 String insertSql = "insert into user(username,password,name) values(?,?,?)"; smt = conn.prepareStatement(insertSql); smt.setString(1, "xiaoming"); smt.setString(2, "123"); smt.setString(3, "小明"); int result = smt.executeUpdate(); if (result > 0) { System.out.println("添加成功"); } smt.clearParameters(); //修改数据操作 String updateSql = "update user set name=? where id=?"; smt = conn.prepareStatement(updateSql); smt.setString(1, "小牛"); smt.setInt(2, 2); int updateResult = smt.executeUpdate(); if (updateResult > 0) { System.out.println("修改成功"); } smt.clearParameters(); //查询数据操作 String sql = "select *from user where id =?"; smt= conn.prepareStatement(sql); smt.setInt(1,3); resultset = smt.executeQuery(); while (resultset.next()) { int uid = resultset.getInt("id"); System.out.println(String.format("id:%s,username:%s,password:%s,name:%s", uid, resultset.getString("username"), resultset.getString("password"), resultset.getString("name"))); } //业务逻辑代码end conn.commit(); } catch (Exception e) { System.out.println(e); conn.rollback(); } //4、释放资源 写到finally里面,防止报错不能执行资源回收 finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if (smt != null) { try { smt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (resultset != null) { try { resultset.close(); } catch (SQLException e) { e.printStackTrace(); } } } } 复制代码
执行结果
连接成功 添加成功 修改成功 id:3,username:xiaoming,password:123,name:小明 复制代码
业务逻辑代码中如果有错误,连接对象将执行回滚操作,保证数据的一致性。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- MyBatis从入门到精通(一):MyBatis入门
- MyBatis从入门到精通(一):MyBatis入门
- Charles 从入门到精通
- MAT 入门到精通(一)
- Git 从入门到精通
- Webpack入门到精通(1)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learning Python, 5th Edition
Mark Lutz / O'Reilly Media / 2013-7-6 / USD 64.99
If you want to write efficient, high-quality code that's easily integrated with other languages and tools, this hands-on book will help you be productive with Python quickly. Learning Python, Fifth Ed......一起来看看 《Learning Python, 5th Edition》 这本书的介绍吧!