JDBC编程

快速入门

学校mysql的实验要求建立一个数据库并实现一些操作,本来就有想法学习javaweb写个小项目的,那就直接开始学JDBC!

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

// 按两次 Shift 打开“随处搜索”对话框并输入 `show whitespaces`,
// 然后按 Enter 键。现在,您可以在代码中看到空格字符。
public class Main {
    public static void main(String[] args) throws Exception {
        //连接参数
        String url = "jdbc:mysql://127.0.0.1:3306/s_t_u202211896";
        String username = "root";
        String password = "2398574";
        //注册驱动,mysql5以后不需要了
        
        //Class.forName("com.mysql.jdbc.Driver");

        //获取连接

        Connection conn = DriverManager.getConnection(url, username, password);

        //定义sql语句
        String sql = "update sc set grade = 81 where sno = '200215121'";
        //获取sql对象
        Statement stmt = conn.createStatement();
        //执行sql语句
        int count = stmt.executeUpdate(sql);
        //显示结果
        System.out.println(count);
        //关闭连接
        stmt.close();
        conn.close();
    }
}

API详解

上面是一个小例子,算是jdbc的快速入门,接下来着重学习一下几个接口和类。

DriverManager类

作用:

1.注册驱动

2.获取数据库连接

实现方法:

官方文档的介绍很抽象,直接来看两个重要方法

1.registerDriver

代码实现一般是通过反射来注册驱动的,例如

Class.forName("com.mysql.jdbc.Driver");

Driver类的代码实现如下:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

可以看到Driver类中有一个静态代码块,调用了 registerDriver方法,回顾一下java知识点,在第一次加载类的时候如果类中有静态代码块,则会执行代码块中的代码。而通过反射我们就是将这个类加载到了内存中,于是执行了其中的registerDriver方法。

因此最后仍然是通过registerDriver方法去注册驱动的。

2.getConnection

通过该方法可以获取连接,语法如下:

jdbc:mysql://ip:端口号/数据库名称?参数1&参数2&参数3&.....&参数n
实例:
jdbc:mysql://127.0.0.1:3306/s_t_u202211896
小细节:
1.如果连接的是本地的数据库,且数据库端口默认是3306,则可以简写成:
jdbc:mysql:///数据库名称?参数1&参数2&参数3&.....&参数n
2.ssl服务
在mysql版本较高时会有warning让你使用ssl安全连接的方式,但是配置较麻烦且会降低性能,因此我们可以通过useSSL=false:禁用SSL服务  让它不报错。
例如:jdbc:mysql://127.0.0.1:3306/s_t_u202211896?useSSL=flase

Connection

作用:

1.获取执行sql的对象

方法:

1.Statement CreateStatement()

获取普通的sql对象

2.PretendStatement PrepareStatement(sql)

获取预编译的sql对象(用于防止sql注入,老本行了哈哈哈)

3.CallableStatement prepareCall(sql)

执行存储过程的对象

2.事务管理

mysql中事务是指一个或多个数据库操作(dml语句),要么全部成功,要么全部回滚 (回复到事务开启前的状态)。

可以通过上面三个函数加上tyr catch来处理事务

try {
            //开启事务
            conn.setAutoCommit(false);

            //执行sql语句
            int count1 = stmt.executeUpdate(sql1);
            int count2 = stmt.executeUpdate(sql2);

            //显示结果
            System.out.println(count1);
            System.out.println(count2);

            //提交事务
            conn.commit();

        } catch (Exception e) {
            //回滚事务
            conn.rollback();
            throw new RuntimeException(e);
        }

Statement

其中DML指对表、库中数据进行操作,DDL对表、库这个整体进行操作,包括增删改

DQL指查询操作

1.executeUpdate(sql)

执行增删改操作,主要需要注意的是返回值,返回的是受影响的行数,一般可以通过返回值是否为0来判断修改是否成功,但需要注意的是用drop删除成功的时候返回的也是0

2.executeQuery

这一部分结合ResultSet api来一起讲

ResultSet

基本使用:

结果集就相当于这张表,我们通过游标(初始指向列名那一行)来一行行获得数据(通过next()方法)

ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){

    rs.getInt(id);
}

具体例子

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

// 按两次 Shift 打开“随处搜索”对话框并输入 `show whitespaces`,
// 然后按 Enter 键。现在,您可以在代码中看到空格字符。
public class ResultSet {
    public static void main(String[] args) throws Exception {
        //连接参数
        String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username = "root";
        String password = "2398574";
        //注册驱动

        //Class.forName("com.mysql.jdbc.Driver");

        //获取连接

        Connection conn = DriverManager.getConnection(url, username, password);

        //定义sql语句
        String sql = "select * from student";
        //获取sql对象
        Statement stmt = conn.createStatement();
        //执行sql语句
        java.sql.ResultSet rs = stmt.executeQuery(sql);

        //显示结果
        while(rs.next()){
            String sno = rs.getString("sno");
            String name = rs.getString("sname");
            String sex = rs.getString("ssex");
            int grade = rs.getInt("grade");
            System.out.println(sno);
            System.out.println(name);
            System.out.println(sex);
            System.out.println(grade);

        }
        //释放资源
        rs.close();
        //关闭连接
        stmt.close();
        conn.close();
    }
}

学习案例

将ResultSet封装(也就是将一张表封装成一个对象,在将所有对象封装进Arraylist)

 1.构建实体类
public class student {
    private String sno;
    private String sname;
    private String ssex;
    private int grade;

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getSsex() {
        return ssex;
    }

    public void setSsex(String ssex) {
        this.ssex = ssex;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }
}
2.封装成对象
List<student> list = new ArrayList<>();
        //显示结果
        while(rs.next()){
            student student = new student();
            String sno = rs.getString("sno");
            String name = rs.getString("sname");
            String sex = rs.getString("ssex");
            int grade = rs.getInt("grade");
            student.setSno(sno);
            student.setGrade(grade);
            student.setSname(name);
            student.setSsex(sex);
            list.add(student);

        }
        System.out.println(list);

PrepareStatement

就是将参数先?作为占位符,然后在给这些参数赋值,就可以防止sql注入(对sql注入感兴趣的可以去看看我的博客嘿嘿)。

其他没啥区别,按上面的图写就行了,不多讲了,码代码去了。

数据连接池

package com.mono.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;

public class DruidDemo {
    public static void main(String[] args) throws Exception{
        //导入jar包

        //导入配置文件

        //加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("student/src/druid.properties"));
        //获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

        //获取数据库连接
        Connection connection = dataSource.getConnection();
        System.out.println(connection);

    }
}

注意代码需要导入druid的jar包

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值