首页 > 数据库 >mysql flaot 不准

mysql flaot 不准

时间:2024-09-25 14:26:03浏览次数:3  
标签:不准 mysql 数据库 flaot Driver PreparedStatement sql close

(JDBC-MySql)

概述

JDBC全称Java DataBase Connectivityjava数据库连接

在JDBC创建之前java程序员每操作一款关系型数据库就需要学习java连接该数据库代码,由于关系型数据库过多(如:oracle、db2、MySQL......),不可能全部学习,所以java程序员就期望SUN公司能研发出一套可以运行所有关系型数据库的代码,于是JDBC就出生了。

JDBC其实是SUN公司定义的一套操作所有关系型数据库的接口(规则),具体的实现类则需要数据库公司自行编写,实现类又名为数据库驱动jar包。 当我们使用JDBC编程时实际运行的为数据库驱动jar包中的代码。

使用步骤(mysql为例)

本文所有资源都可到百度云下载 链接:https://pan.baidu.com/s/1J3888hIwUf8qHnKnfFxO6w. 提取码:j1x3

导入驱动jar包

需要到数据库官网下载jar包

在这里插入图片描述

  1. 将jar包复制到IDEA的LIB目录下(此目录可自定义名称) 在这里插入图片描述

  2. 右击jar包点击添加为库(Add as library在这里插入图片描述

  3. Level选择Module Library 在这里插入图片描述

  4. 添加成功后jar包会出现一个下拉箭头,可查看源码 在这里插入图片描述

注册驱动

告诉程序该执行指定的jar包程序

三种注册方法

  1. 反射
//抛出一个ClassNotFoundException异常
Class.forName("com.mysql.jdbc.Driver");
  1. DriverManager.registerDriver(new Driver()); 第一种反射的com.mysql.jdbc.Driver的源码实际调用了DriverManager类registerDriver静态方法

public class Driver extends NonRegisteringDriver implements java.sql.Driver {js
    public Driver() throws SQLException {}
    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

==注销驱动==

Driver driver = new Driver();//驱动
DriverManager.registerDriver(driver);//注册驱动
DriverManager.deregisterDriver(driver);//注销驱动

注意:Driver的导包为com.mysql.jdbc.Driver中的实现类;而不是java.sql.Driver的接口

  1. 设置系统属性
System.setProperty("jdbc:drivers","com.mysql.jdbc.Drive");

==注销驱动==

System.clearProperty("jdbc:drivers");//删除系统属性

注意:在mysql5之后可省略注册驱动 因为程序会先读取java.sql.Driver文件注册驱动

在这里插入图片描述

获取数据库连接对象Connection

getConnection()存在多个重载方法

  1. getConnection(String url) url:数据库网址 ==当数据库没有账号密码时方可使用==

  2. getConnection(String url, Properties info) info:作为连接参数的任意键/值对的列表; 通常至少应包含“用户”和“密码”属性

Properties pro = new Properties();
pro.load(Statement01.class.getClassLoader().getResourceAsStream("jdbc.properties"));
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", pro);
  1. getConnection(String url, String user, String password) user:连接的数据库用户 password:用户密码
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db?characterEncoding=utf8");

url语法:协议名:子协议://服务器名或 IP 地址:端口号/数据库名?参数=参数值

  1. 如mysql:jdbc:mysql://localhost:3306/数据库[?参数名=参数值]
  2. 如果访问本机上的mysql服务器且默认端口没有修改,url可简写为: jdbc:mysql:///数据库名[?参数名=参数值]
  3. 乱码处理:指定编码参数 ?characterEncoding=utf8

执行sql语句

  1. Statement 用于执行静态SQL语句并返回其生成的结果的对象
Statement statement = connection.createStatement();

Statement对象执行sql的方法

  • boolean execute(String sql):执行任意的SQL语句 返回: true-结果是一个ResultSet对象 false-更新计数或没有结果
statement.execute("select * from a");//true
statement.execute("update a set age=20 where id=200");//false
  • int executeUpdate(String sql):执行DML(INSERT,UPDATE,DELETE)给定的SQL语句 返回:sql操作数据影响行

  • ResultSet executeQuery(String sql):执行DQL(SELECT)给定的SQL语句 返回:ResultSet对象,包含给定查询产生的数据

【注意】此对象执行SQL存在SQL注入漏洞:在拼接sql时,存在一些特殊关键字(1=1..)参与时会存在安全问题 String sql = "select * from user where username='"+username+"' and password='"+password+"'";

  • username为任意值,password="' or '1'='1"时SQL将变为: "select * from user where username='任意值' and password='' or '1'='1'" 便可轻松通过账号密码验证,存在较大隐患
  1. PreparedStatement

特点:

  • 将 SQL 语句发送给数据库预编译,提高 SQL 的执行效率
  • SQL参数可使用占位符(?)替代
  • 避免sql注入攻击:
String sql="select * from user where username=? and password=?";
PreparedStatement prepar = connection.prepareStatement(sql);

提供参数:void setXXX(int parameterIndex, XXX value)

  • parameterIndex:代表sql语句的第几个占位符(?),从1开始计算
  • XXX:代表数据类型,如String,int...

PreparedStatement对象执行sql的方法

  • boolean execute():执行任意的SQL语句 返回: true-结果是一个ResultSet对象 false-更新计数或没有结果

  • int executeUpdate():执行DML(INSERT,UPDATE,DELETE)给定的SQL语句 返回:sql操作数据影响行

  • ResultSet executeQuery():执行DQL(SELECT)给定的SQL语句 返回:ResultSet对象,包含给定查询产生的数据

PreparedStatement和Statement的区别

  • Statement存在sql注入漏洞,PreparedStatement则不存在
  • PreparedStatement编程更易懂,且维护性更好
  • Statement没执行一次就需要编译一次sql语句,PreparedStatement只需预编译一次sql语句,之后重复使用时不用再次编译
  • 在无需传参不存在sql注入漏洞且只执行一次sql语句时,建议使用Statement,速率较快
  • 在需要传参存在sql注入漏洞或一条sql语句需要重复执行时,建议使用PreparedStatement,因为PreparedStatement是通过数据库服务器预编译的,在第一次编译比Statement的时间更长

处理结果

DML操作的结果为int,操作影响数据的行数, DQL操作则返回ResultSet集合

ResultSet 存储查询得到的数据 类似于Enumeration集合

ResultSet resultSet = prepar.executeQuery();

while (resultSet.next()){
	resultSet.getInt(1);
	resultSet.getInt("age");
}

boolean next() 将光标从当前位置向前移动一行 返回:

  • true-新的当前行
  • false-没有更多的行

getXXX(int columnIndex) getXXX(String columnLabel)

  • XXX:获取参数的数据类型
  • columnIndex:代表获取当前行的第几列数据,从1开始计数
  • columnLabel:获取当前行列名为columnLabel的数据

释放资源

先开的后关,后开的先关 Connection资源最先打开,最后改变,ResultSet资源最后打开,最先关闭

 finally {
 	if (resultSet != null) {
		try {
        	resultSet.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    if (statement != null) {
        try {
            statement.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

关闭资源的代码建议放在finally中,避免代码中途出错,导致资源未被关闭,从而占用内存空间

JDBC工具类

每创建一个操作数据库的类就要连接数据库,关闭数据库等一堆冗余的代码,我们可以将重复的代码提取出来作为工具类

import java.io.IOException;
import java.sql.*;
import java.util.Properties;

/**
 * @program: JDBC
 * @description: JDBC工具类
 * @author: 吐鲁番
 * @Date: 2020/8/21
 * @Time: 17:29
 **/
public class JDBCutils {
    private static Properties pro = null;

    static {
        try {
            //mysql数据库连接的配置文件
            pro = new Properties();
            //获取配置文件
            pro.load(JDBCutils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Description 获取连接数据库对象
     * @return java.sql.Connection
     **/
    public static Connection getConnection() throws SQLException {
        String database = pro.getProperty("database");
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/" + database, pro);
    }

    /**
     * @Description 关闭数据库连接对象
     **/
    public static void closeConnection(Connection con) {
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @Description 关闭执行数据库Statement对象
     **/
    public static void closeStatement(Statement sta) {
        if (sta != null) {
            try {
                sta.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @Description 关闭执行数据库PreparedStatement对象
     **/
    public static void closePreparedStatement(PreparedStatement prepar) {
        if (prepar != null) {
            try {
                prepar.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @Description 关闭数据对象
     **/
    public static void closeResultSet(ResultSet res) {
        if (res != null) {
            try {
                res.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(Connection con, Statement sta, ResultSet res) {
        closeConnection(con);
        closeStatement(sta);
        closeResultSet(res);
    }

    public static void close(Connection con, Statement sta) {
        close(con, sta, null);
    }

    public static void close(Connection con, PreparedStatement prepar, ResultSet res) {
        closeConnection(con);
        closeStatement(prepar);
        closeResultSet(res);
    }

    public static void close(Connection con, PreparedStatement prepar) {
        close(con, prepar, null);
    }
}

==第一次尝试编写,本着学习的态度,自己可以总结学过的知识,也可以分享给别人==

标签:不准,mysql,数据库,flaot,Driver,PreparedStatement,sql,close
From: https://blog.51cto.com/u_14280332/12109109

相关文章

  • 【MySQL】基础知识Day1
    博客主页:小蜗系列专栏:MySQL参考教程:菜鸟教程/黑马关注博主,后期持续更新系列文章如果有错误请大家批评指出,我会及时修改感谢大家点赞......
  • mysql 八股文
    八股文mysql篇基础数据3大范式第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖。第三范式:建立在第二范式的基础上,要求所有非主键字段直接依赖主键,不要产生传递依赖数据......
  • MySQL 脱敏函数使用
    1.身份证号、手机号、银行卡号采用Perconadata_masking.so插件脱敏https://docs.percona.com/percona-server/8.0/data-masking-plugin-functions.html安装脱敏插件mysql>INSTALLPLUGINdata_maskingSONAME'data_masking.so';mysql>SELECT*FROMINFORMATION_SCHEMA.P......
  • 基于Java+SpringBoot+Mysql明星资讯信息系统功能设计与实现七
    一、前言介绍:1.1项目摘要随着社会的不断进步和人们生活水平的提高,娱乐产业在全球范围内得到了迅猛发展。明星作为娱乐产业的重要组成部分,其资讯的获取和传播成为了广大观众和粉丝关注的焦点。因此,研究明星资讯的课题背景,可以深入了解娱乐产业的发展趋势和市场需求。互联......
  • 基于Java+SpringBoot+Mysql明星资讯信息系统功能设计与实现八
    一、前言介绍:1.1项目摘要随着社会的不断进步和人们生活水平的提高,娱乐产业在全球范围内得到了迅猛发展。明星作为娱乐产业的重要组成部分,其资讯的获取和传播成为了广大观众和粉丝关注的焦点。因此,研究明星资讯的课题背景,可以深入了解娱乐产业的发展趋势和市场需求。互联......
  • MySQl 01文中的图片放在我的资源里了
    MySQL数据库概念长期存放在计算机内,有组织、可共享的大量数据的集合,是一个数据仓库特点免费、开源数据库小巧、功能齐全使用便捷可运行于Windows或Linux操作系统可适用于中小型甚至大型网站应用数据库总览关系型数据库(SQL)MySQL、Oracle、SQLServer、SQLite、......
  • javaWeb项目-springboot+vue+mysql财务管理系统功能说明介绍
    项目源码资源(点击链接下载):java-springboot+vue财务管理系统源码(项目源码-说明文档)资源-CSDN文库项目关键技术: 1、java技术java页面实质上也是一个HTML页面,只不过它包含了用于产生动态网页内容的JAVA代码,这些JAVA代码可以是JAVABean、SQL语句、RMI对象等。例如一个java......
  • 详解mysql的for update
    前言近期开发与钱相关的项目,在高并发场景下对数据的准确行有很高的要求,用到了forupdate,故总结一波以便日后留恋。本文讲解几个点:1.forupdate的使用场景2.forupdate如何使用3.forupdate的锁表4.forupdate的注意点5.forupdate的疑问点forupdate的使用场景如果遇到存在高......
  • 简单说说MySQL中 SELECT 语句执行流程
    流程讲解MySQL中SELECT语句的执行流程分为多个步骤,通常从用户发出查询请求到MySQL返回结果包含以下过程:客户端/服务器通信:用户向MySQL服务器发送SELECT查询语句。查询解析(Parser):MySQL收到SQL语句后,会将查询语句进行词法和语法分析。词法分析器将SQL语句拆解为关键......
  • 如果值达到 800,如何创建 MySQL 函数来更新数据库?
    我试图让数据库每秒检查一次表,看看XP值是否达到800,如果达到,则将排名值设置为“EliteGenin”并将XP值设置为0。@bot.eventasyncdefon_message(message):guild=message.guild.idtable="PEOPLE_"+str(guild)try:connection=mysql.conn......