java与数据库交互JDBC

概述

JDBC(Java DataBase Connectivity)java数据库连接
是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,
它由一组用Java语言编写的类和接口组成。
有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库.
J a v a A P I 中 提 供 了 操 作 数 据 库 的 标 准 接 口 , 最 终 由 不 同 的 数 据 库 开 发 商 实 现 这 些 标 准 接 口 来 对 数 据 库 操 作 .
Java 定义者制定了 JDBC 规范
数据库开发商实现接口
程序员学习使用标准规范
JDBC API:
供程序员调用的接口与类,集成在 java.sql 包中
DriverManager 类作用:管理各种不同的 jDBC 驱动
Connection 接口 与特定数据库的连接
Statement 接口 执行 sql
PreparedStatement 接口 执行 sql
ResultSet 接口 接收查询结果

JDBC搭建

JDBC API:
供程序员调用的接口与类,集成在 java.sql 包中
DriverManager 类作用:管理各种不同的 jDBC 驱动
Connection 接口 与特定数据库的连接
Statement 接口 执行 sql
PreparedStatement 接口 执行 sql
ResultSet 接口 接收查询结果
注册JDBC驱动程序:
这需要初始化驱动程序,这样就可以打开与数据库的通信信道。
Class.forName(“com.mysql.cj.jdbc.Driver”); //反射实现
或者
DriverManager.registerDriver(new Driver());
建立与数据库连接:
这需要使用 DriverManager.getConnection() 方法来创建一个
Connection 对象,它代表一个物理连接的数据库 .
● Connection conn =
DriverManager.getConnection(URL,USER,PASS);
URL:jdbc:mysql://ip(127.0.0.1): 端口 (3306)/ 数据库
?serverTimezone=Asia/Shanghai
USER: 用户名 (root)
PASS: 密码
获得 Satement 执行 sql 语句
●Statement st = connection.createStatement();
Satement 中的方法 :
Int executeUpdate(String sql) 用于执行 ddl 语句和 dml( , , ) 语句 返回
操作的行数
用于执行 ddl 语句返回 0
用于执行 dml 语句返回操作的行数
ResultSet executeQuery(String sql); 用于执行查询语句 返回一个
ResultSet 集合
获得 PrepareStatement 执行 sql 语句
sql 语句中参数位置使用占位符 , 使用 setXX 方法向 sql 中设置参数
● PrepareStatement ps = connection.prepareStatement(sql);
PrepareStatement 中的方法 :
Int executeUpdate() 用于执行 ddl 语句和 dml( , , ) 语句 返回操作的行数
用于执行 ddl 语句返回 0
用于执行 dml 语句返回操作的行数
ResultSet executeQuery(); 用于执行查询语句 返回一个 ResultSet 集合
关闭与数据库的链接通道
每次操作完成后关闭所有与数据库交互的通道
st.close();
rs.close();
conn.close();
ps.close();

PreparedStatementStatement

基于以下的原因:
1、代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无
论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values
('"+var1+"' , '"+var2+"' , "+var3+" , '"+var4+"')");
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4)
values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例
2、最重要的一点是极大地提高了安全性.
防止sql注入
Stringsql= “ delete from user where id = ”+num;
如果我们把[or 1=1]作为id传入进来?
delete from tb_name where id = 1 or 1 = 1;
因为‘1’ = ‘1’肯定成立
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹
配的关系.
预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.
PreparedStatement Statement 中的 executeQuery() 方法中会返回一
ResultSet 对象 , 查询结果就封装在此对象中 .
使用 ResultSet 中的 next() 方法获得下一行数据
使用 getXXX(String name) 方法获得值

实例

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

public class Demo1 {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        //2.加载驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");//相当于启动mysql软件

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

        //3.建立与数据库的连接,获得连接对象
        String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
        String user = "root";//mysql 账号
        String password = "root";//mysql 密码
        Connection connection = DriverManager.getConnection(url, user, password);//连接数据库 (登录数据库)
        System.out.println(connection);//com.mysql.cj.jdbc.ConnectionImpl@37574691
        //连接mysql的通道
        //4.发送sql(向数据库发送sql语句)
        Statement st = connection.createStatement();//输入流  com.mysql.cj.jdbc.StatementImpl@442675e1
        System.out.println(st);
        st.executeUpdate("insert into major (name) values ('英语')");

        //5.关闭数据库连接
        st.close();  //关闭mysql输入通道
        connection.close();// 关闭java与mysql的连接通道
    }
}
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) {
        Demo2  demo2 = new Demo2();


        try {
            //demo2.save("丽丽",110,"女","2004-04-12","13244465555","汉中",2);
           // demo2.update(110,"tom1","男","2004-2-2","15233334222","汉中1");
            demo2.delete("110 ");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }


    }

    public void delete  (String  num) throws ClassNotFoundException, SQLException {
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
        String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
        String user = "root";//mysql 账号
        String password = "root";//mysql 密码
        // 获得连接
//连接数据库
        Connection connection = DriverManager.getConnection(url,user,password);
//向数据库写数据
        //发送
        Statement st = connection.createStatement();

        st.executeUpdate("delete from student where num ="+num);
        //关闭
        st.close();
        connection.close();

    }

    public void update  (int num,String name,String gender,String birthday,String phone,String address) throws ClassNotFoundException, SQLException {
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
        String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
        String user = "root";//mysql 账号
        String password = "root";//mysql 密码
        // 获得连接
      //连接数据库对象 (来连接mysql)
        Connection connection = DriverManager.getConnection(url,user,password);
     //向数据库写数据
        //发送   (输入通道  /输入流)
        Statement st = connection.createStatement();
       //   executeUpdate 直接执行sql语句
        st.executeUpdate("update student set name='"+name+"',gender='"+gender+"',birthday='"+birthday+"',phone='"+phone+"',reg_time=now(),address='"+address+"' where num="+num);
        //关闭
        st.close();
        connection.close();

    }



    public void save (String name,int num,String gender,String birthday,String phone,String address,int majorid) throws ClassNotFoundException, SQLException {
      //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
        String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
        String user = "root";//mysql 账号
        String password = "root";//mysql 密码
     // 获得连接对象 (来连接mysql)
//连接数据库
        Connection connection = DriverManager.getConnection(url,user,password);
//向数据库写数据
        //发送
        Statement st = connection.createStatement();

        st.executeUpdate(" INSERT INTO student (NAME,num,gender,birthday,phone,address,reg_time,majorid) " +
                "VALUES('"+name+"',"+num+",'"+gender+"','"+birthday+"','"+phone+"','"+address+"',now(),'"+majorid+"')");
        //关闭
        st.close();
        connection.close();

    }
}

import java.sql.*;

public class Demo3 {

    /*
      PreparedStatement 和 Statement 区别
      相同点: 都是向数据库发送sql
      Statement : 将参数直接拼接到sql,  要拼接字符串, 写起来麻烦, 安全性差(意受攻击),  可以在参数中拼接 or 1=1 会攻击数据库中的数据(会将数据库中的数据全部删除)
      PreparedStatement : 先用?站位, 然后通过setObject方法赋值(占位符所占的位置) , 写起来不用拼接字符串, 安全可靠的
        (执行sql语句先暂停一下判断(检查)sql语句是否安全, 安全才执行sql语句)  在给占位符位置赋值时 进行检测 , 可以防止sql注入恶意攻击  防止对数据库中的数据造成破坏




     */
    public static void main(String[] args) {
        Demo3 demo2 = new Demo3();


        try {
            //demo2.save("丽丽","女","2004-04-12","13244465555","汉中",2);
           // demo2.update(110,"丽丽","男","2004-4-2","15233334222","汉中1");
            demo2.delete("111 or 1=1");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }


    }


    public void delete (String num) throws ClassNotFoundException, SQLException {
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
        String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
        String user = "root";//mysql 账号
        String password = "root";//mysql 密码
        // 获得连接
//连接数据库
        Connection connection = DriverManager.getConnection(url, user, password);
//向数据库写数据
        //发送

        //预先编译sql语句(不是真正的编译sql)
        PreparedStatement ps = connection.prepareStatement("delete from student where num = ?");
        // 给?占位符占的位置赋值
        ps.setObject(1,num);


        ps.executeUpdate();//
        //关闭
        ps.close();
        connection.close();

    }


    public void update(int num, String name, String gender, String birthday, String phone, String address) throws ClassNotFoundException, SQLException {
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
        String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
        String user = "root";//mysql 账号
        String password = "root";//mysql 密码
        // 获得连接
//连接数据库
        Connection connection = DriverManager.getConnection(url, user, password);
//向数据库写数据
        //发送       ?占位符, 表示此处需要接受一个参数
        PreparedStatement ps = connection.prepareStatement("update student set name = ?,gender = ?,birthday = ?,phone = ?,address = ? where num = ?");
        // 给?占位符占的位置赋值
                       ps.setObject(1,name);
        ps.setObject(2,gender);
        ps.setObject(3,birthday);
        ps.setObject(4,phone);
        ps.setObject(5,address);
        ps.setObject(6,num);
// 真正执行sql语句
      ps.executeUpdate();
        //关闭
      ps.close();
        connection.close();

    }


    public void save(String name, String gender, String birthday, String phone, String address, int majorid) throws ClassNotFoundException, SQLException {
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
        String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
        String user = "root";//mysql 账号
        String password = "root";//mysql 密码
        // 获得连接
//连接数据库
        Connection connection = DriverManager.getConnection(url, user, password);
//向数据库写数据
        //发送       ?占位符, 表示此处需要接受一个参数
        PreparedStatement ps = connection.prepareStatement("insert into student (name,gender,birthday,phone,address,reg_time,majorid)values (?,?,?,?,?,now(),?)");
       // 给?占位符占的位置赋值
        ps.setObject(1, name);
        ps.setObject(2, gender);
        ps.setObject(3, birthday);
        ps.setObject(4, phone);
        ps.setObject(5, address);
        ps.setObject(6, majorid);

        //真正执行sql语句
        ps.executeUpdate();
        //关闭
        ps.close();
        connection.close();

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

public class Demo4 {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {

        Demo4 demo4  = new Demo4();
       //com.ffyc.jdbc.Student student = demo4.findStudentByNum(115);
        //System.out.println(student);
        ArrayList<Student> students = demo4.findStudentByGender("女");
        System.out.println(students);
    }

 public ArrayList<Student> findStudentByGender(String gender) throws ClassNotFoundException, SQLException {
     Class.forName("com.mysql.cj.jdbc.Driver");
     String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
     String user = "root";//mysql 账号
     String password = "root";//mysql 密码
     Connection connection = DriverManager.getConnection(url, user, password);


     ArrayList<Student> students = new ArrayList<>();
     PreparedStatement ps = connection.prepareStatement("select num,name,gender,birthday,phone,reg_time from student where gender = ?");

                  ps.setObject(1,gender);//给站位符位置设置值

                   ResultSet rs  =   ps.executeQuery();//真正执行sql语句
     while (rs.next()){

         //每循环一次, 拿到一个学生对象(拿到学生表中的一个学生对象)
         Student student = new Student();
         student.setNum(rs.getInt("num"));
         student.setName(rs.getString("name"));
         student.setGender(rs.getString("gender"));
         student.setBirthday(rs.getDate("birthday"));
         student.setPhone(rs.getString("phone"));
         student.setRegTime(rs.getTimestamp("reg_time"));

         students.add(student);//将学生对象存入到学生集合中
     }

     return students;
 }





    public Student findStudentByNum(int num) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
        String user = "root";//mysql 账号
        String password = "root";//mysql 密码
        Connection connection = DriverManager.getConnection(url, user, password);


        //程序输入数据库 sql语句通道
        PreparedStatement ps = connection.prepareStatement("select num,name,gender,birthday,phone,reg_time from student where num = ?");
                          ps.setObject(1,num);

               //查询操作

        //查询结果从数据库中输入到程序中  有个输入程序通道
        ResultSet rs = ps.executeQuery();  //将查询结果封装到一个ResultSet对象中,  需要将ResultSet对象中的数据封装到对应的对象中
        // 将查询的结果存到(封装到ResultSet对象中)  ResultSet对象存的是查询结果
      //next () 如果结果集中有数据返回true,否则返回false
        Student student = null;
        while (rs.next()){
            student = new Student();
            student.setNum(rs.getInt("num"));
            student.setName(rs.getString("name"));
            student.setGender(rs.getString("gender"));
            student.setBirthday(rs.getDate("birthday"));
            student.setPhone(rs.getString("phone"));
            student.setRegTime(rs.getTimestamp("reg_time"));//获取时间戳  返回年月日 时分秒

        }
        rs.close(); //关闭mysql向程序输入数据通道
        ps.close();  // 关闭程序向数据库输入sql语句 的通道
        connection.close();  //关闭程序与数据库的连接

        return student;
    }
}
import java.util.Date;

public class Student {
    private  int num;
    private String name;
    private String gender;
    private Date birthday;
    private String phone;
    private  Date regTime;

    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 getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    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 Date getRegTime() {
        return regTime;
    }

    public void setRegTime(Date regTime) {
        this.regTime = regTime;
    }

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值