JDBC的基础知识,基本练习

JDBC就是使用Java语言操作关系型数据库的一套API

//1.注册驱动
Class.forName( "com.mysqL.jdbc.Driver");
//2.获取迷按对象
String urL = "jdbc:mysql://127.0.0.1:3306/ dbl?useSSL=false" ;
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义SQL
String sqL = "update account set
money = 2000 where id = 1";
//4.获取执fisqL的对象
Statement stmt = conn. createStatement();
//5.执sql
int count = stmt. executeUpdate(sql);
//6.处理站果
//System. out . printIn(count);
//7.释放资源
stmt. close();
conn. close( ):

1.JDBC简介

JDBC概念:
JDBC就是使用Java语言操作关系型数据库的一套API

全称: ( Java DataBase Connectivity ) Java数据库连接

JDBC定义一套标准接口,而MySQL,Oracle,DB2都定义了JDBC的实现类

在这里插入图片描述

JDBC本质:

  • 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC) 编程,真正执行的代码是驱动jar包
    中的实现类

JDBC好处:

  • 各数据库厂商使用相同的接口,Java代码不

  • 需要针对不同数据库分别开发,

  • 可随时替换底层数据库,访问数据库的Java
    代码基本不变

2.JDBC快速入门

0.创建工程,导入驱动jar包
mysql-connector-java-5.1.48jar

1.注册驱动
Class. forName("com.mysql.jdbc.Driver");

2.获取连接
Connetion conn = DriverManager.getConnection(url, usemame, password);

3.定义SQL语句
String sql = "update..." ;

4.获取执行SQL对象
Statement stmt = conn.createStatement);

5.执行SQL
stmt.executeUpdate(sq);

6.处理返回结果
7.释放资源
package JDBC;


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

/**
 * jdcb的快速入门
 */
public class JDBCDemo {
    public static void main(String[] args) throws Exception{
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");//com.mysql.jdbc.Driver
        
 /*
 com.mysql.jdbc.Driver 是较旧的 MySQL Connector/J 版本中的驱动类名称,通常用于 5.x 版本之前的 MySQL 数据库连接。
com.mysql.cj.jdbc.Driver 则是在 MySQL Connector/J 8.0 版本(对应 MySQL 8.0)及之后的新版本中使用的驱动类。
 */
        //2.获取连接
        String password = "123456";
        String username = "root";
        String url = "jdbc:mysql://127.0.0.1:3306/itheima";
        Connection conn =DriverManager.getConnection(url,username,password);
        //3.定义sql
        String sql = "UPDATE account SET money = 2000 WHERE id = 1";
       // 4.获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //5.执行sql
        int count = stmt.executeUpdate(sql);//返回受影响的行数
        //6.处理
        System.out.println(count);
        //7.释放资源
        stmt.close();
        conn.close();

    }

}

创建工程,导入驱动jar包
mysql-connector-java-5.1.48jar

需要自己去下载。

在这里插入图片描述

进行执行操作:先去数据库看看我们的一个表格数据

在这里插入图片描述

根据执行操作:UPDATE account SET money = 2000 WHERE id = 1;

在这里插入图片描述

查询数据:

在这里插入图片描述

3.JDBC API详解

3.1DriverManager

DriverManager(驱动管理类)作用:

  1. 注册驱动
  2. 获取数据库连接

1.注册驱动

Class.forName(“com.mysql.Jdbc.Driver”)

查看Driver类源码

  static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }

提示:
MySQL 5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类

2.获取连接

static ConnectiongetConnection (string ur1, String user, String password)

参数1

  1. url: 连接路径

语法: jdbc:mysq://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
示例: jdbc:mys/://127.0.0. 1:3306/db1
细节:
如果连接的是本机mysq|服务器,并且mysq|服务 默认端口是3306,则urI可以简写为: jdbc:mys:///数据库名称?参数键值对
配置useSSL=false参数,禁用安全连接方式,解决警告提示
  1. user: 用户名
  2. password: 密码

String urL = “jdbc :mysqL:///db1?useSSL=false”;

3.2Connection

Connection(数据库连接对象)作用:

  1. 获取执行SQL的对象

  2. 管理事务

  3. 获取执行SQL的对象

普通执行SQL对象

statement createStatement()

预编译SQL的执行SQL对象:防止SQL注入

PreparedStatement prepareStatement (sq|)

执行存储过程的对象

CallableStatement prepareCall (sql)

2.事务管理

  • MySQL事务关联
开启事务: BEGIN;/ START TRANSACTION;
提交事务: COMMIT;
回滚事务: ROLLBACK;
MySQL默认自动提交事务

JDBC 事务管理:Connection接口中定义了3个对应的方法

开启事务: setAutoCommit(boolean autoCommit): true为自动提交事务; false为手动提交事务,即为开启事务
提交事务: commit()
回滚事务: rollback()

public class JDBCDemo2 {
    public static void main(String[] args) throws Exception{
        //1.注册驱动
  Class.forName("com.mysql.cj.jdbc.Driver");//com.mysql.jdbc.Driver
        //2.获取连接
        String password = "123456";
        String username = "root";
        String url = "jdbc:mysql://127.0.0.1:3306/itheima";
        Connection conn =DriverManager.getConnection(url,username,password);
        //3.定义sql
        String sql = "UPDATE account SET money = 2000 WHERE id = 1";
       // 4.获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        try {
            //处理事务
            conn.setAutoCommit(false);
            //5.执行sql
            int count = stmt.executeUpdate(sql);//返回受影响的行数
            //6.处理
            System.out.println(count);
            //提交事务
            conn.commit();
        } catch (SQLException e) {
            //回滚事务
            conn.rollback();
            throw new RuntimeException(e);
        }
        //7.释放资源
        stmt.close();
        conn.close();
    }
}

3.3 Statement

Statement作用:
1.执行SQL语句

执行SQL语句

int executeUpdate(sq): 执行DML、DDL语句
➢返回值: (1) DML语句影响的行数(2) DDL语句执行后,执行成功也可能返回0
ResultSet
executeQuer(sql):执行DQL语句
➢返回值:
ResultSet结果集对象

3.4ResultSET

ResultSet(结果集对象)作用:
1.封装了DQL查询语句的结果

ResultSet
stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象

获取查询结果

boolean next(): (1) 将光标从当前位置向前移动一行(2) 判断当前行是否为有效行
➢返回值:
true: 有效行,当前行有数据
false:无效行,当前行没有数据

xXx getXxx(参数): 获取数据
➢xXX:数据类型;如: int getInt(参数) ; String getString(参数)
➢参数:

int:列的编号,从1开始
String:列的名称

使用步骤:
1.游标向下移动一行,并判断该行否有数据: next()
2.获取数据: getXxx(参数)

//循环判断游标是否是最后一行末尾
while(rs .next(){
//获取数据
rs.getXxx(参数);
}

public class ResultSet {
    @Test
    public void testResultSet() throws Exception {
      //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql:///itheima";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);
        //3.定义sql
        String sql = "SELECT * FROM account";
        //4.获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //5.执行sql
        java.sql.ResultSet rs =  stmt.executeQuery(sql);
        //6.处理结果
        while (rs.next()){
            int id = rs.getInt(1);
            String name = rs.getString(2);
            double money = rs.getDouble(3);
            System.out.println(id+","+name+","+money);

        }
        //7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }

ResultSet 案例

需求:查询account账号表数据,封装为Account对象中,并且存储到ArrayList集合中

在这里插入图片描述

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * 查询account账号表数据,封装为Account对象中,并存储到ArrayList集合中
 * 1.定义实体类Account
 * 2.定义sql语句,查询account表数据,封装到Account对象中
 * 3.将Account对象存储到ArrayList集合中
 */
public class ResultSet {
    @Test
    public void testResultSet() throws Exception {
      //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql:///itheima";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);
        //3.定义sql
        String sql = "SELECT * FROM account";
        //4.获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //5.执行sql
        java.sql.ResultSet rs =  stmt.executeQuery(sql);
        //创建集合
        List<Account>list = new ArrayList<>();
        //6.处理结果
        while (rs.next()){
            Account account = new Account();
            int id = rs.getInt(1);
            String name = rs.getString(2);
            double money = rs.getDouble(3);
           account.setId(id);
           account.setName(name);
           account.setMoney(money);
           list.add(account);

        }
        System.out.println(list);
        //7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

3.4PreparedStatement

PreparedStatement作用:
1.预编译SQL语句并执行: 预防SQL注入问题

SQL注入
SQL注入是通过操作输入来修改事先定义好的SQL语询,用以达到执行代码对服务器进行攻击的方法。

create table tb_loginuser(
    id int,
    username varchar(20),
    password varchar(20)
);
insert into tb_loginuser values(1,'张三','123'),(2,'李四','234');
select * from tb_loginuser;
public class UserLogin {
    @Test
    public void testLogin() throws Exception {

        //2.获取连接
        String url = "jdbc:mysql:///itheima";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);
      String name ="张三";
      String pwd ="123";
      String sql = "select *from tb_loginuser where username ='"+name+"' and password = '"+pwd+"'";
      //3.获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //4.执行sql
        java.sql.ResultSet rs = stmt.executeQuery(sql);
        if(rs.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }


        //7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }

}

上述是登录操作,现在我们演示一些SQL注入操作

package JDBC;

import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;

import java.sql.Statement;


/**
 * 弄一下关于SQL注入的操作
 */
public class UserLogin {
    @Test
    public void testLogin() throws Exception {
        //2.获取连接
        String url = "jdbc:mysql:///itheima";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);
      String name ="sadsadsa";//用户名和密码随便写

        String pwd = "'or '1'='1";

        String sql = "select *from tb_loginuser where username ='"+name+"' and password = '"+pwd+"'";
      //3.获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //4.执行sql
        java.sql.ResultSet rs = stmt.executeQuery(sql);
        if(rs.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
        //7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}
se1ect * from tb_user where username = 'sadsadsa' and password = '' or '1' ='1'

①获取PreparedStatement对象

// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password= ?";
//通过Connection对象获取,并传入对应的sql语句
PreparedStatemenft pstmt = conn.prepareStatement(sql);

②设置参数值

PreparedStatement对象: setXxx(参数1, 参数2):?赋值
➢Xxx: 数据类型;如setInt (参数1,参数2)
➢参数:
参数1:  ?的位置编号,从1开始
参数2: ?的值

③执行SQL

executeUpdate(); / executeQuery(); :不需要再传递sql
public class UserLogin {
    @Test
    public void testLogin_join() throws Exception {

        //2.获取连接
        String url = "jdbc:mysql:///itheima";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);
      String name ="张三";//用户名和密码随便写

        String pwd = "123";

        String sql = "select *from tb_loginuser where username = ? and password = ?";
      //3.获取执行sql的对象 pstmt
       java.sql.PreparedStatement pstmt =conn.prepareStatement(sql);
        //4.执行sql
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);

        java.sql.ResultSet rs = pstmt.executeQuery();
        if(rs.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
        //7.释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }

}

在这里插入图片描述

4.数据库连接池

4.1数据库连接池简介

数据库连接池简介
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一 个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最 大空闲时间的数据库连接来避免因为没有释放数据库连接而引|起的数据库连接遗漏
好处:
资源重用
提升系统响应速度
避免数据库连接遗漏

在这里插入图片描述

数据库连接池实现
标准接口: DataSource
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此口。
功能:获取连接

Connection getConnection()

常见的数据库连接池:
DBCP
C3P0
Druid

Druid(德鲁伊)
Druid连接池是阿里巴巴开源的数据库连接池项目
功能强大, 性能优秀,是Java语言 最好的数据库连接池之一

5.增删改练习

完成商品品牌数据的增删改查操作

查询:查询所有数据
添加:添加品牌
修改:根据id修改
删除:根据id删除

配置环境:

创建数据库表格:

-- 删除tb_brand表
DROP TABLE IF EXISTS tb_brand;
-- 创建tb_brand表
create table tb_brand
(
    -- id 主键
    id          int primary key auto_increment,
    -- 品牌名称
    brand_name  varchar(20),
    -- 企业名称
    company_name  varchar(20),
    -- 排序序号
    ordered     int,
    -- 描述信息
    description varchar(100),
    -- 是否启用 1启用 0未启用
    status      int
);
-- 添加数据
insert into tb_brand(brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃的松鼠', 0),
       ('小米', '小米科技有限公司', 50, '小米好用', 1),
       ('华为', '华为有限公司', 100, '华为好用', 1);
select * from tb_brand;

创建一个Brand类

package pojo;

public class Brand {
  // id 主键
    private Integer id                        ;
    // 品牌名称
    private String brand_name                ;
    // 企业名称
    private String company_name              ;
    // 排序序号
    private Integer ordered                   ;
            // 描述信息
    private String description               ;
    // 是否启用 1启用 0未启用
   private Integer status                    ;

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getBrand_name() {
    return brand_name;
  }

  public void setBrand_name(String brand_name) {
    this.brand_name = brand_name;
  }

  public String getCompany_name() {
    return company_name;
  }

  public void setCompany_name(String company_name) {
    this.company_name = company_name;
  }

  public Integer getOrdered() {
    return ordered;
  }

  public void setOrdered(Integer ordered) {
    this.ordered = ordered;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public Integer getStatus() {
    return status;
  }

  public void setStatus(Integer status) {
    this.status = status;
  }

  @Override
  public String toString() {
    return "Brand{" +
            "id=" + id +
            ", brand_name='" + brand_name + '\'' +
            ", company_name='" + company_name + '\'' +
            ", ordered=" + ordered +
            ", description='" + description + '\'' +
            ", status=" + status +
            '}';
  }
}

创建一个BrandTest类进行测试

5.1.查询:查询所有数据

1.获取Connection

2.定义SQL:select * from tb_brand;

3.获取PreparedStatement对象

4.设置参数:不需要

5.执行SQL

6.处理结果:List

7.释放资源

package example;

import org.junit.Test;
import pojo.Brand;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BrandTest {
    /**
     * 查询所有
     * 1.SQL:select * from tb_brand;
     * 2.参数:不需要
     * 3.结果:List<Brand>
     */
    @Test
    public void testSelectAll() throws Exception {
        String url = "jdbc:mysql:///itheima";
        String username = "root";
        String password = "123456";
        //连接数据库
        Connection conn = DriverManager.getConnection(url,username,password);
        String sql = "SELECT * FROM tb_brand";
        //获取执行sql的对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //执行sql
        java.sql.ResultSet rs = pstmt.executeQuery();
        List<Brand>list = new ArrayList<>();
        while (rs.next()){
            Brand brand = new Brand();
            int id = rs.getInt("id");
            String brand_name = rs.getString("brand_name");
            String company_name = rs.getString("company_name");
            int ordered = rs.getInt("ordered");
            String description = rs.getString("description");
            int status = rs.getInt("status");
            brand.setId(id);
            brand.setBrand_name(brand_name);
            brand.setCompany_name(company_name);
            brand.setOrdered(ordered);
            brand.setDescription(description);
            brand.setStatus(status);
            list.add(brand);
       }
        System.out.println(list);
        //关闭资源
        rs.close();
        pstmt.close();
        conn.close();
    }
}

5.2添加品牌

 @Test
    public void testAddDate() throws Exception {
        //接受页面提交的参数
        String brandName = "香飘飘";
        String companyName = "香飘飘";
        int ordered = 1;
        String description = "香飘飘,绕地球一圈";
        int status = 1;
        String url = "jdbc:mysql:///itheima";
        String username = "root";
        String password = "123456";
        //连接数据库
        Connection conn = DriverManager.getConnection(url,username,password);
        //添加数据
        String sql ="INSERT INTO tb_brand(brand_name,company_name,ordered,description,status) values (?,?,?,?,?);";

        //获取执行sql的对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
       //设置参数
        pstmt.setString(1,brandName);
        pstmt.setString(2,companyName);
        pstmt.setInt(3,ordered);
        pstmt.setString(4,description);
        pstmt.setInt(5,status);
     //执行sql
       int count = pstmt.executeUpdate();
      //处理结果
        System.out.println(count>0);
        //关闭资源

        pstmt.close();
        conn.close();
    }

在这里插入图片描述

5.3修改:根据id修改

1.编写SQL语句
2.是否需要参数?需要: Brand对象所有数据
3.返回结果如何封装?boolean

update tb_ _brand
set brand_ name = ?,
company_ name= ?,
ordered= ?,
description= ?,
status=?
where id = ?;

 @Test
    public void testUpdate() throws Exception {
        //接受页面提交的参数
        String brandName = "香飘飘";
        String companyName = "香飘飘";
        int ordered = 1000;
        String description = "香飘飘,绕地球三圈";
        int status = 1;
        int id = 4;
        String url = "jdbc:mysql:///itheima";
        String username = "root";
        String password = "123456";
        //连接数据库
        Connection conn = DriverManager.getConnection(url,username,password);
        //添加数据
        String sql ="update tb_brand\n" +
                "set brand_name = ?,\n" +
                "company_name= ?,\n" +
                "ordered= ?,\n" +
                "description= ?,\n" +
                "status=?\n" +
                "where id = ?\n";

        //获取执行sql的对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //设置参数
        pstmt.setString(1,brandName);
        pstmt.setString(2,companyName);
        pstmt.setInt(3,ordered);
        pstmt.setString(4,description);
        pstmt.setInt(5,status);
        pstmt.setInt(6,id);
        //执行sql
        int count = pstmt.executeUpdate();
        //处理结果
        System.out.println(count>0);
        //关闭资源

        pstmt.close();
        conn.close();
    }

在这里插入图片描述

5.4删除:根据id删除

1.编写SQL语句 delete from tb_ brand where id = ?
2.是否需要参数?需要: id
3.返回结果如何封装? boolean

  @Test
    public void testDeleteById() throws Exception {
        //接受页面提交的参数
        int id = 4;

        String url = "jdbc:mysql:///itheima";
        String username = "root";
        String password = "123456";
        //连接数据库
        Connection conn = DriverManager.getConnection(url,username,password);
        //添加数据
        String sql ="delete from tb_brand where id = ?";

        //获取执行sql的对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //设置参数

        pstmt.setInt(1,id);
        //执行sql
        int count = pstmt.executeUpdate();
        //处理结果
        System.out.println(count>0);
        //关闭资源

        pstmt.close();
        conn.close();
    }
    //关闭资源

    pstmt.close();
    conn.close();
}

[外链图片转存中...(img-9SYmAPaU-1726024871705)]

### 5.4删除:根据id删除

```mysql
1.编写SQL语句 delete from tb_ brand where id = ?
2.是否需要参数?需要: id
3.返回结果如何封装? boolean

  @Test
    public void testDeleteById() throws Exception {
        //接受页面提交的参数
        int id = 4;

        String url = "jdbc:mysql:///itheima";
        String username = "root";
        String password = "123456";
        //连接数据库
        Connection conn = DriverManager.getConnection(url,username,password);
        //添加数据
        String sql ="delete from tb_brand where id = ?";

        //获取执行sql的对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //设置参数

        pstmt.setInt(1,id);
        //执行sql
        int count = pstmt.executeUpdate();
        //处理结果
        System.out.println(count>0);
        //关闭资源

        pstmt.close();
        conn.close();
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值