通明讲JDBC(一)–认识JDBC

本章记录了jdbc的简单使用方式!

0,jdbc的作用

1,jdbc入门准备工作

2,jdbc注册驱动

3,使用jdbc对数据库CRUD

0,jdbc的作用

与数据库建立连接、发送操作数据库的语句并处理得到的结果。

1,jdbc入门准备工作

0),使用jdbc操作mysql所用到jar

mysql-connector-java-5.1.22-bin.jar

1),创建数据库qogir  用户名root 密码root

创建表use

2,jdbc注册驱动

0),注册mysql驱动(3种方式)

注册了数据库驱动,我们才能与数据库建立连接并对数据库做读写的操作。

因为驱动只需要注册一次,所以我们在静态代码块中注册它

第一种方式:使用驱动关联类来注册驱动,它的缺点是当替换数据库(比如:将mysql改为oracle)时,去除mysql的jar后,程序就会出现编译问题。

static {
  try {
    java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  } catch (SQLException e) {
    e.printStackTrace();
  }
}

查看registerDriver方法的源码:我们可以发现,驱动实际被封装到一个DriverInfo中,然后置于一个Vector之中。

第二种方式:推荐使用这种方式,方便灵活配置驱动

static{
  try {
    Class.forName("com.mysql.jdbc.Driver");
  } catch (ClassNotFoundException e) {
    throw new ExceptionInInitializerError(e);
  }
}

使用Class.forName加载驱动类,驱动类在被加载初始化时真正注册驱动

查看com.mysql.jdbc.Driver源码:可以发现,它实际还是使用了第一种方式来注册驱动

第三种方式:将描述驱动的键值对设置到系统属性中

static {
  System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
}

使用这种方式可以注册多个驱动,多个驱动以“:”分隔

比如加载 mysql 和 oracle 的驱动

System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver:oracle.jdbc.driver.OralceDriver");

在使用DriverManager获取数据库连接时,DriverManager被加载初始化

DriverManager.getConnection(url,username,password);

由源代码看到第三种方式还是使用第二种方式注册驱动,则最终还是使用第一种方式进行驱动注册。

3,使用jdbc对数据库CRUD

1),注册驱动,如上所述

2),获取数据库连接

这个url格式:jdbc:子协议:子名称//主机名:端口/数据库名

这里没有子名称, 若数据库在本地且端口号是默认端口号,则可省略localhost:3306,直接写为 jdbc:mysql:///qogir

private static String url = "jdbc:mysql://localhost:3306/qogir";
private static String username = "root";
private static String password = "root";
public static Connection getConnection() throws SQLException {
  return DriverManager.getConnection(url,username,password);
}

3),创建用于在已经建立数据库连接的基础上,向数据库发送要执行的不带参数的简单SQL语句的工具类对象

Statement statement = null;
statement = connection.createStatement();

4),向数据库发送SQL语句,获取结果集

ResultSet resultSet = null;
resultSet = statement.executeQuery("select id,name,password from user ");

5),处理结果集

while(resultSet.next()){
   System.out.println(resultSet.getString("id")+"---->"+resultSet.getString("name")+"--->"+resultSet.getString("password"));
}

6),释放资源,释放资源的顺序应该按照释放结果集,释放Statement,释放数据库连接的顺序

并且,为了不占用太多的资源,数据库连接建立到释放的时间应该尽量短。

public static void close(ResultSet rs,Statement st,Connection con){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st != null){
try{
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null){
try{
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

最后得到结果

了解了JDBC的读操作,再了解JDBC的写操作应该很容易,具体参考以下完整的程序

package jdbc;

import java.sql.*;

public final class JdbcUtils {

  private JdbcUtils(){}

  private static String url = "jdbc:mysql://localhost:3306/qogir";
  private static String username = "root";
  private static String password = "root";

  /**
   * 注册驱动 方式 1  离开驱动jar ,无法编译
   */
  /*
  static {
    try {
      java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }*/

  /**
   * 注册驱动 方式 3 装载com.mysql.jdbc.Driver  推荐的方式
   */
  /*
  static{
    try {
      Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
      throw new ExceptionInInitializerError(e);
    }
  }*/

  /**
   * 注册驱动 方式 2
   * 多个驱动 以“:”分隔
   * System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver:oracle.jdbc.driver.OralceDriver");
   */
  static {
    System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
  }

  /**
   * 建立数据库连接
   * jdbc:子协议:子名称//主机名:端口/数据库名   这里没有子名称
   * 本机,端口号是默认端口号 则可省略"localhost:3306" jdbc:mysql:///qogir
   **/
  public static Connection getConnection() throws SQLException {
    return DriverManager.getConnection(url,username,password);
  }

  /**
   * 释放资源
   */
  public static void close(ResultSet rs,Statement st,Connection con){
    if(rs != null){
      try {
        rs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if(st != null){
      try{
        st.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if(con != null){
      try{
        con.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

}
package jdbc;

import java.sql.*;

public class JdbcTest {

/**
 * 创建user
 */
public void createUsers(){
  Connection connection = null;
  Statement statement = null;
  try {
    connection = JdbcUtils.getConnection();
    statement = connection.createStatement();
    for(int i=1;i<=10;i++){
      String sql = "insert into user(id,name,password) values ("+i+",‘name"+i+"‘,‘00"+i+"‘)";
      statement.executeUpdate(sql);
    }
  } catch (SQLException e) {
    e.printStackTrace();
  }finally {
    JdbcUtils.close(null,statement,connection);
  }
}

/**
 * 更新user
 */
public void updateUsers(){
  Connection connection = null;
  Statement statement = null;
  try {
    connection = JdbcUtils.getConnection();
    statement = connection.createStatement();
    for(int i=1;i<=10;i++){
      String sql = "update user set name=‘abc"+i+"‘ where id="+i;
      statement.executeUpdate(sql);
    }
  } catch (SQLException e) {
    e.printStackTrace();
  }finally {
    JdbcUtils.close(null,statement,connection);
  }
}

/**
 * 删除user
 */
public void deleteUsers(){
  Connection connection = null;
  Statement statement = null;
  try {
    connection = JdbcUtils.getConnection();
    statement = connection.createStatement();
    String sql = "delete from user where 1=1 ";
    int i = statement.executeUpdate(sql);
    System.out.println("删除了"+i+"条数据!");
  } catch (SQLException e) {
    e.printStackTrace();
  }finally {
    JdbcUtils.close(null,statement,connection);
  }
}

/**
 * 读user
 */
public void readUsers(){
  Connection connection = null;
  Statement statement = null;
  ResultSet resultSet = null;
  try {
    /**
     * 2,建立数据库连接
     */
    connection = JdbcUtils.getConnection();
    /**
     * 3,创建用于在已经建立数据库连接的基础上,向数据库发送要执行的不带参数的简单SQL语句的工具类对象
     */
    statement = connection.createStatement();
    /**
     * 4,向数据库发送SQL语句,获取结果集
     */
    resultSet = statement.executeQuery("select id,name,password from user ");
    /**
     * 5,处理结果
     */
    while(resultSet.next()){
      System.out.println(resultSet.getString("id")+"---->"+resultSet.getString("name")+"--->"+resultSet.getString("password"));
    }
  } catch (SQLException e) {
    e.printStackTrace();
  }finally {
    /**
     * 6,释放资源
     */
    JdbcUtils.close(resultSet,statement,connection);
  }
  }

  public static void main(String[] args){

    //new JdbcTest().createUsers();
    //new JdbcTest().updateUsers();
    //new JdbcTest().deleteUsers();
    new JdbcTest().readUsers();
  }

}
时间: 2024-11-08 22:29:12

通明讲JDBC(一)–认识JDBC的相关文章

理解JNDI中 java:comp/env/jdbc/datasource 与 jdbc/datasource 的不同之处(转)

在描述JNDI,例如获得数据源时,JNDI地址有两种写法,例如同是  jdbc/testDS 数据源: A:java:comp/env/jdbc/testDS B:jdbc/testDS   这两种写法,配置的方式也不尽相同,第一种方法应该算是一种利于程序移植或迁移的方法,它的实现与“映射”的概念相同,而B方法,则是一个硬引用. java:comp/env 是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来J

【JDBC】使用JDBC连接Oracle数据库(JAVA反射机制)

db.properties文件 driverClassName=oracle.jdbc.OracleDriver url=jdbc:oracle:thin:@localhost:1521:xe username=system password=123456 db.properties JDBCUtilProperties.java文件 对数据连接和释放资源的封装, package com.xdl.util; import java.io.IOException; import java.io.I

【JDBC】实现JDBC实现银行的转账事务

JDBC中的事务是默认提交的,也就是说每执行一次PreparedStatement,那么数据就会被写入到磁盘.如果需要关闭默认提交,使用  void setAutoCommit(false)  . db.properties driverClassName=oracle.jdbc.OracleDriver url=jdbc:oracle:thin:@localhost:1521:xe username=system password=517839 db.properties JDBCUtilPr

Leopard Jdbc:简化Spring Jdbc使用

Leopard Jdbc:简化Spring Jdbc使用 学习如何在旧项目中使用Leopard Jdbc. 本指南将引导您完成使用Leopard Jdbc操作MySQL. How to complete this guide 你可以从头开始并完成每一个步骤,或者您可以绕过你已经熟悉的基本设置步骤.无论哪种方式,你最终都可以得到可工作的代码. 1.配置maven依赖 在dao模块的pom.xml加入 <dependencies> [...] <dependency> <grou

老调重弹:JDBC系列 之 &lt;JDBC层次结构和基本构成&gt;

前言 最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,老调重弹,好好总结一番,作为自己的笔记,也是给读者一个参考---本篇博文是我的上篇博文老调重弹:JDBC系列 之 <驱动加载原理全面解析>的续文,主要梳理一下JDBC的层次结构和基本构成.以下是本文的组织内容(用户可以点击上面的目录栏查看): JDBC的层次结构 总体而言,JDBC包含以下几大角色 : Driver.DriverMan

spring+mybatis整合,org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class &#39;${jdbc.driverClassName}

在使用spring+mybatis时会出现Cannot load JDBC driver class ${jdbc.driverClassName}之类的出错. 原因是在spring里使用org.mybatis.spring.mapper.MapperScannerConfigurer 进行自动扫描的时候,设置了sqlSessionFactory 的话,可能会导致PropertyPlaceholderConfigurer失效,也就是用${jdbc.username}这样之类的表达式,将无法获取到

[Java 8 &amp; Spring JDBC] 使用Spring JDBC和Lambda表达式简化DAO

使用Spring JDBC和Lambda表达式简化DAO 如果你需要向数据库中插入一条Item记录,那么会有类似下面的代码: Item对应的实体类型为: public class Item { public int name; public BigDecimal price; } public void create(Item item) throws IOException { PreparedStatement ps = null; try { Connection con = templa

事务的学习,从jdbc开始:jdbc对事务的支持与实现

在使用spring对项目进行开发时,所有的事务都是由spring来管理的.这样一来我们就可以不需要操心事务,可以专心的处理业务代码. 但是,事务的底层究竟是如何实现的呢?那就从jdbc开始学习. 在使用jdbc与数据库交互时,都是通过Connection来操作的. 默认情况下,Connection会自动提交事务,即每执行一条SQL语句,也就对应一个事务. 但是在开发过程中,一个事务通常会管理一组SQL统一的提交,来保证数据的安全. 这时,就需要Connection#setAutoCommit(f

JDBC【介绍JDBC、使用JDBC连接数据库、简单的工具类】

什么是JDBC JDBC全称为:Java Data Base Connectivity,它是可以执行SQL语句的Java API 为什么我们要用JDBC 市面上有非常多的数据库,本来我们是需要根据不同的数据库学习不同的API,sun公司为了简化这个操作,定义了JDBC API[接口] sun公司只是提供了JDBC API[接口],数据库厂商负责实现. 对于我们来说,操作数据库都是在JDBC API[接口]上,使用不同的数据库,只要用数据库厂商提供的数据库驱动程序即可 这大大简化了我们的学习成本