java的数据库编程—JDBC编程(实现对数据库的增删查改)

java的数据库编程—JDBC编程

1、JDBC 即Java Database Connectivity,意思是java数据库连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。这个API由 java.sql.,javax.sql. 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。

2、JDBC工作原理
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类。
JDBC访问数据库层次结构:
在这里插入图片描述
3、JDBC优势:
Java语言访问数据库操作完全面向抽象接口编程
开发数据库应用不用限定在特定数据库厂商的API
程序的可移植性大大增强

4. JDBC使用的步骤

首先准备数据库驱动包,并添加到项目的依赖中:在项目中创建文件夹lib,并将依赖包mysql-connector-java-5.1.47.jar复制到lib个中(和当前项目在同一路径当中)。
在这里插入图片描述

在这里插入图片描述
与工程建立联系
配置该jar包到本项目的依赖中:右键点击项目Open Module Settings,在Modules中,点击项目,配置Dependencies,点击+,JARS or Directories,将该lib文件夹配置进依赖中,表示该文件夹下的jar包都引入作为依赖。

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述
最后,点击apply,点击ok。
完成之后:

1、加载JDBC驱动程序:

反射,这样调用初始化com.mysql.jdbc.Driver类,即将该类加载到JVM方法区,并执行该类的静态方法块、静态属性。

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

此时,有异常,交给JVM(快捷建Alt+Inter)

在这里插入图片描述

2、创建数据库连接

        String url = "jdbc:mysql://127.0.0.1:3306/testjava17_18?useSSL=false";
        String username = "root";
        String password = "1111";
        Connection connection = DriverManager.getConnection(url, username, password);

解释:
在这里插入图片描述
getConnection处理方式和上面一样。

3、执行sql语句

        String sql = "select * from user";

        Statement statement = connection.createStatement();//获取statement 对象;

        ResultSet resultSet = statement.executeQuery(sql);//executeQuery(sql)查询语句;返回值为ResultSet;查询所有的结果在ResultSet集下

        if (resultSet.next()) {
    
    //resultset。next 获取时自动会想向下移    System.out.println(resultSet.getInt(1));
            System.out.println(resultSet.getString(2));
            System.out.println(resultSet.getString(3));
        }
        

注:提前在数据库里面创建一个表
在这里插入图片描述

查询结果为;
在这里插入图片描述
如果,我们建一个user类,代码可以写成封装成一个对象:

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: HuYu
 * Date: 2021-03-22
 * Time: 09:26
 */
public class User {
    
    
    private int id;
    private String name;
    private String passord;

    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 getPassord() {
    
    
        return passord;
    }

    public void setPassord(String passord) {
    
    
        this.passord = passord;
    }


    @Override
    public String toString() {
    
    
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", passord='" + passord + '\'' +
                '}';
    }



}

此时,代码可以写成封装成一个对象,查询代码可以写成

if (resultSet.next()) {
    
    //resultset。next 获取时自动会想向下移,多条数据改为while;
            User user = new User();
            user.setId(resultSet.getInt(1));//下标必须从1开始
            user.setName(resultSet.getString(2));
            user.setPassord(resultSet.getString(3));
            System.out.println(user);

        }

注:有警告则改代码为:
在这里插入图片描述
查询结果为:
在这里插入图片描述
根据条件查询查询语句可改为:

//3.执行sql语句
        String sql = "select * from user  where name ='bit' and passord = '123'";

运行结果:
在这里插入图片描述

查询语句改为:

String uname = "bit";
        String upassord = "123";
        String sql = "select * from user  where name ='"+uname+"' and passord = '"+upassord+"'";//定义成变量形式,原始写法,一般不这样写
//需注意,这样写拼接时不能有空格,

sql注入:

在这里插入图片描述
改进:

使用prepareStatement作用:预防sql注入和预编译


在这里插入图片描述

//3.执行sql语句
        String uname = "bit";
        String upassord = "1'or '1' ='1";//防止sql注入
        //String sql = "select * from user where name = '"+uname+"' and password='"+upass+"'";
        String sql = "select * from user  where name = ? and passord = ?";//定义成变量形式,原始写法,一般不这样写
//需注意,这样写拼接时不能有空格,


       // Statement statement = connection.createStatement();//获取statement 对象;

       PreparedStatement preparedStatement    = connection.prepareStatement(sql);//prepareStatement作用:预防sql注入和预编译
       preparedStatement.setString(1,uname);
       preparedStatement.setString(2,upassord);

        System.out.println("sql:"+preparedStatement.toString());

        ResultSet resultSet = preparedStatement.executeQuery();//executeQuery(sql)查询语句;返回值为ResultSet;查询所有的结果在ResultSet地下

        if (resultSet.next()) {
    
    //resultset。next 获取时自动会想向下移,多条数据改为while;
            User user = new User();
            user.setId(resultSet.getInt(1));//下标必须从1开始
            user.setName(resultSet.getString(2));
            user.setPassord(resultSet.getString(3));
            System.out.println(user);

        }
        //关闭顺序:
        resultSet.close();
        preparedStatement.close();
        connection.close();

使用prepareStatement来实现数据库的增删查改:

1、插入查询:

//3.执行sql语句

        String sql = "insert into user(id,name,passord) values (?,?,?)";


        PreparedStatement preparedStatement    = connection.prepareStatement(sql);//prepareStatement作用:预防sql注入和预编译
        preparedStatement.setInt(1,2);
        preparedStatement.setString(2,"huyu");
        preparedStatement.setString(3,"025");



        System.out.println("sql:"+preparedStatement.toString());

        //除了 查询 其他都要用executeUpdate  返回值是受影响的行数
        int ret  = preparedStatement.executeUpdate();//executeUpdate为插入语句,返回值为int、要用int接受

        if(ret != 0) {
    
    
            System.out.println("插入成功!");
        }

        //关闭顺序:
        preparedStatement.close();
        connection.close();

结果:
在这里插入图片描述
在这里插入图片描述
2、更新查询

在这里插入代码片//3.执行sql语句

        String sql = "update user set name=? where id=?";


        PreparedStatement preparedStatement    = connection.prepareStatement(sql);//prepareStatement作用:预防sql注入和预编译
        preparedStatement.setString(1,"huyu2");
        preparedStatement.setInt(2,2);




        System.out.println("sql:"+preparedStatement.toString());

        //除了 查询 其他都要用executeUpdate  返回值是受影响的行数
        int ret  = preparedStatement.executeUpdate();//executeUpdate为插入语句,返回值为int、要用int接受

        if(ret != 0) {
    
    
            System.out.println("更新成功!");
        }

        //关闭顺序:
        preparedStatement.close();
        connection.close();

结果:
在这里插入图片描述
在这里插入图片描述
3、删除查询

//3.执行sql语句

        String sql = "delete from user where id=?";


        PreparedStatement preparedStatement    = connection.prepareStatement(sql);//prepareStatement作用:预防sql注入和预编译

        preparedStatement.setInt(1,2);




        System.out.println("sql:"+preparedStatement.toString());

        //除了 查询 其他都要用executeUpdate  返回值是受影响的行数
        int ret  = preparedStatement.executeUpdate();//executeUpdate为插入语句,返回值为int、要用int接受

        if(ret != 0) {
    
    
            System.out.println("删除成功!");
        }

        //关闭顺序:
        preparedStatement.close();
        connection.close();

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44436675/article/details/115126257