jdbc学习笔记(1):对单表完成CRUD(增删改查)操作

文章目录

  • 1.JDBC简介
    • 1.1JDBC操作步骤
  • 2.初始化数据
  • 3.新建项目(IEDA)
  • 4.jdbc-api
    • 4.1 DriverManager
      • 4.1.1常用方法
    • 4.2Connection
      • 4.2.1常用方法
    • 4.3PreparedStatement
    • 4.4ResultSet 结果集 接口
  • 5.抽取jdbc工具类
    • 5.1常见配置文件格式
    • 5.2ResourceBundle读取配置文件信息
    • 5.3完整工具类

1.JDBC简介

  • java操作数据库.jdbc是oracle公司指定的一套规范(一套接口)
  • 驱动:jdbc的实现类.由数据库厂商提供.
  • 可以通过一套规范操作不同的数据库了(多态)
  • jdbc作用:
    • 连接数据库
    • 发送sql语句
    • 处理结果

1.1JDBC操作步骤

  • 1.数据库和表
  • 2.创建项目
  • 3.导入驱动jar包
  • 4.编码
    • 注册驱动
    • 获取连接
    • 编写sql语句
    • 创建预编译的执行者
    • 设置参数
    • 执行sql
    • 处理结果
    • 释放资源

2.初始化数据

create database day07;
use day07;
create table category(
cid varchar(20) primary key,
cname varchar(20)
);
insert into category values('c001','电器');
insert into category values('c002','服饰');
insert into category values('c003','化妆品');
insert into category values('c004','书籍');

jdbc学习笔记(1):对单表完成CRUD(增删改查)操作_第1张图片

3.新建项目(IEDA)

  • 1.IDEA中新建一个java项目即可
  • 2.新建lib文件夹,存放JDBC响应的驱动jar包,并将当前jar包导入到当前项目
    jdbc学习笔记(1):对单表完成CRUD(增删改查)操作_第2张图片
  • 3.一次典型的Jdbc操作
 /**
     * 20190801
     * 1.JDBC连接数据库的标准步骤
     * 2.查询指定表的全部数据
     */
    @Test
    public void search() throws Exception{
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
//        DriverManager.registerDriver(new Driver());
        //2.获取连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day07","root","admin");
        //3.编写sql 字符串里可以不加分号
        String sql = "select * from category";
        //4.创建语句执行者
        PreparedStatement st = conn.prepareStatement(sql);
        //5.设置参数 视情况而定 sql语句中有参数才设置

        //6.执行sql
        ResultSet rs = st.executeQuery();
        //7.处理结果
        while (rs.next()){
            System.out.println(rs.getString("cid")+"::"+rs.getString("cname"));
        }

        //8.释放资源 后用先放
        rs.close();
        st.close();
        conn.close();
    }

4.jdbc-api

4.1 DriverManager

:管理一组jdbc的操作 类

4.1.1常用方法

  • 注册驱动(了解)

    • 方法1(不推荐):
      DriverManager.registerDriver(new Driver());
    

    点击查看该方法类的源码发现存在和上述注册方式一模一样的语句:
    jdbc学习笔记(1):对单表完成CRUD(增删改查)操作_第3张图片
    这就说明按上述方法注册的话,是注册了两次,这是没有必要的,我们只需要将上述静态代码块执行一次即可,类被加载到内存中会执行静态代码块,并且只执行一次,现在只需要将类加载到内存中即可

    • 方法2( ⋆ \star )
     Class.forName("com.mysql.jdbc.Driver");//包名 + 类名
    
    • 方法3
    类名.class
    
    • 方法4
    Object.class();
    
  • 获取连接(掌握)

    /*
    	参数1:告诉我们连接什么类型的数据库及连接那个数据库
    		协议:数据库类型:子协议 参数
    		mysql:	jdbc:mysql://localhost:3306/数据库名称
    		oracle:	jdbc:oracle:thin@localhost:1521@实例	
    		参数2:账户名 root
    		参数3:密码
    */
    static Connection getConnection(String url, String user, String password)
    

4.2Connection

连接 接口

4.2.1常用方法

  • 获取语句执行者:
    • (了解)Statement createStatement() :获取普通的语句执行者 会出现sql注入问题
    • ⋆ \star PreparedStatement prepareStatement(String sql) :获取预编译语句执行者
    • (了解)CallableStatement prepareCall(String sql):获取调用存储过程的语句执行者
  • 了解:
    • setAutoCommit(false) :手动开启事务
    • commit():提交事务
    • rollback():事务回滚

4.3PreparedStatement

  • Statement:语句执行者 接口
  • PreparedStatement:预编译语句执行者 接口
    • 常用方法:
      • 设置参数:

        • setXxx(int 第几个问号,Object 实际参数);
        • 常见的方法:
          • setInt
          • setString
          • setObject
      • 执行sql:

        • ResultSet executeQuery() :执行 r 语句 返回值:结果集
        • int executeUpdate() :执行cud 语句 返回值:影响的行数

4.4ResultSet 结果集 接口

执行查询结果之后返回的结果

  • 常用方法
    • boolean next():判断是否有下一条记录,若有返回true且将光标移到下一行,若没有呢则返回false
      光标一开始处于第一条记录的上面
    • 获取具体内容
      • getXXX(int|String)
      • 若参数为int :第几列
      • 若参数为string:列名(字段名)
      • 例如:
      • 获取cname的内容可以通过
        • getString(2)
        • getString(“cname”)
        • getInt
        • getString 也可以获取int值
        • getObject 可以获取任意

5.抽取jdbc工具类

在上述的代码中,注册驱动,获取连接,关闭资源等操作都是重复一致的,为了代码有更高的可维护性,这里将这些重复的部分单独抽取出来,作为一个工具类,提供静态方法。

5.1常见配置文件格式

  • .properties
    • 里面内容的格式 key=value
      jdbc学习笔记(1):对单表完成CRUD(增删改查)操作_第4张图片
  • .xml

5.2ResourceBundle读取配置文件信息

若配置文件为.properties,且在src目录下,可以通过ResourceBundle工具类来快速获取。

  • 使用步骤
    • 1.获取ResourceBundle 对象
    static ResourceBundle getBundle("文件名称不带后缀名") 
    
    • 2.通过ResourceBundle 对象获取配置信息
    String getString(String key) :通过执行key获取指定的value
    
            //利用ResourceBundle 来读取配置文件中的内容
            //由于是静态方法 可以直接调用 参数为文件名 无需后缀
            ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
            //获取指定内容 从bundle中
            DRIVERCLASS = bundle.getString("driverClass");
            URL = bundle.getString("url");
            USER = bundle.getString("user");
            PASSWORD = bundle.getString("password");
    

5.3完整工具类

package utils;
import java.sql.*;
import java.util.Collections;
import java.util.ResourceBundle;
/**
 * 20190801
 * 优化的JDBC工具类
 * 主要优化的点在于 1.将一些重复执行的代码 放在静态代码块中 这样则只需要执行一次
 * 2. 将连接数据库所需的 包名+类名 url user password放在文件里
 *
 */
public class JDBCUtils {
    //放在静态代码块外部定义 是为了解决 变量作用域的问题
    static final String DRIVERCLASS;
    static final String URL;
    static final String USER;
    static final String PASSWORD;
    static {
        //利用ResourceBundle 来读取配置文件中的内容
        //由于是静态方法 可以直接调用 参数为文件名 无需后缀
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
        //获取指定内容 从bundle中
        DRIVERCLASS = bundle.getString("driverClass");
        URL = bundle.getString("url");
        USER = bundle.getString("user");
        PASSWORD = bundle.getString("password");
    }
    //注册驱动
    static {
        try {
            Class.forName(DRIVERCLASS);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //获取连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
    /**
     * 20190801
     * @param conn 连接
     * @param st 语句执行者
     * @param rs 结果集
     */
    public static void closeResource(Connection conn, Statement st, ResultSet rs){
        closeResultSet(rs);
        closeStatement(st);
        closeConn(conn);
    }
    /**
     * 20190801
     * 关闭连接资源
     * @param conn 连接
     */
    public static void closeConn(Connection conn){
        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //就算前面的conn没有被关闭 这里置空以后 也相当于关闭
        conn = null;
    }
    /**
     * 20190801
     * 关闭连接资源
     * @param st 连接
     */
    public static void closeStatement(Statement st){
        if (st != null){
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //就算前面的conn没有被关闭 这里置空以后 也相当于关闭
        st = null;
    }
    /**
     * 20190801
     * 关闭连接资源
     * @param rs 连接
     */
    public static void closeResultSet(ResultSet rs){
        if (rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //就算前面的conn没有被关闭 这里置空以后 也相当于关闭
        rs = null;
    }
}

你可能感兴趣的:(数据库,JDBC)