JDBC

JDBC概述

  • JDBC(Java DataBase Connectivity)java数据库连接
  • 是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
  • 有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库.
  • Java API中提供了操作数据库的标准接口,最终由不同的数据库开发商实现这些标准接口来对数据库操作.

JDBC API

供程序员调用的接口与类,集成在java.sql包中

  • DriverManager类作用:管理各种不同的jDBC驱动
  • Connection 接口 与特定数据库的连接
  • Statement 接口 执行sql
  • PreparedStatement接口 执行sql
  • ResultSet接口 接收查询结果

JDBC搭建

JDBC搭建步骤

  1. 导入MySQL数据库驱动包
  2. 加载数据库驱动(博主目前用的是mysql8)
  3. 建立与数据库的连接
  4. 向数据库发送sql语句
  5. 接收查询语句
  6. 关闭数据库连接

1.导入MySQL数据库驱动包

  • 在工程目录下新建 lib 目录,将需要的jar包复制到该目录下
  • 将jar包引入工程
  • 编写程序

点击File --> project structure
在这里插入图片描述
根据图示步骤走
在这里插入图片描述
在这里插入图片描述
点开Java后,我们选择刚刚创建的工程下的建立lib文件的MySQL驱动包

在这里插入图片描述
之后确定,应用即可

到此,我们就将MySQL驱动包导入到IDEA中了
在这里插入图片描述

2.加载数据库驱动

  • 方式一 Class.forName(“com.mysql.cj.jdbc.Driver”);
  • 方式二 DriverManager.registerDriver(new Driver());
		// mysql 5 的驱动
        Class.forName("com.mysql.jdbc.Driver");
		
		// 加载驱动方式1
        try {
            // 利用反射机制加载driver类
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 加载驱动方式2
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

3.建立数据库连接

            //  jdbc:mysql:// "ip:端口号" / 数据库名 ? 参数(键=值) & 参数(键=值)
            String url = "jdbc:mysql://127.0.0.1:3306/yhlz_db?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
            // 参数 地址,用户名(数据库),密码(数据库)
            Connection c = DriverManager.getConnection(url,"root","password");

4.向数据库发送sql语句

  • 方式1: connection.createStatement()
  • 方式2: connection.prepareStatement()
方式一
			String name = "迪迦";
            String sex = "男";
            int phone = 911;
            int grade = 2;
            String time = "2021-01-12";
            
            /* 2种发送方式
                    // 获得statement,向数据库发送sql语句(静态)
                    1.connection.createStatement()
                    // 预编译
                    2.connection.prepareStatement()
             */
             
            Statement s1 = c.createStatement();
            
            // ddl语句 execute() 返回值boolean类型
            s1.execute("create table test(id int,name varchar(10))");
            s1.execute("drop table test");

            // dml语句 executeUpdate() 增删改查  返回值int类型
            // 添加语句
            s1.executeUpdate("insert into t_student(t_student_id,t_student_name,t_student_sex,t_student_phone,t_student_grade_id,t_student_date) values(null,'"+name+"','"+sex+"',"+phone+","+grade+",'"+time+"')");

            // 更新语句
            s1.executeUpdate("update t_student set t_student_sex = '"+sex+"' where t_student_id = 5");

            // 删除语句
            s1.executeUpdate("delete from t_student where t_student_id = 6");

	

原表信息
在这里插入图片描述
在添加时我们要注意,插入的值

如果我们要添加的数据是字符串的话

那么我们需要 这样写 记住口则 : 单引 + 双引 + 双加

就是这样的 ‘"+ 参数 +"’
如果不是字符串的话不用加单引 : 双引 + 双加

	 		// 添加语句
            s1.executeUpdate("insert into t_student(t_student_id,t_student_name,t_student_sex,t_student_phone,t_student_grade_id,t_student_date) values(null,'"+name+"','"+sex+"',"+phone+","+grade+",'"+time+"')");

这里主键t_student_id 是7的原因是博主之前测试了一次,故而再次创建时,主键就变为了7
在这里插入图片描述

			// 更新语句
            s1.executeUpdate("update t_student set t_student_sex = '"+sex+"' where t_student_id = 5");

在这里插入图片描述

			// 删除语句
            s1.executeUpdate("delete from t_student where t_student_id = 7");

执行后我们就会发现id=7的信息被删除了
在这里插入图片描述

方式二
			// 方式2: preparedStatement
			// 将sql语句预编译到PreparedStatement,?是占位符,表示每个位置的值
            PreparedStatement p = c.prepareStatement("insert into t_student(t_student_name,t_student_sex,t_student_phone,t_student_grade_id,t_student_date) values(?,?,?,?,?)");
            // 然后通过指定方法向sql语句中的占位符赋值
            p.setString(1,name);
            p.setString(2,sex);
            p.setInt(3,phone);
            p.setInt(4,grade);
            p.setString(5,time);
            // 预编译好,数据赋值后,然后发送
            p.executeUpdate();

在这里插入图片描述

createStatement 和 preparedStatement
  • 前者每executeUpdate一次,就会向数据库发送一条sql语句
  • 后者代码可读性高,效率高,安全性高,防止sql注入

5.接收查询语句

  • executeQuery()
  • 只能是dql语句

这里我们一般选择第二个方法,通过列名获取数据库中的数据
在这里插入图片描述

connection.createStatement() 下的查询

我们创建Student类来接收数据库中stu表的数据

package com.ff.slg.jdbc.day2;

/**
 * @ClassName Student
 * @Description 接收数据库中的stu表信息
 * @Author 码农天宇
 * @Date 2021/1/21 11:37
 * @Version 1.0
 */

public class Student {
    private String name;
    private String sex;
    private int num;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", num=" + num +
                ", address='" + address + '\'' +
                '}';
    }
}

			// 接收查询结果 只能是 dql语句 executeQuery()将查询结果封装在ResultSet中,可以多条
            ResultSet r = s1.executeQuery("select stu_name,stu_sex,stu_num,address from yhlz_stu where stu_age > 15");
            // 将resultset中的结果提取出来
            ArrayList<Teacher> list = new ArrayList<Teacher>();
            // 将resultset中的结果提取出来 
            while(r.next()){
                // 创建学生对象 ,用来接收封装查询出来的数据
                Student st = new Student();
                st.setNum(r.getInt("stu_num"));
                st.setName(r.getString("stu_name"));
                st.setSex(r.getString("stu_sex"));
                st.setAddress(r.getString("address"));
                list.add(st);
            }
            System.out.println(list);

原表信息
在这里插入图片描述
查询结果
在这里插入图片描述

connection.preparedStament() 下的查询

同理,我们创建Teacher类,接收数据库中stu表的信息

package com.ff.slg.jdbc.day2;

/**
 * @ClassName Teacher
 * @Description 接收数据库中的tea表信息
 * @Author 码农天宇
 * @Date 2021/1/21 11:22
 * @Version 1.0
 */

public class Teacher {
    private String name;
    private String sex;
    private int num;
    private String home;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getHome() {
        return home;
    }

    public void setHome(String home) {
        this.home = home;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", num=" + num +
                ", home='" + home + '\'' +
                '}';
    }
}

            PreparedStatement p2 = c.prepareStatement("select tea_name,tea_sex,tea_num,tea_home from yhlz_tea where tea_age > ?");
            p2.setInt(1,2);
            
            // 接收查询结果 只能是 dql语句 executeQuery()将查询结果封装在ResultSet中,可以多条
            ResultSet r = p2.executeQuery();
            ArrayList<Teacher> list = new ArrayList<Teacher>();
            // 将resultset中的结果提取出来  next()方法是
            while(r.next()){
                // 创建老师对象 ,用来接收封装查询出来的数据
                Teacher t = new Teacher();
                t.setNum(r.getInt("tea_num"));
                t.setName(r.getString("tea_name"));
                t.setSex(r.getString("tea_sex"));
                t.setHome(r.getString("tea_home"));
                list.add(t);
            }
            System.out.println(list);

原表信息
在这里插入图片描述

查询结果
在这里插入图片描述

6.关闭数据库连接

			r.close();
			s1.close();
            c.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值