1.Connection 

  • Java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现
  • 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现
  • 通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例

@Test
public void testDBDynamicDriver() throws Exception {
// 1.读取配置文件
Properties prop = new Properties();
InputStream in = null;
try {
in = new FileInputStream(new File("jdbc.properties")); prop.load(in);
} catch (Exception e1) {
e1.printStackTrace();
}
String url = prop.getProperty("db.url");
String user = prop.getProperty("db.user");
String password = prop.getProperty("db.password");
String driverPath = prop.getProperty("db.driver"); // 2.配置properties,Normally at least "user" and "password" properties should be
// included in the Properties object. Properties jdbcprop = new Properties();
jdbcprop.put("user", user);
jdbcprop.put("password", password);
Class<?> driverClass = Class.forName(driverPath);
Driver driver = (Driver) driverClass.newInstance(); Connection conn = driver.connect(url, jdbcprop);
in.close();
System.out.println(conn);
} @Test
public void testDBDriverManager() throws Exception {
// 1.读取配置文件
Properties prop = new Properties();
InputStream in = null;
try {
in = new FileInputStream(new File("jdbc.properties")); prop.load(in);
} catch (Exception e1) {
e1.printStackTrace();
}
String url = prop.getProperty("db.url");
String user = prop.getProperty("db.user");
String password = prop.getProperty("db.password");
String driverPath = prop.getProperty("db.driver"); // 2.加载数据库驱动程序
//实际应该这样写,但是在mysql driver的静态代码块会被执行实例和注册
DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());
//Class.forName(driverPath);
Connection conn = DriverManager.getConnection(url, user, password);
in.close();
System.out.println(conn);
}

 2.Statement 

  • 通过调用 Connection 对象的 createStatement 方法创建该对象
  • 该对象用于执行静态的 SQL 语句,并且返回执行结果
  • Statement 接口中定义了下列方法用于执行 SQL 语句:

  –      ResultSet excuteQuery(String sql)

  –      int excuteUpdate(String sql)

@Test
public void testDBStatement() throws Exception {
// 1.读取配置文件
Properties prop = new Properties();
InputStream in = null;
try {
in = new FileInputStream(new File("jdbc.properties"));
prop.load(in);
} catch (Exception e1) {
e1.printStackTrace();
}
String url = prop.getProperty("db.url");
String user = prop.getProperty("db.user");
String password = prop.getProperty("db.password");
String driverPath = prop.getProperty("db.driver"); // 2.加载数据库驱动程序
// 实际应该这样写,但是在mysql driver的静态代码块会被执行实例和注册
DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());
// Class.forName(driverPath);
Connection conn = DriverManager.getConnection(url, user, password);
in.close();
System.out.println(conn); // 3.获得Statement
Statement statement = conn.createStatement();
ResultSet ret = statement.executeQuery("select * from teacher");
while (ret.next()) { System.out.println(ret.getString("name"));
} statement.executeUpdate("update teacher set name = 'Johnson李' where id = '1'");
// 先关闭Statement
statement.close();
// 再关闭Connection
conn.close();
}

3.ResultSet

  • 通过调用 Statement 对象的 excuteQuery() 方法创建该对象
  • ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现
  • ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行
  • ResultSet 接口的常用方法:

    –      boolean next()

    –      getString()

    –      …

 4.PreparedStatement

  • 可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象
  • PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
  • PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值
public void testDBPreparedStatement() throws Exception {
// 1.读取配置文件
Properties prop = new Properties();
InputStream in = null;
try {
in = new FileInputStream(new File("jdbc.properties"));
prop.load(in);
} catch (Exception e1) {
e1.printStackTrace();
}
String url = prop.getProperty("db.url");
String user = prop.getProperty("db.user");
String password = prop.getProperty("db.password");
String driverPath = prop.getProperty("db.driver"); // 2.加载数据库驱动程序
// 实际应该这样写,但是在mysql driver的静态代码块会被执行实例和注册
DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());
// Class.forName(driverPath);
Connection conn = DriverManager.getConnection(url, user, password);
in.close();
System.out.println(conn); // 3.获得Statement
PreparedStatement preparedStatement = conn
.prepareStatement("insert into teacher (name,address,year) values(?,?,?)");
preparedStatement.setString(1, "wiker");
preparedStatement.setString(2, "海富大厦");
preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
int ret = preparedStatement.executeUpdate(); System.out.println(ret);
// 先关闭Statement
preparedStatement.close();
// 再关闭Connection
conn.close();
}

 

5.Oracle LOB 和 Mysql BLOB

Oracle LOB

  • LOB,即Large Objects(大对象)是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。
  • LOB 分为两种类型:内部LOB和外部LOB。

–      内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。Oracle支持三种类型的内部LOB:

  • BLOB(二进制数据)
  • CLOB(单字节字符数据)
  • NCLOB(多字节字符数据)。

–      CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频,文件等

目前只支持一种外部LOB类型,即BFILE类型。在数据库内,该类型仅存储数据在操作系统中的位置信息,而数据的实体以外部文件的形式存在于操作系统的文件系统中。因而,该类型所表示的数据是只读的,不参与事务。该类型可帮助用户管理大量的由外部程序访问的文件。

Mysql BLOB

MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。

MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)

实际使用中根据需要存入的数据大小定义不同的BLOB类型。
需要注意的是:如果存储的文件过大,数据库的性能会下降。

@Test
public void testDBBlob() throws Exception {
// 1.读取配置文件
Properties prop = new Properties();
InputStream in = null;
try {
in = new FileInputStream(new File("jdbc.properties"));
prop.load(in);
} catch (Exception e1) {
e1.printStackTrace();
}
String url = prop.getProperty("db.url");
String user = prop.getProperty("db.user");
String password = prop.getProperty("db.password");
String driverPath = prop.getProperty("db.driver"); // 2.加载数据库驱动程序
// 实际应该这样写,但是在mysql driver的静态代码块会被执行实例和注册
DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());
// Class.forName(driverPath);
Connection conn = DriverManager.getConnection(url, user, password);
in.close();
System.out.println(conn); // 3.获得Statement
PreparedStatement preparedStatement = conn.prepareStatement("insert into picture (picture) values(?)");
InputStream inputStream = new FileInputStream(new File("F:\\照片\\Camera\\IMG_20160719_103500.jpg"));
preparedStatement.setBlob(1, inputStream); int ret = preparedStatement.executeUpdate();
inputStream.close();
System.out.println(ret);
// 先关闭Statement
preparedStatement.close();
// 再关闭Connection
conn.close();
}

6.Apache—DBUtils简介

  • commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
  • API介绍:

  –      org.apache.commons.dbutils.QueryRunner

  –      org.apache.commons.dbutils.ResultSetHandler

  • 工具类

  –     org.apache.commons.dbutils.DbUtils、

package com.atguigu.jdbc;

import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import org.apache.commons.dbutils.QueryLoader;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test; /**
* 测试 DBUtils 工具类
*
*/
public class DBUtilsTest { /**
* QueryLoader: 可以用来加载存放着 SQL 语句的资源文件.
* 使用该类可以把 SQL 语句外置化到一个资源文件中. 以提供更好的解耦
* @throws IOException
*/
@Test
public void testQueryLoader() throws IOException{
// / 代表类路径的根目录.
Map<String, String> sqls =
QueryLoader.instance().load("/sql.properties"); String updateSql = sqls.get("UPDATE_CUSTOMER");
System.out.println(updateSql);
} /**
* 1. ResultSetHandler 的作用: QueryRunner 的 query 方法的返回值最终取决于
* query 方法的 ResultHandler 参数的 hanlde 方法的返回值.
*
* 2. BeanListHandler: 把结果集转为一个 Bean 的 List, 并返回. Bean 的类型在
* 创建 BeanListHanlder 对象时以 Class 对象的方式传入. 可以适应列的别名来映射
* JavaBean 的属性名:
* String sql = "SELECT id, name customerName, email, birth " +
* "FROM customers WHERE id = ?";
*
* BeanListHandler(Class<T> type)
*
* 3. BeanHandler: 把结果集转为一个 Bean, 并返回. Bean 的类型在创建 BeanHandler
* 对象时以 Class 对象的方式传入
* BeanHandler(Class<T> type)
*
* 4. MapHandler: 把结果集转为一个 Map 对象, 并返回. 若结果集中有多条记录, 仅返回
* 第一条记录对应的 Map 对象. Map 的键: 列名(而非列的别名), 值: 列的值
*
* 5. MapListHandler: 把结果集转为一个 Map 对象的集合, 并返回.
* Map 的键: 列名(而非列的别名), 值: 列的值
*
* 6. ScalarHandler: 可以返回指定列的一个值或返回一个统计函数的值.
*/ @Test
public void testScalarHandler(){
Connection connection = null;
QueryRunner queryRunner = new QueryRunner(); String sql = "SELECT name FROM customers " +
"WHERE id = ?"; try {
connection = JDBCTools.getConnection();
Object count = queryRunner.query(connection, sql,
new ScalarHandler(), 6); System.out.println(count);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, connection);
}
} @Test
public void testMapListHandler(){
Connection connection = null;
QueryRunner queryRunner = new QueryRunner(); String sql = "SELECT id, name, email, birth " +
"FROM customers"; try {
connection = JDBCTools.getConnection();
List<Map<String, Object>> mapList = queryRunner.query(connection,
sql, new MapListHandler()); System.out.println(mapList);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, connection);
}
} @Test
public void testMapHandler(){
Connection connection = null;
QueryRunner queryRunner = new QueryRunner(); String sql = "SELECT id, name customerName, email, birth " +
"FROM customers WHERE id = ?"; try {
connection = JDBCTools.getConnection();
Map<String, Object> map = queryRunner.query(connection,
sql, new MapHandler(), 4); System.out.println(map);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, connection);
}
} /**
* 测试 ResultSetHandler 的 BeanListHandler 实现类
* BeanListHandler: 把结果集转为一个 Bean 的 List. 该 Bean
* 的类型在创建 BeanListHandler 对象时传入:
*
* new BeanListHandler<>(Customer.class)
*
*/
@Test
public void testBeanListHandler(){
String sql = "SELECT id, name customerName, email, birth " +
"FROM customers"; //1. 创建 QueryRunner 对象
QueryRunner queryRunner = new QueryRunner(); Connection conn = null; try {
conn = JDBCTools.getConnection(); Object object = queryRunner.query(conn, sql,
new BeanListHandler<>(Customer.class)); System.out.println(object);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, conn);
}
} /**
* 测试 QueryRunner 的 query 方法
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test
public void testResultSetHandler(){
String sql = "SELECT id, name, email, birth " +
"FROM customers"; //1. 创建 QueryRunner 对象
QueryRunner queryRunner = new QueryRunner(); Connection conn = null; try {
conn = JDBCTools.getConnection();
/**
* 2. 调用 query 方法:
* ResultSetHandler 参数的作用: query 方法的返回值直接取决于
* ResultSetHandler 的 hanlde(ResultSet rs) 是如何实现的. 实际上, 在
* QueryRunner 类的 query 方法中也是调用了 ResultSetHandler 的 handle()
* 方法作为返回值的。
*/
Object object = queryRunner.query(conn, sql,
new ResultSetHandler(){
@Override
public Object handle(ResultSet rs) throws SQLException {
List<Customer> customers = new ArrayList<>(); while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String email = rs.getString(3);
Date birth = rs.getDate(4); Customer customer =
new Customer(id, name, email, birth);
customers.add(customer);
} return customers;
}
} ); System.out.println(object);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, conn);
} } /**
* 测试 QueryRunner 类的 update 方法
* 该方法可用于 INSERT, UPDATE 和 DELETE
*/
@Test
public void testQueryRunnerUpdate() {
//1. 创建 QueryRunner 的实现类
QueryRunner queryRunner = new QueryRunner(); String sql = "DELETE FROM customers " +
"WHERE id IN (?,?)"; Connection connection = null; try {
connection = JDBCTools.getConnection();
//2. 使用其 update 方法
queryRunner.update(connection,
sql, 12, 13);
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, null, connection);
} } }

JDBC获得数据库连接及使用的更多相关文章

  1. JAVA jdbc获取数据库连接

    JDBC获取数据库连接的帮助类 import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManage ...

  2. 数据库连接JDBC和数据库连接池C3P0自定义的java封装类

    数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...

  3. JDBC 关闭数据库连接与自动提交【转】

    // Jdbc关闭数据库连接时,会隐含一个提交事务的操作 private final static String DB_DRIVER = "oracle.jdbc.driver.Oracle ...

  4. Java -- JDBC 学习--数据库连接池

    JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...

  5. Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用

    DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...

  6. 基于JDBC的数据库连接池技术研究与应用

    引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...

  7. 在IDEA中使用JDBC获取数据库连接时的报错及解决办法

    在IDEA中使用JDBC获取数据库连接时,有时会报错Sat Dec 19 19:32:18 CST 2020 WARN: Establishing SSL connection without ser ...

  8. jdbc java数据库连接 3)Statement接口之执行DDL和DML语句的简化

    上一章的代码中,可以发现,jdbc执行DDL和DML有几个步骤都是一样的: 1)执行语句开始时,创建驱动注册对象.获取连接的数据库对象.创建Statement对象 // 创建驱动注册对象 Class. ...

  9. JDBC【数据库连接池、DbUtils框架、分页】

    1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接 ...

  10. JDBC获取数据库连接

    是什么? JDBC:Java Data Base Connectivity(java数据库连接) 为什么用? sun公司提供JDBC API接口,数据库厂商来提供实现 我们需要用哪个数据库就加载那个数 ...

随机推荐

  1. Mina代码跟踪(1)

    1  NioSocketAcceptor类关系图 1.1 NioSocketAcceptor acceptor = new NioSocketAcceptor(5); NioSocketAccepto ...

  2. 自定义cginc文件

    首先定义一个cginc文件如下所示: #ifndef MY_CG_INCLUDE #define MY_CG_INCLUDE struct appdata_x { float4 vertex : PO ...

  3. centos7.0 增加/usr分区的容量减少home分区的大小

    把/home内容备份,然后将/home文件系统所在的逻辑卷删除,扩大/root文件系统,新建/home:tar cvf /tmp/home.tar /home #备份/homeumount /home ...

  4. 成功扩展live555支持ipv6,同时支持RTSPServer & RTSPClient

    live555对ipv6的扩展 从live555的官网看live555的发展历史,实在是历史悠久,保守估计已经发展了至少16年以上了,同时,这也导致了live555在很多架构和考虑上面不能满足现代化的 ...

  5. 【python】-- 类的继承(新式类/经典类)、多态

    继承 之前我们说到了类的公有属性和类的私有属性,其实就是类的封装,现在准备随笔的 是继承,是面向对象的第二大特性. 面向对象编程 (OOP) 语言的一个主要功能就是“继承”.继承是指这样一种能力:它可 ...

  6. PoC简介

    无线一键通功能,POC(PTT Over Cellular)也称PTT(Push To Talk)功能.PTT:一键通(Push-to-Talk)功能是一种全新的移动技术,可以快速地进行"一 ...

  7. java访问微信接口发送消息

    最近在开发activiti流程的时候有个需求:流程到达每个审批节点后,需要向该节点的审批人发送一个消息,提示有审批需要处理. 参考了一下微信的开发者文档和网络上的一些技术博客,现在记录一下.以便后续继 ...

  8. 关于highcharts-ng

    1.内容都正确但是不显示,使用parseInt()方法转换

  9. SVM学习笔记(一)

    支持向量机即Support Vector Machine,简称SVM.一听这个名字,就有眩晕的感觉.支持(Support).向量(Vector).机器(Machine),这三个毫无关联的词,硬生生地凑 ...

  10. Android Studio support 26.0.0-alpha1 Failed to resolve: com.android.support:appcompat-v7:27.+ 报错解决方法

    AS下如何生成自定义的.jks签名文件, 以及如何生成数字签名 链接:http://www.cnblogs.com/smyhvae/p/4456420.html 链接:http://blog.csdn ...