jdbc从入门到精通详解

4 篇文章 0 订阅
2 篇文章 0 订阅

1.JDBC简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.JDBC快速入门

2.1jdbc创建基本步骤

在这里插入图片描述

2.2 jdbc快速入门案例

1.先准备一个数据库,表名为db1
在这里插入图片描述
然后再idea里面去写jdbc去修改,id=1时候的password值

package com.xiaowang.jdbc;

import javax.swing.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/**
 * @Author 小王
 * @DATE: 2022/5/6
 */
//jdbc快速入门
public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        String url ="jdbc:mysql://127.0.0.1:3306/db1?serverTimezone=UTC";
        String username ="   ";//这里要填自己的数据库名
        String password ="   *";//填自己的数据库密码
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义sql语句
        String sql =" UPDATE db1 SET userpassword = 123456abc WHERE id =1";
        //4.获取执行sql语句的对象 Statement对象获取
        Statement stmt = conn.createStatement();
        //5.执行sql语句对象,记录sql执行结果行数
        int i = stmt.executeUpdate(sql);//受影响行数
        //6.处理结果,这里用输出行数就行吧
        System.out.println("受影响行数:"+i);
        //7.释放资源,要按照顺序
        stmt.close();
        conn.close();
    }
}

特别注意:
String url =" “; //填自己的表明
String username =” “;//这里要填自己的数据库名
String password =” *";//填自己的数据库密码

然后我们会发现,数据库内容发生改变:
在这里插入图片描述
在这里插入图片描述

3.JDBC API详解

3.1 DriverManager

3.1.1 DriverManager 基本介绍

在这里插入图片描述
常用方法:
在这里插入图片描述
在这里插入图片描述

3.1.2 DriverManager注册驱动

在这里插入图片描述

平时的驱动注册我们都是用:
在这里插入图片描述
通过查看源码,其实底层还是Driver
在这里插入图片描述
其实我们导入的8后面的jar包中有了驱动的注册,所以,1.8后面的API是不用再手动写驱动注册程序的

3.1.3 DriverManager连接数据库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 Connection

3.2.1 Connection连接数据库

在这里插入图片描述

3.2.2 Connection事务管理

在这里插入图片描述
案例演示:

package com.xiaowang.jdbc;

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

/**
 * @Author 小王
 * @DATE: 2022/5/6
 */
//事务详解
public class JDBCDemo3Connection {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        //Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        String url ="jdbc:mysql:///db1?serverTimezone=UTC";
        String username ="    ";
        String password ="   ";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义sql语句
        String sql1 =" UPDATE db1 SET userpassword = 123456111 WHERE id =1";
        String sql2 =" UPDATE db1 SET username = 12345 WHERE id =2";
        //4.获取执行sql语句的对象 Statement对象获取
        Statement stmt = conn.createStatement();

        try {
        //开启事务
        conn.setAutoCommit(false);//手动开启事务
        //使用异常去执行事务的回滚
        //5.执行sql语句对象,记录sql执行结果行数
            int i = stmt.executeUpdate(sql1);//受影响行数
            //6.处理结果,这里用输出行数就行吧
            System.out.println("受影响行数:"+i);
            //5.执行sql语句对象,记录sql执行结果行数
            int i1 = stmt.executeUpdate(sql2);//受影响行数
            //6.处理结果,这里用输出行数就行吧
            System.out.println("受影响行数:"+i1);
            //提交事务
            conn.commit();
        } catch (Exception throwables) {
            //回滚事务
            conn.rollback();
            throwables.printStackTrace();
        }

        //7.释放资源,要按照顺序
        stmt.close();
        conn.close();
    }
}

在这里插入图片描述

修改前:

修改后:
在这里插入图片描述

3.3 Statement(含SQL)

在这里插入图片描述

数据定义语言(Data Definition Language, DDL):
用于管理和定义数据对象,包括数据库,数据表等

		- create: 创建数据库和表
		- 语法格式: creat database if not exists 数据库名称 character set = 编码名称; 
		- 例:
		- - create database ruochen;
		- create database if not exists ruochen;  // 忽视错误,显示警告
		- -----------------------------------------------------------------------------------
		- drop: 删除表对象
		- 语法格式:
		- drop database 数据库名称;
		- 例如:
		- drop database ruochen;  // 删除数据库
		- ---------------------------------------------------------------------------------
		- alter: 修改表结构
		- 语法格式: alter database if not exists 数据库名称 character set 新的编码名称
		- 例如:
		- alter database db character set = utf8;

数据操作语言(Data Manipulation Language, DML):
用于操作数据库对象中所包含的数据

		- insert: 添加数据
		- 语法格式:
		- insert into 表名 (列名1,列名2,....) values|value (数值1|表达式,数值2|表达式,....);
		- 例:
		- insert into teacher (id, name) values ('1', 'xian zheng ta yi ge yi');
		- insert into teacher value(2, '
		- wangjianlin', 'xian zheng ta yi ge yi');  // 如果前面不指定字段,默认采用所有字段,按照列的顺序添加
		- ---------------------------------------------------------------------------------------------------
		- delete: 删除数据
		- 语法格式:
		- delete from 表名 where 条件;
		- 例:
		- delete from teacher where id=1;  // 指定条件删除记录
		- delete from teacher;  // 不带条件删除,删除所有记录
		- 扩充:
		- truncate table 表名;  // 清空表,会清空表中所有数据
		- 例如
		- truncate table teacher;
		- 
		- 面试题:
		- delete删除与truncate 有什么区别?
			- 删除方式
				- delete:一条一条的删除,不清空 auto_increment 记录数
				- truncate:直接将表中的数据进行清空, auto_increment 自增将被重置,从新开始
	 ---------------------------------------------------------------------------------------------------
		- update: 修改数据
		- 语法格式:
		- update 表名 set 列名1=数值,列名2=数值,.... where 条件;
		- 例如:
			- update teacher set name='xiaosan',note='ming nian zai zhao yi ge' where id=1;  // 带条件修改,修改指定记录
			- update teacher set name='xiaosi';  // 不带条件,修改表中所有数据

3. DQL(Data Query Language,数据查询语言)
  主要用于查询数据库当中的数据

.代表指令:
select 查询表中的数据
from 查询哪张表、视图
where 约束条件

3.3 ResultSet

在这里插入图片描述
简单案例分析:

package com.xiaowang.jdbc;

import java.sql.*;

/**
 * @Author 小王
 * @DATE: 2022/5/6
 */
public class JDBCDemo5ResultSet {
    public static void main(String[] args) throws Exception {
        //2.获取连接
        String url ="jdbc:mysql:///db1?serverTimezone=UTC";
        String username ="root";
        String password ="949zghzj*";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义sql
        String sql = "select * from db1";
        //4.获取对象
        Statement statement = conn.createStatement();
        //5.执行对象
        ResultSet resultSet = statement.executeQuery(sql);
        //遍历查询一遍数据,使用next()游标
        /*while (resultSet.next()){
            //获取数据,根据行来一条条获取
            int anInt = resultSet.getInt(1);
            String name = resultSet.getString(2);
            String word = resultSet.getString(3);

            System.out.println(anInt);
            System.out.println(name);
            System.out.println(word);
            System.out.println("=========");
        }*/

        while (resultSet.next()){
            //获取数据,根据列名来一条条获取
            int anInt = resultSet.getInt("id");
            String name = resultSet.getString("username");
            String word = resultSet.getString("userpassword");

            System.out.println(anInt);
            System.out.println(name);
            System.out.println(word);
            System.out.println("=========");
        }
        resultSet.close();
        statement.close();
        conn.close();
    }
}

ResultSet案例:
题目:查询db1数据表的信息,封装到User对象中,然后储存到集合中
分析:

/*
package com.xiaowang.jdbc;

import java.sql.*;

*/
/**
 * @Author 小王
 * @DATE: 2022/5/6
 *//*

public class JDBCDemo5ResultSet {
    public static void main(String[] args) throws Exception {
        //2.获取连接
        String url ="jdbc:mysql:///db1?serverTimezone=UTC";
        String username ="root";
        String password ="949zghzj*";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义sql
        String sql = "select * from db1";
        //4.获取对象
        Statement statement = conn.createStatement();
        //5.执行对象
        ResultSet resultSet = statement.executeQuery(sql);
        //遍历查询一遍数据,使用next()游标
        

        while (resultSet.next()){
            //获取数据,根据列名来一条条获取
            int anInt = resultSet.getInt("id");
            String name = resultSet.getString("username");
            String word = resultSet.getString("userpassword");

            System.out.println(anInt);
            System.out.println(name);
            System.out.println(word);
            System.out.println("=========");
        }
        resultSet.close();
        statement.close();
        conn.close();
    }
}
*/
package com.xiaowang.jdbc;

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

/**
 * @Author 小王
 * @DATE: 2022/5/6
 */
public class JDBCDemo5ResultSet {
    public static void main(String[] args) throws Exception {
        //2.获取连接
        String url ="jdbc:mysql:///db1?serverTimezone=UTC";
        String username ="root";
        String password ="949zghzj*";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义sql
        String sql = "select * from db1";
        //4.获取对象
        Statement statement = conn.createStatement();
        //5.执行对象
        ResultSet resultSet = statement.executeQuery(sql);
        //遍历查询一遍数据,使用next()游标

        //需求:讲数据库中的信息,存放到一个对象集合中去
        //写一个集合list去存放对象
        List list = new ArrayList();
        while (resultSet.next()){
            //创建一个和user对象,来接收查询后的值
            User user = new User();
            //获取数据,根据列名来一条条获取
            int anInt = resultSet.getInt("id");
            String name = resultSet.getString("username");
            String word = resultSet.getString("userpassword");
            //讲数据存放到对象中
            user.setId(anInt);
            user.setUsername(name);
            user.setPassword(word);
            //将对象存放到list集合中
            list.add(user);
        }
        System.out.println(list);//输出看一下list里面的信息
        resultSet.close();
        statement.close();
        conn.close();
    }
}

3.4 PreparedStatement

在这里插入图片描述

3.4.1 注入原因以及防御

产生注入的原因:

在这里插入图片描述
解决注入方案:
在这里插入图片描述
传递逻辑:
在这里插入图片描述

3.4.1 PreparedStatement原理

在这里插入图片描述
如果要使用预编译的话;
在这里插入图片描述
使用预编译和不使用的区别:
在这里插入图片描述
小结:

在这里插入图片描述
案例:

package jdbc;

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

/**
 * @Author:小王吖
 * @Date:2022/8/23
 */
public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接(jdbc:mysql://ip:端口号/数据库名)这里要是用本机的,可以省区ip和端口号
        String url = "jdbc:mysql://localhost:3306/zlt?useSSL=false&characterEncoding=utf-8&useServerPrepStmts=true";
        String user = "root";
        String password ="949zghzj*";
        Connection connection = DriverManager.getConnection(url,user,password);
        //3.定义sql语句
        String sql = "insert into db1(id,username,userpassword) values (?,?,?)";
        //4.获取执行sql语句的对象 Statement对象获取
        PreparedStatement pst = connection.prepareStatement(sql);
        //5.执行sql语句对象,记录sql执行结果行数
        pst.setInt(1,3);
        pst.setString(2,"啦啦");
        pst.setString(3,"123321123");
        int i = pst.executeUpdate();
        System.out.println("受影响行数"+i);
        //7.释放资源,要按照顺序
        pst.close();
        connection.close();
    }
}

4.数据库连接池

4.1 数据库连接池基本介绍

在这里插入图片描述
通俗理解:
在这里插入图片描述
好处:
在这里插入图片描述
在这里插入图片描述

4.2 Driud连接池

使用步骤:
在这里插入图片描述
案例分析:
加载文件配置:
在这里插入图片描述

整个连接步骤:

package com.xiaowang.druid_;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Map;
import java.util.Properties;

/**
 * @Author 小王
 * @DATE: 2022/5/6
 */
//Druid数据库连接池演示
public class DruidDemo {
    public static void main(String[] args) throws Exception {
        //1.导入jar包

        //2.定义配置文件

        //3.加载配置文件(根据自己的文件来配置,主4)
        Properties prop = new Properties();//根据4去创建配置文件的对象
        //需要使用 FileInputStream 去加载配置文件,里面从传入配置文件的路径即可
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));

        //4.获取连接池对象,使用DruidDataSourceFactory工场去创建连接对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

        //5.获取数据库连接 connection
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        
        //System.out.println(System.getProperty("user.dir"));
        //因为我们再加载路径的时候可能会因为模块啥的出错,为了直接获取到正确路径,我们可以显式的输出下当前文件的路径,
        // 然后加在路径前面,写全即可
    }
}

注意:
prop.load(new FileInputStream(“jdbc-demo/src/druid.properties”));

在这里写加载文件路径的时候,经常因为要不要模板名啥的报错,为了方便我们可以直接先注释掉所有代码,去显式的输出一下我们的路径,然后再写进路径里面:

System.out.println(System.getProperty(“user.dir”));

5.JDBC练习题

完成一个商品品牌的增删改查操作:
准备:
一个名为tb_brand 的数据表:
在这里插入图片描述

然后进行增删查改操作:

全部写在一起了 直接把注释打开就ok了

package com.xiaowang.example;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.xiaowang.pojo.Brand;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.*;
import java.util.*;
import java.util.Properties;

/**
 * @Author 小王
 * @DATE: 2022/5/7
 */
//数据的增删改查
public class BrandTest {
    public static void main(String[] args) throws Exception {

    //查询所有:SQL:select * from tb_brand;
    //参数:并不需要
    //结果:用list去封装
        //1.获取连接对象
        // 1.导入jar包
        //2.定义配置文件
        //3.加载配置文件(根据自己的文件来配置,主4)
        Properties prop = new Properties();//根据4去创建配置文件的对象
        //需要使用 FileInputStream 去加载配置文件,里面从传入配置文件的路径即可
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
        //4.获取连接池对象,使用DruidDataSourceFactory工场去创建连接对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //5.获取数据库连接 connection
        Connection connection = dataSource.getConnection();
        //6.定义数据库语句
        String sql = "select * from tb_brand;";//查询所有
    //    String sql ="INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?)";
        //7.获取对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //8.传入参数:
        // preparedStatement.setString();,因为这个查询全部,没有参数就可以不用
        //9.执行结果,用executeQuery()查看
        ResultSet resultSet = preparedStatement.executeQuery();
        //10.因为要用对象来封装那么就用list集合来
        Brand brand = null;//定义brand对象去存放数据
        List<Brand> brands = new ArrayList<>();//集合存放
        //11.用.next()方法来遍历查看
        while (resultSet.next()){
            //先获取数据
            int id = resultSet.getInt("id");
            String brandName = resultSet.getString("brand_name");
            String companyName = resultSet.getString("company_name");
            int ordered = resultSet.getInt("ordered");
            String description = resultSet.getString("description");
            int status = resultSet.getInt("status");
            //封装数据
            brand = new Brand();//来一组数据,咱们就new一个对象来接收
            brand.setId(id);
            brand.setBrandName(brandName);
            brand.setCompanyName(companyName);
            brand.setOrdered(ordered);
            brand.setDescription(description);
            brand.setSTATUS(status);
            //装载集合
            brands.add(brand);
        }
        System.out.println(brands);
        //11.释放资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }

/*

        //添加:SQL: INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?);
        //参数:id是自增长的,就不用设参数了
        //结果:返回一个boolean,去提示是否添加成功

        //写死参数:
        String brandName = "香飘飘";
        String companyName ="香飘飘";
        int ordered = 4;
        String description ="绕地球八十圈";
        int status =1;
        //1.获取连接对象
        // 1.导入jar包
        //2.定义配置文件
        //3.加载配置文件(根据自己的文件来配置,主4)
        Properties prop = new Properties();//根据4去创建配置文件的对象
        //需要使用 FileInputStream 去加载配置文件,里面从传入配置文件的路径即可
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
        //4.获取连接池对象,使用DruidDataSourceFactory工场去创建连接对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //5.获取数据库连接 connection
        Connection connection = dataSource.getConnection();
        //6.定义数据库语句
        String sql = "INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?);";//查询所有
        //    String sql ="INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?)";
        //7.获取对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //8.传入参数:
        preparedStatement.setString(1,brandName);
        preparedStatement.setString(2,companyName);
        preparedStatement.setInt(3,ordered);
        preparedStatement.setString(4,description);
        preparedStatement.setInt(5,status);
        //9.执行结果,用executeUpdate()查看,记录执行条数就行
        int count = preparedStatement.executeUpdate();
        System.out.println(count>0);
        //11.释放资源
        preparedStatement.close();
        connection.close();
    }
*/

/*

        //修改:UPDATE tb_brand SET(brand_name=?, company_name=?, ordered=?, description=?, STATUS=?) WHERE id=?;
        //参数:根据需要去修改写
        //结果:返回一个boolean,去提示是否修改成功

        //写死参数:
        int id = 8;
        String brandName = "香飘飘";
        String companyName ="香飘飘";
        int ordered = 10;
        String description ="绕地球八十圈";
        int status =0;
        //1.获取连接对象
        // 1.导入jar包
        //2.定义配置文件
        //3.加载配置文件(根据自己的文件来配置,主4)
        Properties prop = new Properties();//根据4去创建配置文件的对象
        //需要使用 FileInputStream 去加载配置文件,里面从传入配置文件的路径即可
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
        //4.获取连接池对象,使用DruidDataSourceFactory工场去创建连接对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //5.获取数据库连接 connection
        Connection connection = dataSource.getConnection();
        //6.定义数据库语句
        String sql = "UPDATE tb_brand SET brand_name=?, company_name=?, ordered=?, description=?, STATUS=? WHERE id=?;";//查询所有
        //    String sql ="INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?)";
        //7.获取对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //8.传入参数:
        preparedStatement.setString(1,brandName);
        preparedStatement.setString(2,companyName);
        preparedStatement.setInt(3,ordered);
        preparedStatement.setString(4,description);
        preparedStatement.setInt(5,status);
        preparedStatement.setInt(6,id);

        //9.执行结果,用executeUpdate()查看,记录执行条数就行
        int count = preparedStatement.executeUpdate();
        System.out.println(count>0);
        //11.释放资源
        preparedStatement.close();
        connection.close();
    }

*/
/*

        //删除:DELETE FROM tb_brand  WHERE id=?;
        //参数:id
        //结果:返回一个boolean,去提示是否删除成功

        //写死参数:
        int id = 7;
        int id1= 8;
        //1.获取连接对象
        // 1.导入jar包
        //2.定义配置文件
        //3.加载配置文件(根据自己的文件来配置,主4)
        Properties prop = new Properties();//根据4去创建配置文件的对象
        //需要使用 FileInputStream 去加载配置文件,里面从传入配置文件的路径即可
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
        //4.获取连接池对象,使用DruidDataSourceFactory工场去创建连接对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //5.获取数据库连接 connection
        Connection connection = dataSource.getConnection();
        //6.定义数据库语句
        String sql = "DELETE FROM tb_brand  WHERE id=?;";//查询所有
        //    String sql ="INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?)";
        //7.获取对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //8.传入参数:
        preparedStatement.setInt(1,id);
        //9.执行结果,用executeUpdate()查看,记录执行条数就行
        int count = preparedStatement.executeUpdate();
        System.out.println(count>0);
        //多删除几行,需要多执行几次撒
        preparedStatement.setInt(1,id1);
        int count1 = preparedStatement.executeUpdate();
        System.out.println(count1>0);

        //11.释放资源
        preparedStatement.close();
        connection.close();
    }

*/


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值