JDBC是SUN公司提供的一套用于数据库操作的接口,Java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。

  使用JDBC的好处:1、程序员不需要关注不同数据库的细节。2、编写的代码具有更好的移植性。

  下面是JDBC技术的两种实现方式,这篇文章先只介绍JDBC的手动实现,下一篇文章将介绍使用数据库连接池技术,也就是右边的路线。

  零:首先要将对应的数据库的驱动导入到项目中。

  一、获取连接

   获取连接需要四个信息,分别是:对应数据库的驱动(这里以MySQL数据库为例)、url、用户名、密码。

  但是我们一般不直接使用Driver,而是用DriverManager替换Driver来进行驱动的注册、加载、获取连接。

  我们将获取连接所需要的四个信息放在properties文件中。

  这是properties文件的代码,driverClass是对应的数据库的驱动;url的写法:jdbc:mysql:是协议,localhost:这里是ip地址,3306是对应的端口号,test是要操作的数据库的库名称。

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=1234

  接下来就是获取连接的的代码:(这里我将关闭资源、关闭连接的代码写在了一起,作为工具类使用,况且后面也会使用到)

package jdbc_1;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; public class JDBCUtils {
 /*
* 获取数据库的连接
*/
public static Connection getConnection() throws Exception {
//1.读取配置文件
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
pros.load(is); String driverClass = pros.getProperty("driverClass");
String url = pros.getProperty("url");
String user = pros.getProperty("user");
String password = pros.getProperty("password"); //2.使用反射获取Driver的实现类对象
Class clazz = Class.forName(driverClass);
Driver driver = (Driver) clazz.newInstance(); //3.利用DriverManager注册驱动
DriverManager.registerDriver(driver); //4.利用DriverManager获取连接
Connection conn = DriverManager.getConnection(url, user, password); return conn;
} /*
* 关闭资源操作
* conn是关闭的连接
* ps是要关闭的PreparedStatement,增删改查都用得到
* rs是要关闭的ResultSet,查询的操作才用得到
*/
public static void closeResource(Connection conn,Statement ps,ResultSet rs) {
try {
if(ps != null) {
ps.close();
}
}catch(SQLException e) {
e.printStackTrace();
} try {
if(conn != null) {
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
try {
if(rs != null) {
rs.close();
}
}catch (SQLException e) {
e.printStackTrace();
}
}
}

  二、使用PreparedStatement实现增删改、查操作

  注:这里我将增删改放在一起,查单独放在一边,因为查需要返回值,而增删改可以不需要返回值。

  使用PreparedStatement的好处:解决了Statement的拼接、sql注入、无法操作Blob型数据的问题,还进行更高效的批量操作。

  注意:以下的增删改查操作我都是放在JDBCUtils类里面的,作为工具使用

   /*
*通用的增删改操作
*sql中的占位符的个数应该与可变形参的长度相同!
*/
public static void update(String sql,Object...args) {
//1.获取数据库连接
Connection conn = null;
//2.预编译sql语句,返回PreparedStatement的实例
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); //3.填充占位符
for(int i = 0; i < args.length; i++) {
ps.setObject(i+1, args[i]);
//MySQL数据库中是从1开始计数的
} //4.执行
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally {
//5.关闭资源,关闭连接
JDBCUtils.closeResource(conn, ps, null);
} }

  接下来是通用的查询操作:

   /*
* 针对于不同的表的通用的查询操作,查询一条或多条记录
* 第一个参数为需要从数据库表中得到的一条数据所创建的类
* 第二个参数为查询操作的sql语句
* 第三个参数用来填充占位符
*/
public static <T> List<T> getForList(Class<T> clazz,String sql,Object...args) {
Connection conn = null ;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//2.预编译的sql语句,获取PreparedStatement对象
ps = conn.prepareStatement(sql);
//3.填充占位符
for(int i = 0; i < args.length; i++) {
ps.setObject(i+1, args[i]);
}
//4.获取结果集
rs = ps.executeQuery();
//5.获取结果集元数据
ResultSetMetaData rsmd = rs.getMetaData();
//6.获取列数
int columnCount = rsmd.getColumnCount();
//7.创建集合对象
ArrayList<T> list = new ArrayList<T>();
while(rs.next()) {
//8.通过获取类的实例
T t = clazz.newInstance();
for(int i = 0 ; i < columnCount; i++) {
//9.获取列值
Object columnValue = rs.getObject(i+1); //10.获取列的别名
String columnLabel = rsmd.getColumnLabel(i+1); //11.给每个列的别名赋予对应的列值,使用反射
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}
//12.将得到的对象添加进list中
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}finally {
//13.关闭资源
JDBCUtils.closeResource(conn, ps, rs);
} return null;
}

  三、关闭资源和关闭连接

  代码在获取连接的代码中

  以上就是本期的全部代码了,第二次写,在尽力美化排版。

  欢迎大家阅后和我交流,当然学渣能力有限,代码和知识点可能有错误,也欢迎大家告诉我!

JDBC的学习笔记-手动实现的更多相关文章

  1. ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减

    ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:手动编辑擦除.挖空.挖除.相减 1. 选中内部要素 2. c ...

  2. JDBC MYSQL 学习笔记(一) JDBC 基本使用

    1.JDBC简单介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范.称之为JDBC. JDBC全称为:Java Data Base Connectivity(java数据 ...

  3. JDBC编程学习笔记之数据库连接池的实现

    在JDBC编程的时候,获取到一个数据库连接资源是很宝贵的,倘若数据库访问量超大,而数据库连接资源又没能得到及时的释放,就会导致系统的崩溃甚至宕机.造成的损失将会是巨大的.再看有了数据库连接池的JDBC ...

  4. jdbc 接口学习笔记

    一.JDBC概念 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Jav ...

  5. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  6. JDBC 学习笔记(十一)—— JDBC 的事务支持

    1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...

  7. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  8. JDBC学习笔记一

    JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...

  9. [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. Web基础了解版10-Filter-Listener

    Filter 对于WEB应用来说,过滤器是一个驻留在服务器中的WEB组件,他可以截取客户端和WEB资源之间的请求和响应信息. 在一个WEB应用中可以部署多个过滤器,多个过滤器就组成了一个过滤器链,请求 ...

  2. DOCKER学习_004:Docker网络

    一 简介 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的docker容器会连接到这个虚拟网桥上.虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过 ...

  3. Java虚拟机详解(十一)------双亲委派模型

    在上一篇博客,我们介绍了类加载过程,包括5个阶段,分别是“加载”,“验证”,“准备”,“解析”,“初始化”,如下图所示: 本篇博客,我们来介绍Java虚拟机的双亲委派模型,在介绍之前,我先抛出一个问题 ...

  4. bash的默认组合键

    组合键 组合按键 执行结果 Ctrl+C 终止目前的命令 Ctrl+D 输入结束(EOF),例如邮件结束的时候 Ctrl+M 就是Enter啦! Ctrl+S 暂停屏幕输出 Ctrl+Q 恢复屏幕输出 ...

  5. ENS 域名注册表智能合约(ENSRegistry.sol)解析

    ENS 注册表合约是 ENS 系统中的核心合约,了解这个合约可以敲开我们理解 ENS 域名系统的大门. 打开下面的折叠区域可以查看用 Solidity 语言编写的详细代码.当前部署在以太坊中的 ENS ...

  6. 探究Dubbo的拓展机制: 下

    承接上篇, 本篇博文的主题就是认认真真捋一捋, 看一下 Dubbo是如何实现他的IOC / AOP / 以及Dubbo SPI这个拓展点的 总览: 本篇的话总体上分成两部分进行展开 第一点就是 Dub ...

  7. swiper如何禁止用户滑动

    禁止用户滑动,只需要在最外层添加class  “swiper-no-swiping” <div class="swiper-container swiper-no-swiping&qu ...

  8. 一个DNS数据包的惊险之旅

    踏上旅程 “小子,快去查一下www.paypal.com的IP地址,我急用,晚了我弄你!”,暴躁老哥一把关上了门,留我一个DNS数据包在冷冰冰的房间. 过了一会儿,一位大叔打开了门,带着我来到了一座叫 ...

  9. 图解kubernetes服务打散算法的实现源码

    在分布式调度中为了保证服务的高可用和容灾需求,通常都会讲服务在多个区域.机架.节点上平均分布,从而避免单点故障引起的服务不可用,在k8s中自然也实现了该算法即SelectorSpread, 本文就来学 ...

  10. 「BZOJ4173」数学

    题面 已知 \[\large{S(n,m)=\{k_{1},k_{2},\cdots k_{i}\}}\] 且每个 \(k\) 满足 \[\large{n \%k+m\%k\geq k}\] 求 \[ ...