JAVA基础 JDBC连接数据库

JDBC连接数据库

JDBC,数据库目的?

数据库驱动

看到驱动 你会先想到什么?
生活中:声卡、显卡、网卡,都是电脑必备的,没有电脑就无法启动。
在这里插入图片描述

我们的程序会通过数据库驱动和数据库打交道。

JDBC

SUN公司未来简化 开发人员(对数据库的统一)操作,提供了一个(JAVA操作数据库的)规范,俗称: JDBC
这些规划的实现由具体的厂商去做~

在这里插入图片描述

java程序访问数据库mysql,有一套标准JDBC( java database connect)

驱动程序:由数据库厂商提供

jar包:mysql/oracle

注册驱动:

看清楚了,注册驱动就只有一句话:

Class.forName(“com.mysql.jdbc.Driver”);

DriverManage

DriverManager类用于加载JDBC驱动并且创建与数据库的连接。

DriverManger(驱动管理器)的作用有两个:

注册驱动:这可以让JDBC知道要使用的是哪个驱动
获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了

Connnection

Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”,”root”,123);

Connection接口代表Java程序和数据库的连接,只有获得该连接对象后,才能访问数据库,并操作数据表。

Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:

Connection最为重要的一个方法就是用来获取Statement对象;

Statement

Statement stmt = con.createStatement();
//Statement是用来向数据库发送要执行的SQL语句的!

Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。

扫描二维码关注公众号,回复: 12367081 查看本文章

Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sq|语句, executeUpdate执行完后, 将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。

Statement.executeQuery方法用于向数据库发生查询语句,executeQuery方法返回代表查询结果的ResultSet对象。

Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句:

void executeUpdate(String sql):执行更新操作(insert、update、delete等)

1.使用executeUpdate(String sql)方法完成数据添加操作,示例操作:

Statement statement = connection.createStatement();
        String sql = "insert into user(...) values(...)";
        int num = statement.executeUpdate(sql);
        if(num>0){
    
    
            System.out.println("插入成功");
        }

2.使用executeUpdate(String sql)方法完成数据删除操作,示例操作:

Statement statement = connection.createStatement();
        String sql = "delete from user where id =1";
        int num = statement.executeUpdate(sql);
        if(num>0){
    
    
            System.out.println("删除成功");
        }

3.使用executeUpdate(String sql)方法完成数据修改操作,示例操作:

Statement statement = connection.createStatement();
        String sql = "update user set name ='' where name = ''";
        int num = statement.executeUpdate(sql);
        if(num>0){
    
    
            System.out.println("修改成功");
        }

ResultSetexecuteQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet

使用executeUpdate(String sql)方法完成数据查询操作,示例操作:

Statement statement = connection.createStatement();
        String sql = "select * from  user where id =1";
        ResultSet rs= statement.executeQuery(sql);
        if(rs.next()){
    
    
            System.out.println("");
        }

ResultSet

ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。
ResultSet接口中定义了大量的getXxx()方法,而采用哪种getXxx()方法取决于字段的数据类型。

boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在
XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0

从数据库获取数据,返回结果表

ResultSet就是一张二维的表格,它内部有一个“行光标”,光标默认的位置在“第一行上方”,我们可以调用rs对象的next()方法把“行光标”向下移动一行,当第一次调用next()方法时,“行光标”就到了第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法来获取指定列的数据了:

rs.next();//光标移动到第一行
rs.getInt(1);//获取第一行第一列的数据

当你使用rs.getInt(1)方法时,你必须可以肯定第1列的数据类型就是int类型,如果你不能肯定,那么最好使用rs.getObject(1)。在ResultSet类中提供了一系列的getXXX()方法,比较常用的方法有:

Object getObject(int col)
String getString(int col)
int getInt(int col)
double getDouble(int col)

关闭

与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。

rs.close();
stmt.close();
con.close();

MySQl数据库

常用命令
创建数据库:create database 数据库名称 ;
删除数据库:drop database 数据库名称 ;
使用数据库:use 数据库名称 ;
创建数据库表:create table 表名( 字段名称1 字段类型[default 默认值] [约束], …) ;
删除数据库表:drop table 表名 ;
查看表结构: desc 表名称 ;
查看全部数据库:show databases ;
查看一个数据库全部表: show tables ;

SQL语法基础(Structured Query Language,结构查询语句)强大的数据库语言

DML-数据操作语言:检索或修改数据
DDL-数据定义语言:定义数据的结构,创建、修改、删除
DCL-数据控制语言:定义 数据库用户的权限


步骤:

1)下载jar包,驱动包

https://mvnrepository.com/search?q=mysql

2)idea创建一个project,jdbc2011

3)src平齐目录中lib目录,把jar放进去

4)通知本项目,我要依赖这个jar包,这样才能调用

5)选择file菜单下的 project structure菜单

选择modules模块,选择Dependencies页夹

6)把jar绑定这个工程,我们代码中才能使用它

+号,选择第一个jars。。。

7)到你自己的位置

IdeaProjects\jdbc2011\lib\mysql-connector-java-5.1.32.jar
成功的条件:jar前面多了个小箭头,可以点开,展示package就代表成功

操作步骤:

idea创建一个project项目,项目名为:jdbc2011 ,然后新建一个lib文件夹,拖入jar包

在这里插入图片描述

配置jar包调用环境,点击File - Project~

在这里插入图片描述

选择Modules - DEpendencles - 最后选择+号,选择第一个jars。。。

在这里插入图片描述

弹出窗口后选择配置的jar包,选择后点击ok

在这里插入图片描述

配置完成,可以调用了

在这里插入图片描述

我的第一个JDBC程序格式

public class TestJDBC {
    
    
    public static void main(String[] args){
    
    
     //1. 加载驱动
        Class.forName("com.mysql.jdbc.Driver");//固定写法
        //2. 用户信息和url
        //useUnicode=true&characterEncoding=utf8&&useSSL=true
        String url ="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false";
        //mysql 默认3306
        //协议://主机地址:端口号/数据库名?参数1&参数2&参数3

       //Oracle--1521
       //jdbc:oralce:thin:@localhost:1521:sid
        String name = "root";//数据库账号
        String password = "123456";//数据库密码



        //3. 连接成功,返回数据库对象  connection代表数据库  PrepareStatement 执行SQL的对象
        Connection connection= DriverManager.getConnection(url,name,password);
        //connection代表数据库
        connection.rollback();//事务回滚
        connection.commit();//事务提交
        connection.setAutoCommit();//数据库设置自动提交


        //4. 执行SQL的对象 statement 执行SQL的对象
        Statement statement = connection.createStatement();
        statement.executeQuery();
        statement.execute();
        statement.executeUpdate();//更新,插入,删除,返回一个受影响的行数

        //5. 执行SQL的对象 去执行SQL   可能存在结果,查看返回结果
        String sql="SELECT * FROM users";

        //ResultSet 查询的结果集,封装了所以的查询结果
        //获得指定的数据类型
        ResultSet resultSet = statement.executeQuery(sql);//返回的结果集,结果集中封装了我们全部查询的结果
        resultSet.getObject();//在不知道列类型下使用
        //如果知道则指定使用
        resultSet.getString();
        resultSet.getInt();
        resultSet.getChar();

        //遍历,指针
        while(resultSet.next()){
    
    
        resultSet.next(); //移动到下一个
        resultSet.afterLast();//移动到最后
        resultSet.beforeFirst();//移动到最前面
        resultSet.previous();//移动到前一行
        resultSet.absolute(row);//移动到指定行

           System.out.println("id+"+resultSet.getObject("id"));
            System.out.println("name+"+resultSet.getObject("NAME"));
            System.out.println("password+"+resultSet.getObject("PASSWORD"));
            System.out.println("email+"+resultSet.getObject("email"));
            System.out.println("birthday+"+resultSet.getObject("birthday"));
        }
        //6. 释放连接
        resultSet.close();
        statement.close();
        connection.close();//耗资源
    }
}

执行JDBC连接代码

import java.sql.*;

public class TestJDBC {
    
    
    public static void main(String[] args)
            throws ClassNotFoundException, SQLException {
    
    
        //通过java访问mysql数据库,查询
        //这个对象获取数据库链接
        //注册驱动,输入链接地址,用户名,密码
        String driver = "com.mysql.cj.jdbc.Driver";
        //mysql 8.0 (oracle) 把驱动包路径改了,
        //8.0之前  com.mysql.jdbc.Driver
        //8.0之后  com.mysql.cj.jdbc.Driver

        //访问本机的mysql数据库,端口3306,数据库名
        String url = "jdbc:mysql://localhost:3306/mysql-db?serverTimezone=Asia/Shanghai&characterEncoding=UTF8";
        String username = "root";
        String password = "root";

        Class.forName(driver);
        //获取到数据库链接
        Connection cn = DriverManager.getConnection(url, username, password);
        //创建一个Statement语句对象
        Statement stat = cn.createStatement();
        //执行SQL语句
        String sql = "select * from student";
        //把查询的结果(表记录)存放到ResultSet对象中,结果集
        ResultSet rs = stat.executeQuery(sql);

        //获取这个表有几个字段,元数据(描述数据的数据)
        int cols = rs.getMetaData().getColumnCount();
        System.out.println("表的列数:" + cols);

        //展示表的字段名称
        //索引值是从1开始(数据库要求)
        for(int i=1;i<=cols;i++){
    
    
            //"\t"代表转义,代表tab键,多个空格
            System.out.print(rs.getMetaData().getColumnName(i) + "\t");
        }
        System.out.println();//换行

        //展示数据,行数while循环,next()取下一条记录,如果没有,循环就结束
        //next()有记录就返回ture,如果到最后面了,就返回false
        while (rs.next()){
    
    
            for (int i = 1; i <= cols; i++) {
    
    
            //获取他的字段内容
            System.out.print(rs.getString(i)+"\t");
          }
          System.out.println(); //换行
        }
    }
}

SQL注入:

sql存在漏洞,会被攻击导致数据泄露== SQL会被拼接 or==

public class SQL注入 {
    
    
    public static void main(String[] args) {
    
    
    login("root","123456");//正常登陆

        //SQL注入
 login("' or '1=1","123456");
    }
    public static void login(String name,String password){
    
    
        Connection conn =null;
        Statement st = null;
        ResultSet rs =null;
        String driver = "com.mysql.cj.jdbc.Driver";
         String url = "jdbc:mysql://localhost:3306/mysql-db?serverTimezone=Asia/Shanghai&characterEncoding=UTF8";
        String username = "root";
        String password = "root";
        Class.forName(driver);
        Connection cn = DriverManager.getConnection(url, username, password);
        Statement stat = cn.createStatement();
        
        String sql = "select * from users where `NAME`='"+ name +"'  AND `PASSWORD`='"+ password +"'" ;
        ResultSet resultSet = statement.executeQuery(sql);
        while (rs.next()){
    
    
             System.out.println(rs.getString("NAME"));
        }
       //6. 释放连接
        resultSet.close();
        statement.close();
        connection.close();//耗资源
    }
}

PreparedStatement对象

PreparedStatement 可以防止SQL注入 ,效率更高。
PreparedStatement防止lSQL注入的本质,把传递进来的参数当做字符
假设其中存在转义字符,比如说 ’ 会被直按转义

新增
删除
查询
            //区别
            //使用问好占位符代替参数
            String sql = "insert into users(id,`NAME`) values(?,?)";
            pstm = connection.prepareStatement(sql);//预编译sql,先写sql然后不执行
            //手动给参数赋值
            pstm.setInt(1,4);//id
            pstm.setString(2,"qingfeng");
            pstm.setString(2,"1043051018");
            pstm.setString(2,"[email protected]");
            //注意点:
            //sql.Date   数据库    java.sqL.Date()
            //util.Date  Java     new Date().getTime()获得时问激
            st.setDate( parameterlndex: 5,new java.sql.Date(new Date( ).getTime()));

            //执行
            int i = pstm.executeUpdate();
            if (i>0){
    
    
                System.out.println("插入成功");
            }

使用IDEA连接数据库

在这里插入图片描述
选择你的数据库

在这里插入图片描述连接数据库
在这里插入图片描述选择要显示的数据库
在这里插入图片描述

总结:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/QQ1043051018/article/details/112234055