笔记:JDBC 数据库
- 数据库 URL
在连接数据库时,我们必须使用各种与数据库类型相关的参数,例如主机名、端口号和数据库名称等,JDBC使用了一种与普通URL相类似的语法来描述数据库,JDBC URL 一般语法为:
jdbc:subprotocol:other stuff
其中 subprotocol 用于选择连接到数据库的具体驱动程序
other stuff 参数的格式随所使用的 subprotocol 不同而不同
示例:
MySQL 数据库:jdbc:mysql://localhost:port/dbname
- 注册驱动器类
某些JDBC 的JAR文件将自动注册驱动器类,在这种情况下可以跳过手动注册步骤,在驱动程序JAR文件中的 META-INF/services/java.sql.Driver 存在这个文件就表示自动注册。
如果驱动程序JAR文件不支持自动注册,那就需要找出数据库提供商使用的JDBC驱动器类名字,通过使用 DriverManager 可以在Java程序中加载驱动器类,例如:
Class.forName("驱动器类");
这条语句将使驱动器类被加载,由此执行可以注册驱动器的静态初始化器。
- 连接到数据库
使用 java.sql 包下的 DriverManager 驱动管理器类的 getConnection 方法获取数据库连接对象,在获取数据库连接对象需要传入数据库URL和用户名等验证信息,MySQL示例代码:
package org.drsoft;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl="jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName="dev";
String password="liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName,password);
conn.close();
}
}
- 执行SQL语句
在执行SQL 语句之前,首先需要创建一个Statement 对象,要创建 Statement 对象,需要使用调用 DriverManager.getConnection 方法获取获取的 Connection 对象,使用 Connection 对象调用 createStatement 方法来创建,代码示例如下:
- 执行插入/更新/删除SQL语句
package org.drsoft;
import java.sql.*;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl="jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName="dev";
String password="liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName,password);
Statement statement= conn.createStatement();
String sql="Insert Into Transit_Record(Total_Count,Total_Trade_Amt) Values(101,1023)";
int updateRowCount = statement.executeUpdate(sql);
System.out.println("executeUpdate row "+updateRowCount);
conn.close();
}
}
- 执行插入并获取自增长主键值
package org.drsoft;
import java.sql.*;
import java.text.SimpleDateFormat;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl = "jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName = "dev";
String password = "liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
String insertDataTimeSql =
"Insert Into Transit_Record(Total_Count,Total_Trade_Amt,Create_Time) Values(101,1023,?)";
PreparedStatement ps = conn.prepareStatement(insertDataTimeSql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, "2016-01-01 23:44:33");
int rowCount = ps.executeUpdate();
ResultSet keyResultSet = ps.getGeneratedKeys();
if (keyResultSet.next()) {
System.out.println("insertDateTime rowCount=" + rowCount + "\tKey=" + keyResultSet.getInt(1));
}
conn.close();
}
}
- 执行查询SQL语句
package org.drsoft;
import java.sql.*;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl = "jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName = "dev";
String password = "liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
Statement statement = conn.createStatement();
String querySql = "Select * from Transit_Record Order by Record_ID DESC Limit 0,10";
ResultSet resultSet = statement.executeQuery(querySql);
while (resultSet.next()) {
System.out.println(
"RecordID=" + resultSet.getInt("Record_ID") + "\tTotalCount=" +
resultSet.getInt("Total_Count"));
}
conn.close();
}
}
- 执行参数SQL语句
package org.drsoft;
import java.sql.*;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl = "jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName = "dev";
String password = "liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
String querySingleSql = "Select * from Transit_Record Where Record_ID = ?";
PreparedStatement preparedStatement = conn.prepareStatement(querySingleSql);
preparedStatement.setInt(1, 6624);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
System.out.println(
"RecordID=" + resultSet.getInt("Record_ID") + "\tTotalCount=" +
resultSet.getInt("Total_Count"));
}
conn.close();
}
}
- 读取 LOB
在SQL中,二进制大对象称为 BLOB,字符型大对象称为CLOB,要读取LOB,需要执行SELECT语句,然后在ResultSet 对象上调用 getBlob 或 getClob方法,这样就可以获取Blob或Clob类型对象,然后分别通过调用 getBytes 或 getBinaryStream 获取二进制数据;通过调用 getSubString 或 getCharacterStream 获取字符串数据,代码示例:
package org.drsoft;
import java.sql.*;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl = "jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName = "dev";
String password = "liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
String querySingleSql = "Select Cover from Transit_Record Where Record_ID = ?";
PreparedStatement preparedStatement = conn.prepareStatement(querySingleSql);
preparedStatement.setInt(1, 6624);
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next()) {
Blob blob = resultSet.getBlob(1);
Image coverImage ImageIo.read(blob.getBinaryStream();
}
conn.close();
}
}
- 写入LOB
要将LOB保存到数据库,需要在
Connection
对象上调用
createBlob
或
createClob,然后获取一个用于该LOB的输出流,写入数据,并将该对象存储到数据库中,示例代码:package org.drsoft;
import java.sql.*;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl = "jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName = "dev";
String password = "liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
String querySingleSql = "Insert Into Transit_Record(Cover) Values(?)";
byte[] buff = new
byte[1024];Blob newBlob = conn.createBlob();
newBlob.setBytes(0,newBlob);
PreparedStatement preparedStatement = conn.prepareStatement(querySingleSql);
preparedStatement.setInt(1, newBlob);
int updateRowCount = preparedStatement.executeUpdate();
conn.close();
}
- 调用存储过程
- 查询存储过程
package org.drsoft;
import java.sql.*;
import java.text.SimpleDateFormat;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl = "jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName = "dev";
String password = "liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
String procCallSql = "call procGet_Trade_Report(?,?)";
PreparedStatement procPreparedtatement = conn.prepareStatement(procCallSql);
procPreparedtatement.setInt(1, 1000);
procPreparedtatement.setInt(2, 4000);
ResultSet procResultSet = procPreparedtatement.executeQuery();
if (procResultSet.next()) {
System.out.println("procGet_Trade_Report SumTotalAmt=" + procResultSet.getLong(1)
+ "\tSumTotalCount=" + procResultSet.getLong(2));
}
conn.close();
}
}
- 输入和输出参数储存过程
package org.drsoft;
import java.sql.*;
import java.text.SimpleDateFormat;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl = "jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName = "dev";
String password = "liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
String procReturnCallSql = "{call procTransit_Record_Create(?,?,?)}";
CallableStatement callPreParedStatement = conn.prepareCall(procReturnCallSql);
// 第一个参数是输出参数
callPreParedStatement.registerOutParameter(1, Types.INTEGER);
callPreParedStatement.setInt(2, 1000);
callPreParedStatement.setLong(3, new
Long(4000));// 调用结果返回 true 则表示返回的是结果集,返回 false 表示结果是更新计数或没有结果
callPreParedStatement.execute();
// 获取输出参数值
System.out.println("procTransit_Record_Create Record_ID=" + callPreParedStatement.getInt(1));
conn.close();
}
}
- SQL转义
"转义"语法支持各种数据库普遍支持的特性,当是数据库使用的是与数据库相关的语法变体,因此,将转义语法转译为特定的数据库语法是JDBC驱动程序的任务之一,在LIKE子句中的转义字符,"_"和"%"字符在LIKE子句中有特殊含义,用来匹配一个字符或一个字符序列,如果需要匹配所有包含"_"的字符串,就必须使用"!"转义符
- 数据库事务
默认情况下,数据库连接处于自动提交模式,每个SQL语句一旦被提交给数据库,一旦命名被提交,就无法对他进行回滚操作,在使用事务时,需要关闭这个默认值。
package org.drsoft;
import java.sql.*;
import java.text.SimpleDateFormat;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl = "jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName = "dev";
String password = "liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
// 设置自动提交为 false
conn.setAutoCommit(false);
String procReturnCallSql = "{call procTransit_Record_Create(?,?,?)}";
CallableStatement callPreParedStatement = conn.prepareCall(procReturnCallSql);
callPreParedStatement.registerOutParameter(1, Types.INTEGER);
callPreParedStatement.setInt(2, 1000);
callPreParedStatement.setLong(3, new
Long(4000));// 调用结果返回 true 则表示返回的是结果集,返回 false 表示结果是更新计数或没有结果
callPreParedStatement.execute();
System.out.println("Record_ID=" + callPreParedStatement.getInt(1)+"\tCommit");
// 提交事务
conn.commit();
callPreParedStatement.execute();
System.out.println("Record_ID=" + callPreParedStatement.getInt(1)+"\tRollback");
callPreParedStatement.execute();
System.out.println("Record_ID=" + callPreParedStatement.getInt(1)+"\tRollback");
// 回滚事务
conn.rollback();
conn.close();
}
}
- 批量更新
如果有一个程序需要执行许多INSERT语句,以便将数据填入数据库表中,此时可以使用批量更新的方法来提高程序性能,在使用批量更新时,可以支持INSERT、UPDATE、DELETE和数据库定义语句相关。
package org.drsoft;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
public class JDBCManager {
public static
void
main(String[] args) throws SQLException {String jdbcUrl = "jdbc:mysql://192.168.94.128:3306/hibernatedb";
String userName = "dev";
String password = "liyong";
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
String sql = "Insert Into Transit_Record(Total_Count,Total_Trade_Amt,Create_Time) Values(101,1023,?)";
PreparedStatement batchStatement = conn.prepareStatement(sql);
SimpleDateFormat df = new
SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar calendar = Calendar.getInstance(Locale.CHINA);
for (int i = 0; i < 10; i++) {
calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) + 1);
batchStatement.setString(1, df.format(calendar.getTime()));
// 增加一条语句和相关参数
batchStatement.addBatch();
}
// 批量执行
int[] executeResult = batchStatement.executeBatch();
for (int i = 0; i < executeResult.length; i++) {
System.out.println("Execute Result " + executeResult[i]);
}
conn.close();
}
}
笔记:JDBC 数据库的更多相关文章
- Java学习笔记--JDBC数据库的使用
参考 hu_shengyang的专栏 : http://blog.csdn.net/hu_shengyang/article/details/6290029 一. JDBC API中提供的常用数据库 ...
- 菜鸡的Java笔记 java数据库编程(JDBC)
java数据库编程(JDBC) 介绍 JDBC 的基本功能 content (内容) 现在几乎所有的项目开发过程之中都不可能离开数据库,所以在java ...
- Java JDBC 数据库链接小结随笔
Java JDBC 数据库链接小结随笔 一.链接数据库的步骤 二.关于Statement 和 PrepareStatement 两者区别 用法 三.关于 ResultSet 的一些小结 四.自定义 ...
- Mysql数据库学习笔记之数据库索引(index)
什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...
- activemq 5.13.2 jdbc 数据库持久化 异常 找不到驱动程序
原文:https://my.oschina.net/u/2284972/blog/662033 摘要: activemq jdbc 数据库持久化 异常 找不到驱动程序 Caused by: java. ...
- Spring——JDBC——数据库
1.Spring 的数据访问哲学 数据访问的功能放到一个或者多个专注于此项任务的组件.这样的组件通常称为数据访问对象(data access object)DAO或者Repository. 为了避免应 ...
- Java封装JDBC数据库增、删、改、查操作成JAR文件,以供Web工程调用,适用于多种数据库
废话不多说,直接上源代码,最后有使用方法,当然,也可以作为普通公用类使用,只是封装成JAR更方便使用. package db.util; import java.io.BufferedReader; ...
- MongoDB学习笔记:MongoDB 数据库的命名、设计规范
MongoDB学习笔记:MongoDB 数据库的命名.设计规范 第一部分,我们先说命名规范. 文档 设计约束 UTF-8 字符 不能包含 \0 字符(空字符),这个字符标识建的结尾 . 和 $ ...
- Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作
必须的准备工作 一.MySQL的安装.可以参考博文: http://blog.csdn.net/jueblog/article/details/9499245 二.下载 jdbc 驱动.可以从在官网上 ...
随机推荐
- vscode格式化Vue出现的问题
一.VSCode中使用vetur插件格式化vue文件时,js代码会自动加上冒号和分号 本来就是简写比较方便舒服,结果一个格式化回到解放前 最后找到问题原因: 首先,vetur默认设置是这个样的.也就是 ...
- 嵌入式Linux引导过程之1.3——Xloader的sys_init
上一篇文章对XLOADER_ENTRY进行了分析,看到其中调用的第一个标号就是sys_init,本文就对这个标号对应的代码段进行粗略的分析,这里我也还有好多没有搞明白的,就先留着,日后慢慢明白,先把自 ...
- 项目总结1——excel导出相关问题
1.excel导出文件时,文件名中中文部分空白不显示的问题,原本写法是: String fileName = "物联网PBOSS主机巡检日报-" + inspectTime + & ...
- BIOS简介
BIOS简介: BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统".其实,它是一组固化到计 ...
- freemarker中的split字符串分割
freemarker中的split字符串分割 1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串 ...
- JavaWeb中jsp九大内置对象 和四大作用域
九大内置对象为 page request response session exception config application out pageContext no 内置对象 类型 1 pag ...
- Django学习-18-中间件
为了验证中间件功能和函数执行过程,手动注册3个中间件到setting.py文件中 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddlewa ...
- 事件驱动的Java框架
事件驱动的三个要素: 事件源:能够接收外部事件的源体. 侦听器:能够接收事件源通知的对象. 事件处理程序:用于处理事件的对象.
- 校园网IPv6加速
对于广大学生来说,上网是一件很纠结的事情,校园网要么按时间计费,要么按流量计费,要么是校园宽带.按时间计费速度慢,按流量计费费用高,校园宽带还不能共享,只能电脑开热点给手机上网.有没有既能提高网速又经 ...
- 初学者第二节之HelloWorld
ava具有简单性.面向对象.分布式.健壮性.安全性.平台独立与可移植性.多线程.动态性等特点.Java可以编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序等. 一.首先创建一个Hell ...