mysql驱动使用一站式解决

JDBC 简介

本质是通过一套 API 接口来操作数据库

本质还是 操作关系型数据库 , 核心是数据库 , 这只是对数据库的操作 .

jdbc

1.使用 JDBC

1.建立连接

本质就是两个程序之间的事情

        <!-- 驱动 : -->
		<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.26</version>
        </dependency>
        // a.注册驱动的四种办法
		// 1.Class.forName("驱动全限名")
		Class.forName("com.mysql.jdbc.Driver");

		// 2.new 构造器
		java.sql.Driver driver = new com.mysql.jdbc.Driver();

		// 3.设置启动选项
		java -Djdbc.drivers=com.mysql.jdbc.Driver;other 源文件
            
        // 4.驱动 jar 包的 META-INF 文件夹里的 : 
        // services 文件夹里的 : java.sql.Driver 文件
        // 编辑 : 	com.mysql.jdbc.Driver
		// 编辑 : 	com.mysql.fabric.jdbc.FabricMySQLDriver

		// b. 获取连接 (独立事务单位)
        Connection connt = DriverManager
            .getConnection("jdbc:mysql://localhost:3306/db000
            ?useSSL=false&serverTimezone=Asia/Shanghai
            &user=root&password=admin
            &useUnicode=true&characterEncoding=UTF-8");

		// c.关闭连接 (事务)
        connt.close();

2.程序间交换数据

事务本质就是 Connection 实例对象控制

// 自动提交事务关闭 , 等价于开启事务 [true 为自动提交, sql 会自动提交] void
connt.setAutoCommit(false);
        
// 提交事务 void
connt.commit();
        
// 事务回滚 void
connt.rollback(); 

3.普通语句执行

普通语句

// 增删改的操作都在这        
int result = statement.executeUpdate(sql);

// 查询操作都交给这个方法 : result 重复使用
ResultSet resultSet = statement.executeQuery(sql);

处理查询结果

        while (resultSet.next()) {
            // 获取查询数据
            System.out.print(resultSet.getInt("id") + "\t");
            System.out.print(resultSet.getString("brand_name") + "\t");
            System.out.print(resultSet.getString("company_name") + "\t");
            System.out.print(resultSet.getInt("ordered") + "\t");
            System.out.print(resultSet.getString("description") + "\t");
            System.out.println(resultSet.getInt("status") + "\t");
            System.out.println("------------------------------------------");
        }

jdbc查询结果

2.获取执行结果 (通过对象封装)

package com.example.domain;

public class Brand {
    Integer id;
    String brand_name;
    String company_name;
    Integer ordered;
    String description;
    Integer status;

    @Override
    public String toString() {
        return
                "id=" + id +
                ", brand_name='" + brand_name + '\'' +
                ", company_name='" + company_name + '\'' +
                ", ordered=" + ordered +
                ", description='" + description + '\'' +
                ", status=" + status;
    }
}
        List<Brand> brandList = new ArrayList<>();
        
        while (resultSet.next()) {

            Brand brand = new Brand();

            // 获取查询数据
            int id = resultSet.getInt("id");
            String brand_name = resultSet.getString("brand_name");
            String company_name = resultSet.getString("company_name");
            int ordered = resultSet.getInt("ordered");
            String description = resultSet.getString("description");
            int status = resultSet.getInt("status");

            brand.id = id;
            brand.brand_name = brand_name;
            brand.company_name = company_name;
            brand.ordered = ordered;
            brand.description = description;
            brand.status = status;

            brandList.add(brand);
        }
        
        System.out.println(brandList);

4.预编译语句执行(防止 SQL注入)

sql 注入介绍

 		// a.前端获得数据 name password
		String name = "lll";
        String password = "` or `1` = `1";

		// 拼成 sql 语句后 : 密码是什么都为真
        String sql = "select * from tb_brand where 
            name = 'lll' and password = '' or '1' = '1'";

本质就是预编译后 : 值只会作为字面值而不是运算符号

String sql = "select * from tb_brand where id = ? and status = ?";
PreparedStatement preparedStatement = connt.prepareStatement(sql);
int id = 140;
int status = 0;
preparedStatement.setInt(1, id);
preparedStatement.setInt(2, status);

prepare防止sql注入1

启动预编译 : 有些人说预编译好, 但他连预编译都没打开, 就很搞笑

启动预编译 : useServerPrepStmts=true

手动重启 mysql 服务即可

预编译sql

重写启动mysql

预编译效果

5.事务管理-详解

本质 : Connection 对象是事务控制的基本单位

        Class.forName("com.mysql.jdbc.Driver");
        Connection root1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db000", "root", "159357ljm");


        String sql1 = "delete from tb_brand where id = 130";
        String sql2 = "delete from tb_brand where id = 131";
        String sql3 = "delete from tb_brand where id = 132";
		// 语句 : 通过连接获得 , 同一个连接是一个事务
        Statement statement1 = root1.createStatement();
		// 语句 : 通过连接获得 , 同一个连接是一个事务
        Statement statement2 = root1.createStatement();
		// 语句 : 通过连接获得 , 同一个连接是一个事务
        Statement statement3 = root1.createStatement();

		// 自动提交改为 false
        root1.setAutoCommit(false);
		// 暂时不提交 : 缓存
        System.out.println(statement1.executeUpdate(sql1));
		// 自动提交改为 true 由 false 变为 true 会 conmmit 缓存中的语句
		// sql1 执行
        root1.setAutoCommit(true);
		// sql2 执行
        System.out.println(statement2.executeUpdate(sql2));
		// 自动提交改为 true 由 true 变为 false
        root1.setAutoCommit(false);
		// 不执行 : 
        System.out.println(statement3.executeUpdate(sql3));
		root1.close();
        Class.forName("com.mysql.jdbc.Driver");
        Connection root1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db000", "root", "159357ljm");
        Connection root2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db000", "root", "159357ljm");


        String sql1 = "delete from tb_brand where id = 150";
        String sql2 = "delete from tb_brand where id = 151";
        String sql3 = "delete from tb_brand where id = 152";
        String sql4 = "delete from tb_brand where id = 153";
        Statement statement11 = root1.createStatement();
        Statement statement12 = root1.createStatement();
        Statement statement13 = root1.createStatement();
        Statement statement21 = root2.createStatement();

        // 1.关闭自动提交
        root1.setAutoCommit(false);
        // 2.打开自动提交
        root2.setAutoCommit(true);
        // 150 删除
        System.out.println(statement21.executeUpdate(sql1));
        // 151 缓存
        System.out.println(statement11.executeUpdate(sql2));
        // 151 commit 删除 : root1 自动提交开启
        root1.setAutoCommit(true);
        // root2 自动提交关闭
        root2.setAutoCommit(false);
        // 152 缓存
        System.out.println(statement21.executeUpdate(sql3));
        // 153 自动删除
        System.out.println(statement13.executeUpdate(sql4));
        root1.close();
        root2.close();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值