JavaSE第十二章.JDBC

概述

JDBC(Java DataBase Connectivity)java数据库连接

应用程序与数据库之间的桥梁

  • 是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
  • 有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库

java语言开发者只是定义了许多关于java应用程序操作数据的接口(定义功能,没有实现)

​ java程序连接到 数据库

​ 发送sql:增改删 —>发送数据到数据库 insert()

​ 查询 —>返回结果 get()

java语言开发者为什么不实现?

​ 由于数据库类型众多,自己实现不了解,就让数据库开发商自己实现

​ 所以数据库开发商提供了jar包:里边有各种接口的实现类

JDBC API:

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

DriverManager类作用:管理各种不同的jDBC驱动

Connection 接口 与特定数据库的连接

Statement 接口 执行sql

PreparedStatement接口 执行sql

ResultSet接口 接收查询结果

JDBC搭建

1.导入对应的数据库驱动包(jar)

在工程目录下new Directory 新建 lib 目录,将需要的jar包复制到该目录下

我的jar包在F:\java program\JavaPackage

mysql-connector-java-8.0.16.jar

  • File —> Project Structure —> Libraries —> “+” —> java —> 在项目下找到lib选中jar包
2.加载mysql驱动
Class.forName("com.mysql.cj.jdbc.Driver"); //使用java反射机制实现的创建对象

//或  DriverManager.registerDriver(new Driver());

Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。

3.连接到数据库
//连接到数据库-ip,端口号3306,数据库名,字符集,时区
String url ="jdbc:mysql://127.0.0.1:3306/school_massage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
String root = "root";
String password = "100005";
//创建传输sql的管道
Connection conn = DriverManager.getConnection(url,root,password);

/*返回conn:com.mysql.cj.jdbc.ConnectionImpl@1e67b872
	(返回的是mysql中的一个实现了connection接口的类的对象)*/
4.发送sql到数据库
//创建用来封装发送sql的Statement
Statement st = conn.createStatement();
//输入要操作的语句
st.executeUpdate("insert into course(c_name)value('php')");
5.关闭数据库连接通道
st.close();
conn.close(); //关闭通道

增,删,改数据

Statement

/**
 * 添加学生信息到school_massage数据库
 *
 * @author 樊景泽
 */
public class JDBCDemo2 {
    public static void main(String[] args) {
        JDBCDemo2 jd2 = new JDBCDemo2();
        try {
            jd2.saveStudent("tom", "男", "2000-1-1");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("类找不到");
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            System.out.println("数据链接失败");
        }
    }

    public void saveStudent(String name, String sex, String birthday) throws ClassNotFoundException, SQLException {
        //建立Statement和传输的管道Connection
        Connection conn = null;
        Statement st = null;
        try {
            //加载mysql驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //连接到数据库
            String url = "jdbc:mysql://127.0.0.1:3306/school_massage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
            conn = DriverManager.getConnection(url, "root", "152475");
            //发送sql到数据库
            st = conn.createStatement();//用row记录操作的行数
            int row = st.executeUpdate("INSERT INTO t_student(NAME,sex,birthday,registrationtime)" +
                    " VALUES('" + name + "','" + sex + "','" + birthday + "',now())");
            System.out.println(row);
        } finally {
            //关闭管道
            if (st != null) {
                st.close();
            }
            if (conn != null) {
                conn.close();
            }
        }

    }
}

PreparedStatement

public void saveStudent(String name,String sex,String birthday) throws ClassNotFoundException, SQLException {
        Connection connection  = null;
        PreparedStatement ps = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://127.0.0.1:3306/school_massage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
             conn = DriverManager.getConnection(url,"root","root");
             // 预先将sql语句封装到PreparedStatement对象中 ?表示一个占位符,需要传入一个值
            ps =  connection.prepareStatement("insert into student(name,sex,birthday,reg_time)values(?,?,?,?)");
               //向预编译好的sql中传入数据
                ps.setString(1,name);
                ps.setString(2,sex);
                ps.setObject(3, birthday);
                ps.setObject(4, new Date());
            	//或ps.setDate(4,new java.sql.Date(new java.util.Date().getTime()));
                
            	ps.executeUpdate();//执行sql
        }finally {
                if(ps!=null){
                    ps.close();
                }
                if(connection!=null){
                    connection.close();
                }
        }
  1. 简化写法 , 不用拼接字符串

  2. 极大的提高了安全性 , 防止sql注入攻击

    ​ 例如 : DELETE FROM grade WHERE g_num = 1 OR 1=1; 用拼接字符串就会把OR 1=1直接传进sql语句中 ,表就会被全部删除

    ​ 而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.

    ​ 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.

查询数据

  1. PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSet对象,查询结果就封装在此对象中.
  2. 使用ResultSet中的next()方法获得下一行数据
  3. 使用getXXX(String name)方法获得值
//学生对象
public class Student {
    private int id;
    private String name;
    private String sex;
    private float weight;
    private Date regTime;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    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 float getWeight() {
        return weight;
    }
    public void setWeight(float weight) {
        this.weight = weight;
    }
    public Date getRegTime() {
        return regTime;
    }
    public void setRegTime(Date regTime) {
        this.regTime = regTime;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", weight=" + weight +
                ", regTime=" + regTime +
                '}';
    }
}
/**
 * @author Deevan
 * 查询学号为1的学生信息
 */
public class Demo2 {
    public static void main(String[] args) {
        // 数据库持久化的存储数据, 当在程序中使用时,需要把数据查询出来,封装在对象中
        Demo2 demo2 = new Demo2();
        try {
            Student student = demo2.findStdent(1);
            System.out.println(student);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    private Student findStdent(int num) throws ClassNotFoundException, SQLException {
        Connection conn = null;
        PreparedStatement ps = null;
        Student student = new Student();
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
            conn = DriverManager.getConnection(url, "root", "152475");

            ps = conn.prepareStatement("SELECT\n" +
                    "  id,\n" +
                    "  NAME,\n" +
                    "  sex,\n" +
                    "  weight,\n" +
                    "  reg_time\n" +
                    "FROM\n" +
                    "  student\n" +
                    "WHERE id = ?");
            ps.setInt(1, num);
            ResultSet res = ps.executeQuery(); //执行查询操作
            //从ResultSet中取出我们需要的数据   next()-有内容返回true,否则返回false
            while (res.next()) {
                student.setId(res.getInt("id"));
                student.setName(res.getString("name"));
                student.setSex(res.getString("sex"));
                student.setWeight(res.getFloat("weight"));
                student.setRegTime(res.getDate("reg_time"));
            }
        } finally {
            if (ps != null) {
                ps.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
        return student;
    }
}

------------------------------------------
Student{id=1, name='王艺', sex='女', weight=40.0, regTime=2021-08-13}

查询出多个结果

把对象封装到集合中

public class Demo3 {
    public static void main(String[] args) {
        Demo3 demo3 = new Demo3();
        try {
            ArrayList<Student> list = demo3.findStudentList("男");
            System.out.println(list);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    private ArrayList<Student> findStudentList(String sex) throws ClassNotFoundException, SQLException {
        Connection conn = null;
        PreparedStatement ps = null;
        ArrayList<Student> list = new ArrayList<>();
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
            conn = DriverManager.getConnection(url, "root", "152475");
            ps = conn.prepareStatement("SELECT\n" +
                    "  id,\n" +
                    "  NAME,\n" +
                    "  sex,\n" +
                    "  weight,\n" +
                    "  reg_time\n" +
                    "FROM\n" +
                    "  student\n" +
                    "WHERE sex = ?");
            ps.setString(1, sex);
            ResultSet res = ps.executeQuery();
            while (res.next()) {
                Student student = new Student();
                student.setId(res.getInt("id"));
                student.setName(res.getString("name"));
                student.setSex(res.getString("sex"));
                student.setWeight(res.getFloat("weight"));
                student.setRegTime(res.getDate("reg_time"));
                list.add(student);
            }
        } finally {
            if (ps != null) {
                ps.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
        return list;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EnndmeRedis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值