一万年太久,只争朝夕

What JDBC

上部

JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持

java.sql包中定义的常用的基本的 JDBC API:

类 DriverManager-管理一组 JDBC 驱动程序的基本服务 接口 Connection-获得与特定数据库的连接

接口 Statement-用于执行静态 SQL 语句并返回它所生成结果的对象

接口 ResultSet-表示数据库结果集的数据表,通常通过执行

查询数据库的语句生成 类 SQLException-有关数据库操作的异常

使用JDBC 访问数据库的前提条件

数据库的主机地址(IP地址)localhost 127.0.0.1 如果你访问的是别人的数据库,记得输入别人的IP

端口号:oracle 1521 ,MySql 3306, SqlServer 1433 因为我连得数据库是oracle,Ojdbc14.jar包,千万别忘了

数据的用户名/密码

JDBC核心API

Driver接口:驱动程序接口

Connection connect(String url, Properties info) 用于连接数据库的方法

可以使用驱动程序管理类获取这样的连接

DriverManager.getConnection(String url, String user, String password)

Connection 接口 :代表和数据库的连接

Statement createStatement() 创建Statement接口的对象

PreparedStatement prepareStatement(String sql) 创建PreparedStatement接口的对象

Statement接口 用于执行静态sql语句

int executeUpdate(String sql) 执行DDL和DML语句,如果不记得什么是DDL和DML,可以参考上一篇oracle基础

ResultSet executeQuery(String sql) 执行DQL语句,同理

PreparedStatement接口 : 用于执行预编译的sql语句

int executeUpdate(String sql) 执行DDL和DML语句

ResultSet executeQuery(String sql) 执行DQL语句

ResultSet接口:表示数据库的结果集

boolean next() 将光标转移到下一行的位置

getXXX() 获取结果集中每列的值

很少用,了解

CallableStatement prepareCall(String sql)

CallableStatement接口 :(了解)用于存储过程的SQL语句

 下部

详解DriverManager类

用DriverManager加载驱动,,获得与数据库的连接,

驱动设备管理器进行连接

Driver driver = new oracle.jdbc.OracleDriver();

DriverManager.registerDriver(driver);

//推荐使用该方法

//驱动程序(只注册一次)

Class.forName("oracle.jdbc.driver.OracleDriver");

关于url 的写法

jdbc:oracle:thin:@localhost:1521:orcl

详解Connection

用于与数据库的连接,数据库与客户端的打交道都是由Connection方法来完成的,常用方法:

createStatement():创建向数据库发送sql的statement对象。

prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。

setAutoCommit(boolean autoCommit):设置事务是否自动提交。

commit() :提交事务。

rollback() :回滚事务。

详解Statement 接口

Statement对象用于向数据库发送SQL语句, Statement对象常用方法:

executeQuery(String sql) :用于向数据发送查询语句。

executeUpdate(String sql):用于向数据库发送insert、update或delete语句

详解ResultSet 接口

ResultSet用于代表Sql语句的执行结果。开始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
  ResultSet既然获得数据库执行后的对象,提供了获取数据的get 方法
  获取指定类型的数据,例如:
    getString(int index)
    getString(String columnName)

  ResultSet还提供了对结果集进行滚动的方法:

next():移动到下一行

关于释放资源:

切记一点,一定要记得关闭,还有就是先开的后关,后开的先关。

详解部分参照API文档:

代码展示

目录结构:

 package Jdbc;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; /**
* statement 用于执行静态sql 但是实际开发很少用, PreparedStatement :用于执行预编译的sql语句
* @author Administrator
*
*/
public class FirstJdbc { private static String user = "scott";
private static String password = "tiger";
private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; public static void main(String[] args) throws ClassNotFoundException, SQLException { // 加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //获取数据库连接 Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn);
// 下面是输出 conn 的结果 ;证明数据库连接成功
//oracle.jdbc.driver.T4CConnection@5afec107 //准备sql语句
String sql = "select * from userinfo"; //获取用于向数据库发送sql语句的statement
Statement stmt = conn.createStatement();
//获取数据库连接对象
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){ System.out.println("uname="+rs.getString("uname"));
System.out.println("upass="+rs.getString("upass"));
}
//关闭连接,释放资源(遵循原则 先开喉管)
rs.close();
stmt.close();
conn.close();
} }
 package Jdbc;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class SecondJdbc { /**
* PreparedStatement :用于执行预编译的sql语句,动态拼接sql ?作为占位符, 可以有效的防止Sql注入的问题
*
*/
private static Connection conn = null;
private static String user = "scott";
private static String password = "tiger";
private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; public static void main(String[] args) throws ClassNotFoundException, SQLException { //为了使页面使页面干净,在这里处理的异常都向外抛出
// TODO Auto-generated method stub // 加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //获取数据库连接 Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn);
// 下面是输出 conn 的结果 ;证明数据库连接成功
//oracle.jdbc.driver.T4CConnection@5afec107 //准备sql语句
String sql = "insert into userinfo(uname,upass)values (?,?)"; //获取用于向数据库发送sql语句的preparedStatement
PreparedStatement stmt = conn.prepareStatement(sql);
//设置参数 注意这里的参数设置从1开始,不像数组等下标从0开始
stmt.setString(1,"张作霖");
stmt.setString(2, "123");
//获取数据库连接对象
int count = stmt.executeUpdate();
//事务处理
if(count>0){
conn.commit();
}else{
//这里的rollback肯定执行不了,因为上面执行的sql(insert)用户名是可以重复的,用重名的可能性
conn.rollback();
}
System.out.println("影响了"+count+"行");
//关闭连接,释放资源(遵循原则 先开喉管) stmt.close();
conn.close();
} }
 package Jdbc;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource; /**
* 为了日后开发方便,不用频繁的获取驱动,获取连接,
* 定义url ,数据库,用户名 等参数,所以自己封装Jdbc工具类
*
*/
public class JdbcUtils { //定义url 数据库用户名和密码
private static Connection conn = null;
private static PreparedStatement pst;
private static String user = "scott";
private static String password = "tiger";
private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; private JdbcUtils() {
} //单例模式
public static Connection getcConnection() {
if (conn == null) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, user, password);
System.out.println("获取connection连接成功"); } catch (ClassNotFoundException e) {
System.out.println("加载驱动失败");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("连接数据库失败");
e.printStackTrace();
}
}
return conn; }
//之前用作数据库连接池连接,自己封装,如果没有用请忽略
/* public static Connection getPoolConnection(){
if(conn==null){
try {
Context context = new InitialContext();
DataSource ds =
(DataSource) context.lookup("java:/comp/env/jdbc/oracleds");
conn = ds.getConnection();
System.out.println("连接池数据库成功!");
} catch (NamingException e) {
System.out.println("连接池数据库失败!");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("连接池数据库失败!");
e.printStackTrace();
}
} return conn;
}*/ //关闭连接
public static void close() { try {
if (conn != null) {
conn.close();
conn = null;
}
if (pst != null) {
pst.close();
pst = null;
}
System.out.println("关闭成功");
} catch (SQLException e) {
System.out.println("关闭失败");
e.printStackTrace();
} } // 执行更新操作
public static int executeUpdate(String sql, Object[] obj) {
int count = 0; try {
pst = conn.prepareStatement(sql);
if (obj != null) {
for (int i = 0; i < obj.length; i++) {
pst.setObject(i + 1, obj[i]);
}
}
count = pst.executeUpdate();
} catch (SQLException e) {
count = 0;
e.printStackTrace();
} return count;
}
//执行查询操作,带参数
public static ResultSet executeQuery(String sql, Object obj[]) {
ResultSet rs = null;
try {
pst = conn.prepareStatement(sql);
if (obj != null) {
for (int i = 0; i < obj.length; i++) {
pst.setObject(i + 1, obj[i]);
}
}
rs = pst.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return rs;
}
//执行查询操作.无参数
public static ResultSet executeQuery(String sql) {
ResultSet rs = null; try {
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return rs;
}
//开始事物
public static void beginTransation() {
try {
conn.setAutoCommit(false);
System.out.println("开始事物");
} catch (SQLException e) {
System.out.println("开始事物失败");
e.printStackTrace();
} }
//提交事物
public static void commit() {
try {
conn.commit();
System.out.println("提交事物");
} catch (SQLException e) {
System.out.println("提交事物失败");
e.printStackTrace();
} }
//回滚事物
public static void rollback(){
try {
conn.rollback();
System.out.println("回滚事务");
} catch (SQLException e) {
System.out.println("回滚事务失败");
e.printStackTrace();
}
}
}

数据库表

select * from userinfo;

第一次代码FirstJdbc 执行的结果:

第二次代码SecondJdbc 执行的结果:

Jdbc访问数据库篇的更多相关文章

  1. 如何通过JDBC访问数据库

    Java数据库连接(JDBC)用与在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口,java.sql包中包含了JDBC操作数据库 ...

  2. java web中Jdbc访问数据库步骤通俗解释(吃饭),与MVC的通俗解释(做饭)

    一.Jdbc访问数据库步骤通俗解释(吃饭) 1)加载驱动 Class.forName(“com.microsoft.jdbc.sqlserver.SQLServer”); 2) 与数据库建立连接 Co ...

  3. 2017.10.3 JDBC访问数据库的建立过程

    1·JDBC访问数据库,其访问流程: (1)注册驱动 (2)建立连接(Connection) (3)创建数据库操作对象用于执行SQL语句 (4)执行语句 (5)处理执行结果 (6)释放资源 2·注册驱 ...

  4. JDBC访问数据库的具体步骤(MySql + Oracle + SQLServer)

    * 感谢DT课堂颜群老师的视频讲解(讲的十分仔细,文末有视频链接) import java.sql.Connection; import java.sql.DriverManager; import ...

  5. Spring实战6:利用Spring和JDBC访问数据库

    主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRep ...

  6. 【jdbc访问数据库获取执行sql转换json】

    Talk is cheap.Show me your code. import java.sql.*; import java.util.HashMap; import java.util.Map; ...

  7. javaweb三、JDBC访问数据库

    JDBC是J2SE的内容,是由java提供的访问数据库的接口,但没有提供具体的实现方法,需要数据库厂商提供,就是对应的数据库驱动. 这样的好处是可以方便的更换数据库,提高了扩展性.这也是面向接口编程的 ...

  8. java之连接数据库之JDBC访问数据库的基本操作

    1.将数据库的JDBC驱动加载到classpath中,在基于JavaEE的web应用实际开发过程中通常要把目标数据库产品的JDBC驱动复制到WEB—INF/lib下. 2.加载JDBC驱动并将其注册到 ...

  9. Spring学习(四)——使用Spring JDBC访问数据库

    本篇我们将在上一篇http://www.cnblogs.com/wenjingu/p/3824294.html的Demo程序的基础上增加数据持久层和业务层,实现登录验证功能. 1.修改gradle文件 ...

随机推荐

  1. Python实战之双向队列deque/queue学习笔记及简单练习

    ['__add__', '__bool__', '__class__', '__contains__', '__copy__', '__delattr__', '__delitem__', '__di ...

  2. vue2购物车ch3-(过滤器使用 单件商品金额计算 全选全不选 总金额计算 删除商品功能)

    1 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  3. zoj3953 Intervals 最大不重叠区间加强版 zoj排名第一~

    Intervals Time Limit: 1 Second      Memory Limit:65536 KB      Special Judge Chiaki has n intervals ...

  4. DevOps之服务器

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <服务器(Server)> DevOps之服务器划分为三部分:系统.虚拟化.器件. ...

  5. linux_base_commond_one

    1.cd commond a. cd usr 切换到该目录下usr目录  b. cd ../ 切换到上一层目录  c.cd / 切换到系统根目录  d. cd ~ 切换到用户主目录 e. cd - 切 ...

  6. 【解决方案】客户端请求数据较大时,nginx返回数据被截断

    [问题描述]:客户端使用curl命令向nginx请求数据,当返回数据量较大时,数据被截断,客户端无法获取完整的数据. [问题原因]:nginx配置文件中包含了proxy_buffer_size.pro ...

  7. Numpy的小总结

    1.Numpy是什么? numpy是Python的一个科学计算库,提供矩阵运算的功能. 1.1Numpy的导入 import numpy as np #一般都是用numpy的别名来进行操作 1.2Nu ...

  8. 深入理解Java虚拟机--中

    深入理解Java虚拟机--中 第6章 类文件结构 6.2 无关性的基石 无关性的基石:有许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码(ByteCode),从而 ...

  9. Yii2之mailer的使用

     Mailer组件是yii框架自带的用于收发邮件的组件,无需安装,只需做一些配置即可使用,非常便捷.本文就mailer组件从配置到使用进行简单讲解.  首先在config/main.php配置如下: ...

  10. LeetCode 548. Split Array with Equal Sum (分割数组使得子数组的和都相同)$

    Given an array with n integers, you need to find if there are triplets (i, j, k) which satisfies fol ...