jdbc

4 篇文章 0 订阅

Java数据库连接(Java Database Connectivity,简称JDBC)

jdbc是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。

jdbc的搭建步骤

1.导入数据库开发商提供的数据库连接实现类的jar文件
(方法:
第一步:在该新建的项目上右击点击new,选中directory新建文件lib,将.jar文件复制进去。
第二步:点击idea的file->Project Structure -> libraries -> “+” -> java -> 选中该项目下之前复制的.jar文件 -> ok)
2.加载驱动(jdbc8以后可以不写,会自动加载)
3.建立与数据库的连接
4.向数据库发送SQL语句
5.执行完后关闭与数据库的连接通道
eg1:

package com.ff.javajdbc;

import com.mysql.cj.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Demo1 {
    /*
    jdbc的搭建步骤
    1.导入数据库开发商提供的数据库连接实现类的jar文件
    (方法:
    第一步:在该新建的项目上右击点击new,选中directory新建文件lib,将.jar文件复制进去。
    第二步:idea的file->Project Structure -> libraries -> "+" -> java -> 选中该项目下之前复制的.jar文件 -> ok)
    2.加载驱动(jdbc8以后可以不写,会自动加载)
    3.建立与数据库的连接
    4.向数据库发送SQL语句
    5.执行完后关闭与数据库的连接通道
     */
    public static void main(String[] args) {
        //new Driver() 检测是否导入正确时看new Driver()是否在 com.mysql.cj.jdbc.Driver;中

            /* //加载驱动方法1
            Class.forName("com.mysql.cj.jdbc.Driver");
            //加载驱动方法2
            DriverManager.registerDriver(new Driver());*/

        //用Statement建立与数据库的连接
        String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding=utf8&useSSL=false&serverTimezone = UTC";

        try {
            Connection connection = DriverManager.getConnection(url, "root", "13579");
            //Statement 向数据库发送SQL语句
            Statement statement = connection.createStatement();
            statement.executeUpdate("insert into grade(name) values ('五年级')");

            //执行完后关闭与数据库的连接通道
            statement.close();
            connection.close();

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

eg2:

package com.ff.javajdbc;

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

public class Demo2 {
    public static void main(String[] args) {
        try {
            //characterEncoding = utf8 编码过滤  useSSL=false可以不写
            String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding = utf8&useSSL=false&serverTimezone = UTC";
            //connection 对象就是与数据库进行连接的通道
            Connection connection = DriverManager.getConnection(url, "root", "13579");
            Statement statement = connection.createStatement();
            //executeUpdate("create  table book(id int,name varchar (15))");
            //executeUpdate 发送SQL语句(ddl、dml)到数据库,返回的是所操作的行数
            int result = statement.executeUpdate("create  table book(id int,name varchar (15))");
            System.out.println(result); //返回结果为0
            statement.close();
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

eg3:

package com.ff.javajdbc;

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

public class Demo3 {
    public static void main(String[] args) {
        try {
            String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding = utf8&useSSL=false&serverTimezone =UTC";
            Connection connection = DriverManager.getConnection(url, "root", "13579");
            Statement statement = connection.createStatement();
            //模拟从前端提交过来的数据
            String name = "Tom";
            String sex = "女";
            String birthday = "2020-12-25";
            String phone = "12345678912";
            int grade_id = 3;
            int score = 90;
            //执行SQL语句,为SQL使用变量赋值
            statement.executeUpdate("INSERT INTO t_student(NAME, sex,birthday,phone,grade_id,reg_time,score)" +
                    "VALUES('" + name + "','" + sex + "','" + birthday + "','" + phone + "'," + grade_id + ",now()," + score + ")");

            statement.close();
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

eg4:

package com.ff.javajdbc;

import java.sql.*;

//使用PerpareStatement向数据库发送SQL语句,PerpareStatement会进行预编译
public class Demo4 {
    public static void main(String[] args) {
        try {
            String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding = utf8&useSSL=false&serverTimezone =UTC";
            Connection connection = DriverManager.getConnection(url, "root", "13579");
            //模拟从前端提交过来的数据
            int num = 5;
            String name = "Jery";
            String sex = "女";
            String birthday = "2020-12-25";
            String phone = "12345678912";
            int grade_id = 3;
            int score = 90;
            //执行SQL语句,为SQL使用变量赋值
            String sql = "INSERT INTO t_student(NAME,sex,birthday,phone,grade_id,reg_time,score)" +
                    " VALUES(?,?,?,?,?,?,?)";
            //预先将SQL语句编译到 PerpareStatement对象中
            PreparedStatement ps = connection.prepareStatement(sql);

            //向SQL中的占位符进行赋值操作
            ps.setString(1, name);
            ps.setString(2, sex);
            //ps.setDate(3, Date.valueOf(birthday));//执行后时间改变
            ps.setObject(3, birthday);
            ps.setString(4, phone);
            ps.setInt(5, grade_id);
            ps.setObject(6, new java.util.Date());
            ps.setInt(7, score);

            int result = ps.executeUpdate();//执行
            System.out.println(result);

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

              /*
                 PreparedStatement  与 Statement 区别

                 Statement:
                     1.静态sql执行,每操作一次向数据库编译发送一次,效率低
                     2.将变量以字符串的形式拼接进去,书写很麻烦
                     3.不能防止sql注入,安全性低

                 PreparedStatement
                     1.预先将sql语句编译到PreparedStatement对象中可以重复使用,效率高
                     2.使用set方法向占位符处进行设置值,书写方便
                     3.可以防止sql注入,安全性高
               */

eg5:

package com.ff.javajdbc;

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

//执行后将对应表中所有数据都删除
public class Demo5 {
    public static void main(String[] args) {
        try {
            String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding = utf8&useSSL=false&serverTimezone =UTC";
            Connection connection = DriverManager.getConnection(url, "root", "13579");
            Statement statement = connection.createStatement();
            //暴力的SQL注入,直接将值拼接到字符串中,没有做任何处理,不能防止SQL注入
            String n = "'陕西' or 1= 1";
            int result = statement.executeUpdate("delete from t_area where name =" + n);
            System.out.println(result);
            statement.close();
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

eg6:

package com.ff.javajdbc;

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

//使用PerpareStatement向数据库发送SQL语句,PerpareStatement会进行预编译
public class Demo6 {
    public static void main(String[] args) {
        try {
            String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding = utf8&useSSL=false&serverTimezone =UTC";
            Connection connection = DriverManager.getConnection(url, "root", "13579");
            //使用Perpare可以有效的防止SQL注入攻击
            String n = "'陕西' or 1=1";//
            //预先将SQL语句编译到 PerpareStatement对象中
            PreparedStatement ps = connection.prepareStatement("delete  from t_area where name =?");

            //向SQL中的占位符进行赋值操作
            ps.setString(1, n);

            int result = ps.executeUpdate();//执行
            System.out.println(result);

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}
             

eg:7
新建一个学生类:

package com.ff.javajdbc;

import java.util.Date;

public class Student {
    private int num;
    private String name;
    private  String sex;
    private Date birthday;
    private String phone;
    private int grade_id;
    private Date reg_time;

    public int getNum() {
        return num;
    }

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

    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 Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public int getGrade_id() {
        return grade_id;
    }

    public void setGrade_id(int grade_id) {
        this.grade_id = grade_id;
    }

    public Date getReg_time() {
        return reg_time;
    }

    public void setReg_time(Date reg_time) {
        this.reg_time = reg_time;
    }

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

package com.ff.javajdbc;

import java.sql.*;

//使用PerpareStatement向数据库发送SQL语句,PerpareStatement会进行预编译
public class Demo7 {
    public static void main(String[] args) {
        try {
            String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding = utf8&useSSL=false&serverTimezone =UTC";
            Connection connection = DriverManager.getConnection(url, "root", "13579");
            // 精确的通过学号查询某个学生成绩
            int num = 1;
            String sql = "select num,name,sex,birthday,phone,grade_id,reg_time from t_student where num = ?";
            //预先将SQL语句编译到PerparedStatement对象中去
            PreparedStatement ps = connection.prepareStatement(sql);
            ps.setInt(1, num);
            //executeQuery()用于执行查询语句,将查询到的结果封装到ResultSet对象中
            ResultSet rs = ps.executeQuery();

            //可以将  ResultSet中的对象 获取并转化到我们自己定义对象中
            Student student = new Student();
            // next() 判断结果集中是否还包含数据,如果包含返回true,将指向下一行数据
            while (rs.next()) {
                //将结果集中获得数据,设置到student对象。
                //当有新数据插入和删除时,每一种属性对应的序号会改变,导致与下方之前确定好的顺序不匹配,容易产生错误。
                 /*student.setNum(rs.getInt(1));
                 student.setName(rs.getString(2));*/

                //改进:使用set()将属性写在columnLable中,就可一一对应,不会产生错误
                student.setNum(rs.getInt("num"));
                student.setName(rs.getString("name"));
                student.setSex(rs.getString("sex"));
                student.setBirthday(rs.getDate("birthday"));//年月日
                student.setPhone(rs.getString("phone"));
                student.setGrade_id(rs.getInt("grade_id"));
                student.setReg_time(rs.getTimestamp("reg_time"));//年月日+时分秒
            }
            System.out.println(student);

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}
package com.ff.javajdbc;

import java.sql.*;
import java.util.ArrayList;

//使用PerpareStatement向数据库发送SQL语句,PerpareStatement会进行预编译
public class Demo8 {
    public static void main(String[] args) {
        try {
            String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding = utf8&useSSL=false&serverTimezone =UTC";
            Connection connection = DriverManager.getConnection(url, "root", "13579");
            //查询所有的学生信息
            String sql = "select num, name, sex, birthday, phone ,reg_time,grade_id,score from t_student";
            PreparedStatement ps = connection.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();//查询

            ArrayList<Student> stuList = new ArrayList<>();

            while (rs.next()) {
                //将结果集中获得数据,设置到student对象。
                Student student = new Student();
                student.setNum(rs.getInt("num"));
                student.setName(rs.getString("name"));
                student.setSex(rs.getString("sex"));
                student.setBirthday(rs.getDate("birthday"));//年月日
                student.setPhone(rs.getString("phone"));
                student.setGrade_id(rs.getInt("grade_id"));
                student.setReg_time(rs.getTimestamp("reg_time"));//年月日+时分秒
                stuList.add(student); // 将每一个学生信息依次加入stuList集合中
            }
            for (Student student : stuList) {
                System.out.println(student);
            }

            rs.close();
            ps.close();
            connection.close();

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值