java JDBC 学习笔记

二、JDBC

1、概念 :

Java DataBase Connectivity Java 数据库连接, Java语言操作数据库

JDBC本质 : 其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

2、快速入门

使用步骤:

  1. 导入驱动 Jar 包.
  2. 注册驱动
  3. 获取数据库连接对象 Connection
  4. 定义Sql 语句
  5. 获取执行Sql语句的对象
  6. 执行Sql,接收结果
  7. 处理结果
  8. 释放资源

代码实现 :

public class Test01 {
    public static void main(String[] args) throws SQLException {
        Connection conn = null;
        Statement statement = null;
        ResultSet resultSet = null;
        //1、导入jar包
        //2、注册驱动
       try {
           //把字节码文件加载进内存
           Class.forName("com.mysql.jdbc.Driver");
           //3.获取数据库连接对象
           conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/springtest",
                   "root", "1314520");
           //4、定义Sql语句
           String sql = "select * from user";
           //5、获取执行sql的对象
           statement = conn.createStatement();
           resultSet = statement.executeQuery(sql);
           while (resultSet.next()){
               Integer uid = resultSet.getInt("uid");
               String uname = resultSet.getString("uname");
               String usex = resultSet.getString("usex");
               Integer pid = resultSet.getInt("pid");
               System.out.println(uid+" "+uname+" "+usex+" "+pid);
           }
       }catch (Exception e){
           e.printStackTrace();
       }finally {
           if (resultSet != null)
               resultSet.close();
           if (statement != null)
               statement.close();
           if (conn != null)
               conn.close();
       }
    }
}

3、详解各个对象:

1.DriverManager : 驱动管理对象

  • 注册驱动,告诉程序该使用哪一个驱动Jar包

​ static void registerDriver(Driver driver, DriverAction da) -->注册与给定的驱动程序 DriverManager 。

​ 在Class.forName(“com.mysql.jdbc.Driver”); -->把字节码文件加载进内存

​ 查看源码发现 :在com.mysql.jdbc.Driver类中存在静态代码块(类被加载就会执行)

static{
        try{
            java.sql.DriverManager.registerDriver(new Driver());
        }catch (SQLException E) {
            throw new RuntimeException("can't register driver! ");
        }
    }

Mysql5之后的jar包可以省略 Class.forName(“com.mysql.jdbc.Driver”) 语句

原因:

mysql-connector-java-5.1.29-bin\META-INF\services中java.sql.Driver文件里面帮我们写了。

  • 获取数据库连接

    方法:static Connection getConnection(String url, String user, String password)
    参数:

    • url 指定连接得路径。
      • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
    • user 数据库对应的用户名
    • password 数据库对应的密码

2.Connection : 数据库连接对象

  • 获取执行Sql的对象

    Statement createStatement( )

    PreparedStatement prepareStatement(String sql)

  • 管理事务

    事务: 一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败

    1、开启事务 --在执行sql之前开启事务

    void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。

    ​ 参数为 false 时,即开启事务。

    2、提交事务 --当所有sql都执行完提交事务

    void commit( )
    ​ 使自上次提交/回滚以来所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。

    3、回滚事务 --在catch中回滚事务

    void rollback( )
    ​ 撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。

3.statement : 执行sql的对象

  • 执行Sql

    1、boolean execute(String sql)

    ​ 执行给定的SQL语句,这可能会返回多个结果

    2、int executeUpdate(String sql)
    执行给定的SQL语句,这可能是 INSERT , UPDATE ,或 DELETE语句,或者不返回任何内容,

    ​ 返回值 :数据库表受到影响的行数

    3、 ResultSet executeQuery(String sql)
    执行给定的SQL语句,这可能是查询语句。该语句返回单个 ResultSet 对象

4.Resultset : 结果集对象

  • boolean next( ) 将光标从当前位置向前移动一行。光标初始指向表头。
  • getxxx( 要获取列名/或列的编号 ) xxx代表数据类型 如getString(“uname”),getInt(1)。
    • 编号从 1 开始

5.Preparedstatement : 执行sql的对象(可对参数进行预处理)

  1. SQL注入问题∶在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题

    1. 输入用户随便,输入密码:a’ or ‘a’ = 'a
    2. sql : select * from user where username = ‘fhdsjkf’ and password ‘1’ or ‘1’ = ‘1’
  2. 解决sql注入问题 : 使用 Preparedstatement 对象来解决

  3. 预编译的sQL:参数使用 ? 作为 占位符.

  4. 定义 sql

    • 注意 : sql的参数使用 ? 作为占位符。

      如 : selectfrom user where username = ? and password = ? ;

  5. 获取执行sqi语句的对象 Preparedstatement Connection.prepareStatement(String sql)

  6. 给 ? 赋值∶
    方法 : setxxx(参数1,参数2)
    参教1 : ? 的位置编号 参数2∶?的值

    注意 :编号从1开始

  7. 执行sql,接受返回结果,不需要传递sql语句

4、JDBCUtils

JDBCUtils将常用的数据库连接、释放资源等操作抽取出来,作为一个工具类使用。以此来简化代码,提升速度。同时将数据库相关信息的修改都以配置文件的方式来修改,使用更加灵活,不必频繁改动代码。

1、配置文件

​ --存放于项目目录下 src中,名称为 jdbc.properties

注意 :每个人的习惯不同,所以目录结构也不同,因此配置文件的命名、存放位置等可能不同。

​ 配置文件目录结构 :
在这里插入图片描述

​ 配置文件模板:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名
user=用户名
password=密码

关于MySQL8.x 和 5.x 的URL和Driver的写法

​ 1、MySQL 5.x

url = jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8
driver = com.mysql.jdbc.Driver

2、MySQL 8.x

url = jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
drive = com.mysql.cj.jdbc.Driver

Tip: ?useUnicode=true&characterEncoding=utf8 用于处理数据库中文变 ?.

serverTimezone=Asia/Shanghai 时区问题, 将时区设置为你所在的地方,这里以 亚洲上海为例。

2、JDBCUtils类

package com.lly.util;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
 * @ClassName:JDBCUtils
 * @创建者: LLY
 * @创建时间: 2021/5/31 11:42
 * @version: 1.0
 * @描述: JDBC工具类
 */
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private  static String driver;

    /**
     * 文件读取,只会执行一次,使用静态代码块
     */
    static {
        //读取文件,获取值
        try {
            //1.创建Properties集合类
            Properties pro = new Properties();
            //获取src路径下的文件--->ClassLoader类加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL resource = classLoader.getResource("jdbc.properties");;
            String path = resource.getPath();
            //2.加载文件
            pro.load(new FileReader(path));
            //3获取数据
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //4.注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取连接
     * @return 连接对象
     */
    public static Connection getConnection() throws SQLException {
        Connection conn = DriverManager.getConnection(url, user, password);
        return conn;
    }

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

3、使用示例

1、配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/springtest
user=匿了
password=匿了
2、数据库表

在这里插入图片描述

3、查询类
package com.lly.test;

import com.lly.util.JDBCUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @ClassName:JDBCUtilTest
 * @创建者: LLY
 * @创建时间: 2021/5/31 11:55
 * @version: 1.0
 * @描述:
 */
public class JDBCUtilTest {
    public static void main(String[] args) throws SQLException {
        Connection conn = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try{
            conn = JDBCUtils.getConnection();
            String QuerySql = "select * from user";
            statement = conn.createStatement();
            resultSet = statement.executeQuery(QuerySql);
            while (resultSet.next()){
                Integer uid = resultSet.getInt("uid");
                String uname = resultSet.getString("uname");
                String usex = resultSet.getString("usex");
                Integer pid = resultSet.getInt("pid");
                System.out.println(uid+" "+uname+" "+usex+" "+pid);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCUtils.close(resultSet, statement, conn);
        }
    }
}
4、最后结果
E:\Program\JAVA\JDK1.8X64\bin\java.exe ...
1 李斯 男 9
2 武则天 雌 19
3 ggb 雄 3
41 屠呦呦 女 5
42 钟南山 男 4
45 吴天祥 男 1
46 聂海胜 男 1
48 钱学森 男 2

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值