JDBC(Java Data Base Connectivity,java数据库连接)是一种用于运行SQL语句的Java API。能够为多种关系数据库提供统一訪问。它由一组用Java语言编写的类和接口组成。

说白了,它用于直接调用 SQL 命令。

主要步骤:

1.载入JDBC驱动程序    

2.建立于数据库的连接   

3.创建一个Statement。加入相关參数

4.运行SQL语句

5.处理运行结果

6.关闭JDBC的对象

几个重要的类:

(1)

public class DriverManager extends Object

管理一组 JDBC 驱动程序的基本服务。

主要方法是:

public static Connection getConnection(String url,String user,String password)throws SQLException

试图建立到给定数据库 URL 的连接。DriverManager 试图从已注冊的 JDBC 驱动程序集中选择一个适当的驱动程序。

(2)

public interface PreparedStatement extends Statement

表示预编译的 SQL 语句的对象。 SQL 语句被预编译并存储在PreparedStatement对象中。然后能够使用此对象多次高效地运行该语句。

与Statement接口相比,Statement用于运行静态 SQL 语句并返回它所生成结果的对象。 

主要方法是:

1. void setObject(int parameterIndex,Object x) throws SQLException

使用给定对象设置指定參数的值。事实上就是为SQL语句占位符的设定实际參数。

2. intexecuteUpdate() throws SQLException

在此 PreparedStatement 对象中运行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比方 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比方 DDL 语句。 

返回:

(1) SQL 数据操作语言 (DML) 语句的行数 (2) 对于无返回内容的 SQL 语句,返回 0

3. ResultSet executeQuery() throws SQLException

在此 PreparedStatement 对象中运行 SQL 查询。并返回该查询生成的 ResultSet 对象。

返回:

包括该查询生成的数据的 ResultSet 对象;不会返回 null



(3)

留意运行executeUpdate()和executeQuery()方法返回的值发现executeQuery()返回的是一个结果集对象。

public interface ResultSet extends Wrapper

表示数据库结果集的数据表,通常通过运行查询数据库的语句生成。



主要方法是:

1. ResultSetMetaData getMetaData() throws SQLException

获取此ResultSet对象的列的编号、类型和属性。 

而ResultSetMetaData的主要方法就是 int getColumnCount() 返回此 ResultSet 对象中的列数;  String getColumnName(int column) 获取指定列的名称。

2. Object getObject(int columnIndex) throws SQLException

以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值。

实例一:MySql+JDBC

Windows用户能够再http://dev.mysql.com/downloads/windows/installer/下载MySql的自己主动配置安装版

使用Navicat作为MySql的数据库管理工具

另外还须要下载JDBC驱动程序http://dev.mysql.com/downloads/connector/j/,project须要引用里面的jar包

①新建一个工具类JdbcUtils

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class JdbcUtils {
// 数据库的登陆账号password
private final String USERNAME = "root";
private final String PASSWORD = "123456";
// JDBC驱动程序
private final String DRIVER = "com.mysql.jdbc.Driver";
// 数据库地址
private final String URL = "jdbc:mysql://localhost:3306/test"; // 三个重要类的对象
private Connection connection;
private PreparedStatement ps;
private ResultSet resultSet; public JdbcUtils() {
try {
// 步骤1:载入驱动程序
Class.forName(DRIVER);
// 步骤2:建立连接,这里的处理是当实例化这个工具类对象时就完毕这两个步骤
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (ClassNotFoundException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
} catch (SQLException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
}
} // 封装的update函数
public int update(String sql, List<Object> params) throws SQLException {
int result = 0;
// 步骤3:创建一个Statement。加入相关參数
ps = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++)
// 注意数据库的下标都是从1開始的,第i个占位符填充params的第i个值
ps.setObject(i + 1, params.get(i));
}
// 步骤4:运行SQL语句,步骤5和6则留给client处理
result = ps.executeUpdate();
return result;
} // 封装的query函数。返回的是List套个Map,数据库是以键值对的形式存储的
public List<Map<String, Object>> query(String sql, List<Object> params)
throws SQLException {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// 步骤3:创建一个Statement,加入相关參数
ps = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++)
ps.setObject(i + 1, params.get(i));
}
// 步骤4:运行SQL语句
resultSet = ps.executeQuery();
// 步骤5:处理运行结果
// 获取此ResultSet对象的列的属性
ResultSetMetaData metaData = resultSet.getMetaData();
// 列的长度
int col_len = metaData.getColumnCount();
// 若有下一条记录
while (resultSet.next()) {
// 将该条记录以map形式存储
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 0; i < col_len; i++) {
// 依据列名获得键值并存放在map中
String col_name = metaData.getColumnName(i + 1);
Object col_value = resultSet.getObject(col_name);
map.put(col_name, col_value);
}
// 将该记录加入到list中
list.add(map);
}
// 遍历完resultSet返回list
return list;
} // 封装步骤6关闭JDBC对象
public void release() {
if (resultSet != null)
try {
resultSet.close();
} catch (SQLException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
}
if (ps != null)
try {
ps.close();
} catch (SQLException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
}
if (connection != null)
try {
connection.close();
} catch (SQLException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
}
}
}

②TestMain类

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; public class TestMain { public static void main(String[] args) {
// TODO 自己主动生成的方法存根
JdbcUtils jdbcUtils = new JdbcUtils();
/*运行一:新建表*/
// String sql0 =
// "create table userinfo(id int primary key auto_increment, username varchar(64), password varchar(64))";
// try {
// jdbcUtils.update(sql0, null);
// } catch (SQLException e) {
// // TODO 自己主动生成的 catch 块
// e.printStackTrace();
// } /*运行二:添加一条记录*/
// String sql = "insert into userinfo (username,password) values(?,? )";
// List<Object> params = new ArrayList<Object>();
// params.add("jack");
// params.add("123456");
// try {
// jdbcUtils.update(sql, params);
// } catch (SQLException e) {
// // TODO 自己主动生成的 catch 块
// e.printStackTrace();
// } /*运行三:改动一条记录*/
// String sql1 = "update userinfo set username = ? where id = ?";
// List<Object> param1 = new ArrayList<Object>();
// param1.add("tommy");
// param1.add(2);
// try {
// jdbcUtils.update(sql1, param1);
// } catch (SQLException e) {
// // TODO 自己主动生成的 catch 块
// e.printStackTrace();
// } /*运行四:删除一条记录*/
// String sql2 = "delete from userinfo where username = 'tommy'";
// try {
// jdbcUtils.update(sql2, null);
// } catch (SQLException e) {
// // TODO 自己主动生成的 catch 块
// e.printStackTrace();
// } /*运行五:查询全部记录*/
// String sql3 = "select * from userinfo";
// try {
// List<Map<String, Object>> list = jdbcUtils.query(sql3, null);
// System.out.println(list);
// } catch (SQLException e) {
// // TODO 自己主动生成的 catch 块
// e.printStackTrace();
// }
} }

运行步骤一:创建一个新的表(下面说的运行步骤没有说明的话都是指单独运行,其它步骤都凝视掉)





运行步骤二:创建一个表。有三个字段,id是主键

连续运行步骤三两次:添加两条记录

运行步骤四:将第二条记录改动

运行步骤五:删除第二条记录

运行步骤六:查询到一条记录

再次运行步骤一和步骤五:查询到多条记录

实例二:应用反射机制来实现查询数据库记录

①新建一个和数据库字段匹配的类UserInfo

public class UserInfo {
private int id;
private String username;
private String password; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} @Override
public String toString() {
return "UserInfo [id=" + id + ", username=" + username + ", password="
+ password + "]";
} }

②在JdbcUtils类中加入一个应用反射机制的数据库查询函数

public <T> List<T> queryRef(String sql, List<Object> params, Class<T> cls)
throws Exception {
List<T> list = new ArrayList<>();
ps = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++)
ps.setObject(i + 1, params.get(i));
}
resultSet = ps.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int col_len = metaData.getColumnCount();
while (resultSet.next()) {
// 存在记录时,实例化一个对象
T record = cls.newInstance();
for (int i = 0; i < col_len; i++) {
String col_name = metaData.getColumnName(i + 1);
Object col_value = resultSet.getObject(col_name);
// 将列相应的值赋给对象的相应字段
Field field = cls.getDeclaredField(col_name);
field.setAccessible(true);
field.set(record, col_value);
}
// 将这条记录加入到List中
list.add(record);
}
return list;
}

③TestMain类,加入一个运行操作

/*运行六:反射机制查询记录*/
String sqlQuery = "select * from userinfo";
try {
List<UserInfo> list = jdbcUtils.queryRef(sqlQuery, null,
UserInfo.class);
System.out.println(list);
} catch (Exception e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
} finally {
jdbcUtils.release();
}

运行步骤六

数据库:JDBC编程的更多相关文章

  1. 使用jdbc编程实现对数据库的操作以及jdbc问题总结

    1.创建数据库名为mybatis. 2. 在数据库中建立两张表,user与orders表: (1)user表: (2)orders表: 3.创建工程 * 开发环境: * eclipse mars *  ...

  2. 第十三章.MySQL数据库与JDBC编程(下)

    JDBC的典型用法: JDBC4.2常用接口和类简介: DriverManager:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取Connection对象,该类包含如下方法: publi ...

  3. 单独使用jdbc编程问题总结(一)

    在学习Mybatis之前,我们先来回顾JDBC编程的相关知识.在此基础上深入的学习Mybatis框架.如有错误,敬请指正. (一)首先我们既然要使用jdbc,当然是要操作数据库了.创建一个名为:myb ...

  4. 浅谈JDBC编程

    一.概述 1.为什么要用JDBC 数据库是程序不可或缺的一部分,每一个网站和服务器的建设都需要数据库.对于大多数应用程序员(此处不包含数据库开发人员)来说,我们更多的不是在DBMS中对数据库进行操纵, ...

  5. 数据库——JDBC

    数据库--JDBC 数据库优点:降低存储数据的冗余度: 更高的数据一致性: 存储的数据可以共享: 可以建立数据库所遵循的标准: 便于维护数据完整性: 能够实现数据的安全性: 建立数据库: 数据库的存储 ...

  6. 02Mybatis_原生态jdbc编程中的问题总结——从而引生出为什么要用Mybatis

    我们先用jdbc去编写一个例子: 第一步:建表 /* SQLyog v10.2 MySQL - 5.1.72-community : Database - mybatis ************** ...

  7. JDBC编程的方式

    JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 从上面可以看出JDBC编程一般要如下步骤: 1. 加载数据库驱动 2. 创建并获取数据库连接 3. 创建jdbc stateme ...

  8. JAVA基础知识之JDBC——编程步骤及执行SQL

    JDBC编程步骤 下面以mysql数据库为例, 1.加载驱动 首先需要下载数据库的驱动jar文件,并且在eclipse包中加入到class path中去, 例如mysql的驱动文件 mysql-con ...

  9. JDBC编程步骤

    JDBC编程步骤 加载数据库驱动. 通常使用Class类的forName()静态方法来加载驱动. Class.forName(driverClass) dirverClass: mysql---Cla ...

  10. 【Java】JDBC编程套路

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5847020.html 学习Java开发,一个必须掌握的知识点,就是数据库操作.当程序需要用到的数据达到一定程度 ...

随机推荐

  1. 隐藏 Status Bar

    iOS6和iOS7在隐藏 Status Bar 三种方式比较: Storyboard 界面上选中UIViewController,最右边Simulated Metrics找到 Status Bar 设 ...

  2. 安卓开发中,什么样的功能适合抽取成 Library?

    我们都知道如果将所有的功能都写成 Library,那么我们在编写应用程序的时候就可以快速便捷的写出想要的功能,因为这些已经事先都实现过了,这样在写代码的时候就可以迅速的将 Library 依赖到我们的 ...

  3. PYTHON之DEF

    def sayHello(): print('Hello World!') while True: s = input('Enter something : ') if s == 'quit': br ...

  4. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-004-消除BEAN自动装配的歧义@QUALIFIER及自定义注解

    一. The @Qualifier annotation is the main way to work with qualifiers. It can beapplied alongside @Au ...

  5. Android开源项目发现---Layout 篇(持续更新)

    1. achartengine 强大的图标绘制工具 支持折线图.面积图.散点图.时间图.柱状图.条图.饼图.气泡图.圆环图.范围(高至低)条形图.拨号图/表.立方线图及各种图的结合 项目地址:http ...

  6. [LeetCode] 303. Range Sum Query - Immutable (Easy)

    303. Range Sum Query - Immutable class NumArray { private: vector<int> v; public: NumArray(vec ...

  7. WordPress 'is_serialized()'远程任意代码执行漏洞(CVE-2013-4338)

    漏洞版本: WordPress 3.6 漏洞描述: Bugtraq ID:62345 CVE ID:CVE-2013-4338 WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PH ...

  8. Colour your Log4Net events in your RichTextBox zz

    You’re most probably here because you have already read my article How to watch your log through you ...

  9. KTV点歌系统播放原理

    北大青鸟KTV点歌系统播放原理 指导老师--原玉明 1.首先知道有两个类(PlayList   Song) PlayList类中有一方法 public static bool AddSong(Song ...

  10. Bzoj 1687: [Usaco2005 Open]Navigating the City 城市交通 广搜,深搜

    1687: [Usaco2005 Open]Navigating the City 城市交通 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 122  So ...