zoukankan      html  css  js  c++  java
  • JDBC

    JDBC

    JDBC

    Java DateBase Connectivity 是一个独立于特定数据库的管理系统,通用的SQL数据库存取和操作的公共接口。

    定义了一组标准,为访问不同的数据库提供了统一的途径。

    image-20201121150742349


    JDBC体系结构

    JDBC接口包括两个层面:

    ​ 面向应用的API,供程序员调用。

    ​ 面向数据库的API,供厂商开发数据库的驱动程序。

    image-20201121151518046

    image-20201121152415396

    JDBC API:

    ​ 提供者:java官方。

    ​ 内容:供开发者调用的接口。

    ​ java.sql javax.sql

    DriverManager类

    Connection接口

    Statement接口

    ResultSet接口

    DriverManager

    ​ 提供者:java官方。

    ​ 作用:管理不同的JDBC驱动。

    JDBC驱动

    ​ 提供者:数据库厂商。

    ​ 作用:连接不同的数据库。


    JDBC的使用

    1.加载数据库驱动。数据库驱动是java程序和数据库之间的桥梁。

    2.获取Connection。Connection是java程序与数据库的一次连接。

    3.创建Statement对象,由Connection产生。执行SQL语句。

    4.如果需要接受返回值,创建ResultSet对象,保存Statement执行之后所查询到的结果。


    JDBC简易示例:增删改查

    示例:

    1.创建java项目。

    2.在项目中新建lib文件夹。

    3.在文件夹中加入mysql-connector-java-8.0.16.jar。这个是跟MySql的版本对应的,是向下兼容的,如果你使用的是Mysql8.0,你没有办法使用mysql-connector-java-5.0.jar,但是如果你使用mysql-connector-java-8.0.16.jar,MySQL5.0和8.0都能使用。

    4.添加jar包到Libraries中。

    package com.wildfire.jdbc;
    
    import java.sql.*;
    
    public class Jdbc1 {
        public static void main(String []args){
            try {
                //加载驱动
                Class.forName("com.mysql.cj.jdbc.Driver");
                //获取连接
                String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
                //jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
                //jdbc:数据库类型://url:端口号/数据库名?属性  useUnicode=true&characterEncoding=UTF-8处理中文乱码问题
                String user="root";
                String password="xjmwan1314";
                Connection connection= DriverManager.getConnection(url,user,password);
    //            String sql="insert into student(name,score,birthday) values('边信哲',20,'2000-03-18')";
    //            String sql="update student set name='张志流' where score=20";
    //            String sql="delete from student where name='张三'";
    //            Statement statement=connection.createStatement();
    //            int result=statement.executeUpdate(sql);
    //            System.out.println(result);
    
                String sql="select * from student";
                Statement statement =connection.createStatement();
                ResultSet resultSet=statement.executeQuery(sql);
                while(resultSet.next()){
                    //resultSet.next()返回值是一个布尔型,如果下一行不存在,就返回false,即跳出循环。
                    String name=resultSet.getString(1);
                    Integer score=resultSet.getInt(2);
                    String birthday=resultSet.getString(3);
                    System.out.println(name+":"+score+":"+birthday);
                }
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }   catch (SQLException e) {
                e.printStackTrace();
            }
    
    
        }
    }
    

    注意:增删改使用的是executeUpdate方法,返回的是int类型,影响了几行就返回几。

    ​ 查使用的是executeQuery方法,返回的是ResultSet类型,是查询的结果集。

    使用IDEA提供的简单的数据库可视化工具:

    1.右边DateBase--》+--》Data Source(数据来源)--》MySQL

    2.

    3.点击Test Connection,返回success则返回成功。

    PreparedStatement

    实际开发中,我们常用Statement的子类PreparedStatement来完成增删改查的操作。

    使用Statement进行开发有两个问题:

    ​ 1.需要频繁拼接String字符串,出错率较高。

    ​ 例如:

    String username="夜雨声烦";
    String pwd="xjmwan1314";
    String sql="select * from user where username="+username+"and password ="+password;
    System.out.println(sql);
    

    ​ 运行的结果是:

    ​ select * from user where username=夜雨声烦and password =xjmwan1314

    ​ 很明显不是我们想要的结果。

    ​ 2.存在SQL注入的风险。

    ​ SQL 注⼊:利⽤某些系统没有对⽤户输⼊的信息进⾏充分检测,在⽤户输⼊的数据中注⼊⾮法的 SQL 语句,从⽽利⽤系统的 SQL 引擎完成恶意⾏为的做法。

    ​ 例如:在输入框拼接SQL语句。

    ​ 使用PreparedStatement能很好的避免以上问题。

    package com.wildfire.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    public class jdbc2 {
        public static void main(String []args){
            try {
                //加载驱动
                Class.forName("com.mysql.cj.jdbc.Driver");
                //获取连接
                String url="jdbc:mysql:localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
                String user="root";
                String password="xjmwan1314";
                Connection connection= DriverManager.getConnection(url,user,password);
                
                String username="夜雨声烦";
                String userpassword="123";
                //问号就是占位符
                String sql="select * from user where username = ? and userpassword = ?";
                //在这里就输入了sql语句,后面调用方法却没有用。
                PreparedStatement preparedStatement=connection.prepareStatement(sql);
                //第一个问号赋值为username    不进行字符串拼接  直接使用字符串进行判断
                preparedStatement.setString(1,username);
                preparedStatement.setString(2,userpassword);
                ResultSet resultSet=preparedStatement.executeQuery();
                if(resultSet.next()){
                    System.out.print("登录成功!");
                }else{
                    System.out.println("登陆失败!");
                }
                
    
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }   catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    

    注意:PreparedStatement preparedStatement = connection.prepareStatement(sql);
    ResultSet resultSet = preparedStatement.executeQuery();

    这里是创建对象的时候就传入了SQL语句,而不是使用方法的时候传入sql语句。

  • 相关阅读:
    CentOS7 安装rabbitmq
    CentOS 7安装和配置ssh
    日志备份脚本
    Dubbo配置优化
    MySQL Index Condition Pushdown(ICP) 优化
    Mysql 5.6 新特性(转载)
    Mysql 中bitwise对效率的影响??
    Linux 通过 load average 判断服务器负载情况
    VMware使用过程中出现了虚拟机繁忙问题
    Centos7设置开机启动界面:图形化or命令行
  • 原文地址:https://www.cnblogs.com/wind-and-sky/p/14017882.html
Copyright © 2011-2022 走看看