Java之JDBC


数据库基础

Win mysql安装:Windows下安装MySQL详细教程 - m1racle - 博客园 (cnblogs.com)

Win mMacysql安装:在MAC上安装mysql_码农伍的博客-CSDN博客_mac安装mysql

库操作

数据库连接

mysql -h 主机名 -P 端口 -u 用户名 -p 密码

mysql -h 127.0.0.1 -P 3306 -u root -p root

创建数据库

CREATE DATABASE [IF NOT EXISTS] 数据库名 CHARACTER SET 数据库采用的字符集 COLLATE 字符集的校对规则
  • CHARACTER SET:指定数据库采用的字符集,如果不指定字符集,默认utf8

  • COLLATE:指定数据库字符集的校对规则

    • utf8_bin 区分大小写
    • utf8_general_ci 不区分大小写
    • 默认是utf8_general_ci
CREATE DATABASE [IF NOT EXISTS] jwt CHARACTER SET utf8 COLLATE utf8_bin

删除数据库

DROP DATABASE [IF EXISTS ] 数据库名

查看所有数据库

SHOW DATABASES

查看数据库的定义信息

SHOW CREATE DATABASE `数据库名`

注:创建数据库、表的时候,为了规避关键字,可以使用反引号解决

备份数据库

#备份数据库
mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 路径/文件名.sql

#备份数据库中表
mysqldump -u 用户名 -p  数据库 表1 表2 表n > 路径/文件名.sql

注:该指令要在DOS下执行

恢复数据库

Source 路径/文件名.sql

注:该指令要进入mysql下执行

数据类型

数值型(整数)

类型 字节 最小值 最大值
TINYINT 1 -128 127
TINYINT(unsigned) 1 0 255
SMALLINT 2 -32768 32767
SMALLINT(unsigned) 2 0 65535
MEDIUMINT 3 -8388508 8388607
MEDIUMINT(unsigned) 3 0 16777215
INT 4 -2147483648 2147483647
INT(unsigned) 4 0 16777215
BIGINT 8 -9223372036854775808 9223372036854775807
BIGINT(unsigned) 8 0 18446744073709551615
CREATE TABLE t1 (id TINYINT);#默认是有符号的,-128~127
CREATE TABLE t2 (id TINYINT UNSIGNED);#指定unsinged,就是无符号0~255

数值型(bit)

数值型(小数)

字符串(char&varchar)

  • CHAR(size)

    • 固定长度字符串最大255 字符
  • VARCHAR(size) 0~65535 字节

    • 可变长度字符串最大65532 字节【本身还需要1-3个字节用于记录存放内容长度】
    • 如果表的编码是utf8 ,size = (65535-3) / 3 = 21844
    • 如果表的编码是gbk , size = (65535-3) / 2 = 32766
  • 查询速度 CHAR > VARCHAR,因此数据是定长时,推荐使用CHAR

如果 VARCHAR 不够用,可以使用mediumtext、text、longtext

日期类型

CREATE TABLE b_name (
  birthday DATE , -- 生日
  job_time DATETIME, -- 记录年月日时分秒
  login_time TIMESTAMP
  NOT NULL DEFAULT CURRENT_TIMESTAMP
  ON UPDATE CURRENT_TIMESTAMP); -- 登录时间, 如果希望login_time列自动更新, 需要配置

SELECT * FROM b_name;
INSERT INTO b_name(birthday, job_time)
VALUES('2022-11-11','2022-11-11 10:10:10');
-- 如果我们更新b_name表的某条记录,login_time列会自动的以当前时间进行更新

表操作

创建表

CREATE TABLE 表名(
    field1 datatype,
    field2 datatype,
    field3 datatype,
)character set 字符集 collate 校对规则 engine 引擎

注:
field:指定列名,datatype: 指定列类型(字段类型)
character set :如不指定则为所在数据库字符集
collate:如不指定则为所在数据库校对规则
engine:引擎(这个涉及内容较多,后面单独讲解)
CREATE TABLE `user`(
  id INT,
  name VARCHAR (255),
  password VARCHAR (255),
  birthday DATE
)CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB ;

查看表结构

DESC 表名  -- 显示表结构,可以查看表的所有列

删除表

DROP TABLE 表名

添加列

ALTER TABLE 表名
ADD 列名 数据类型 [DEFAULT expr]

-- 在员工表emp中增加一个image列,varchar类型(要求在resume后面),默认不为空,默认数据为test。
ALTER TABLE emp
ADD image VARCHAR(32) NOT NULL DEFAULT 'test'
AFTER RESUME

DESC emp -- 显示表结构,可以查看表的所有列

修改列

ALTER TABLE 表名
MODIFY 列名 数据类型 [DEFAULT expr]

-- 修改job列,使其长度为60。
ALTER TABLE emp
MODIFY job VARCHAR(60) NOT NULL DEFAULT 'test'

删除列

ALTER TABLE 表名
DROP 列名 

-- 删除sex列。
ALTER TABLE emp
DROP sex

修改表名

RENAME TABLE 表名 TO 新表名

-- 修改表名改为employee。
RENAME TABLE emp TO employee

修改表字符集

ALTER TABLE 表名 CHARACTER SET utf8

-- 修改表的字符集为utf8
ALTER TABLE employee CHARACTER SET utf8

修改列名

ALTER TABLE 表名
CHANGE 列名 新列名 数据类型 [DEFAULT expr]

-- 列名name 修改为user_name
ALTER TABLE employee
CHANGE `name` `user_name` VARCHAR(64) NOT NULL DEFAULT 'test'

CRUD语句

CRUD即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。

增加(Create)

-- 普通插入
INSERT INTO 表名 VALUE (value1,value2)

-- 指定要插入数据的列
INSERT INTO 表名 (column1,column2) VALUE (value1,value2) 

-- 批量插入(应注意SQL的长度限制)
INSERT INTO TABLE VALUES (value1,value2),(value1,value2)

查询(Retrieve)

SELECT column1,column2 FROM 表名

-- 查询表中所有学生的信息。
SELECT * FROM student;
-- 查询表中所有学生的姓名和对应的英语成绩。
SELECT `name`,english FROM student;
-- 过滤表中重复数据。
SELECT DISTINCT english FROM student;
-- 使用表达式对查询列运算
SELECT `name`, (chinese+english+math) FROM student;
-- 在所有学生总分加10 分的情况
SELECT `name`, (chinese + english + math + 10) FROM student;
-- 使用别名表示学生分数。
SELECT `name` , (chinese + english + math + 10) AS total_score FROM student;

更新(Update)

-- 一次更新一个字段
UPDATE table SET column1 = value1 WHERE 条件 -- 如果不加WHERE条件,UPDATE语句会默认更新所有表,慎用。

-- 一次更新多个字段
UPDATE table SET column1 = value1,column2 = value2 WHERE 条件


-- 将所有员工薪水修改为5000 元。
UPDATE employee SET salary = 5000
-- 将姓名为小妖怪的员工薪水修改为3000 元。
UPDATE employee SET salary = 3000 WHERE user_name = '小妖怪'
-- 将老妖怪的薪水在原有基础上增加1000 元
UPDATE employee SET salary = salary + 1000 WHERE user_name = '老妖怪'
-- 可以修改多个列的值
UPDATE employee SET salary = salary + 1000 , job = '码农' WHERE user_name = '老妖怪'
SELECT * FROM employee;

删除(Delete)

DELETE FROM 表名 WHERE column1 = value1

-- 删除表中名称为’老妖怪’的记录。
DELETE FROM employee WHERE user_name = '老妖怪';
-- 删除表中所有记录, 慎用。
DELETE FROM employee;

Java JDBC

JDBC的全称是Java数据库连接(Java DataBase Connectivity),它是一套用于执行SQL语句的Java API。

Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。

Java程序 JDBC API 使用 JDBC 驱动管理器并指定数据库的 JDBC 驱动器来提供与数据库的连接。

JDBC 程序实例

前置工作:

Mysql驱动下载:MySQL :: Download Connector,选择操作系统:Platform Independent

在项目下创建一个文件夹 libs 将下载的 mysql.jar 驱动拷贝到该目录下,在 IDEA 中右键点击 mysql.jar 选择 add to Library (加入到项目中)

package com.jwt.jdbc;


import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class myjdbc {
    public static void main(String[] args) throws SQLException {
        //1. 注册驱动
        Driver driver = new Driver(); //创建driver 对象

        //2. 得到连接
        String url = "jdbc:mysql://localhost:3306/jwt";
        //将用户名和密码放入到Properties对象
        Properties info = new Properties();
        info.setProperty("user", "root");// 用户
        info.setProperty("password", "root"); //密码
        Connection connect = driver.connect(url, info);

        //3. 执行sql
        String sql = "insert into jwt.jwt_info value (3,'Pyj') ";
        //statement 用于执行静态SQL语句并返回其生成的结果的对象
        Statement statement = connect.createStatement();
        int rows = statement.executeUpdate(sql); // dml(update insert delete)语句,返回的就是影响行数
        System.out.println(rows > 0 ? "成功" : "失败");

        //4. 关闭连接资源
        statement.close();
        connect.close();
    }
}

五种连接方式

方式1

 //1. 注册驱动
 Driver driver = new Driver();
 String url = "jdbc:mysql://localhost:3306/jwt";
 //将用户名和密码放入到Properties对象
 Properties properties = new Properties();
 properties.setProperty("user","root");
 properties.setProperty("password","root");
 //2. 得到连接
 Connection connection = driver.connect(url, properties);

方式2

//使用反射加载Driver类, 动态加载,更加的灵活,减少依赖性
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
//将用户名和密码放入到Properties对象
String url = "jdbc:mysql://localhost:3306/jwt";
Properties properties = new Properties();
properties.setProperty("user","root");
properties.setProperty("password","root");
//得到连接
Connection connection = driver.connect(url, properties);

方式3

//使用DriverManager替代driver进行统一管理
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
//创建url 和user 和password
String url = "jdbc:mysql://localhost:3306/jwt";
String user = "root";
String password = "root";
//注册Driver驱动
DriverManager.registerDriver(driver);
//得到连接
Connection connection = DriverManager.getConnection(url, user, password);

方式4

//使用Class.forName自动完成注册驱动,简化代码 
Class.forName("com.mysql.jdbc.Driver");
//创建url 和user 和password
String url = "jdbc:mysql://localhost:3306/jwt";
String user = "root";
String password = "root";
//得到连接
Connection connection = DriverManager.getConnection(url, user, password);

方式5

第一步:src下新建文件mysql.properties

url=jdbc:mysql://localhost:3306/jwt
user=root
password=root
driver=com.mysql.jdbc.Driver

第二步:

//在方式4的基础上改进,增加配置文件,让连接mysql更加灵活
//通过Properties 对象获取配置文件的信息
Properties properties = new Properties();
properties.load(new FileInputStream("src//mysql.properties"));//windows路径的//改成\\
//获取相关的值
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String driver = properties.getProperty("driver");
//1. 注册驱动
Class.forName(driver);//建议写上
//2. 得到连接
Connection connection = DriverManager.getConnection(url, user, password);

常用驱动程序名称和URL

DBMS JDBC驱动程序名称 URL格式
MySQL com.mysql.jdbc.Driver jdbc:mysql://hostname:port/databaseName
Oracle oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@hostname:port:databaseName
PostgreSQL org.postgresql.Driver jdbc:postgresql://hostname:port/dbname
DB2 com.ibm.db2.jdbc.net.DB2Driver jdbc:db2:hostname:port/databaseName
Sybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds:hostname: port/databaseName

Junit测试

package com.jwt.jdbc;

import com.mysql.jdbc.Driver;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class jdbcConn {

    //方式1
    @Test
    public void connect01() throws SQLException {
        //1. 注册驱动
        Driver driver = new Driver();
        //2. 得到连接
        String url = "jdbc:mysql://localhost:3306/jwt";
        Properties properties = new Properties();
        properties.setProperty("user","root");
        properties.setProperty("password","root");
        Connection connection = driver.connect(url, properties);
        System.out.println("第1种方式:"+connection);
    }

    //方式2 使用反射加载Driver类
    @Test
    public void connect02() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        //使用反射加载Driver类, 动态加载,更加的灵活,减少依赖性
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) aClass.newInstance();
        String url = "jdbc:mysql://localhost:3306/jwt";
        Properties properties = new Properties();
        properties.setProperty("user","root");
        properties.setProperty("password","root");
        Connection connection = driver.connect(url, properties);
        System.out.println("第2种方式:"+connection);

    }

    //方式3 使用DriverManager 替代driver 进行统一管理
    @Test
    public  void connect03() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        //使用反射加载Driver
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) aClass.newInstance();
        //创建url 和user 和password
        String url = "jdbc:mysql://localhost:3306/jwt";
        String user = "root";
        String password = "root";
        //注册Driver驱动
        DriverManager.registerDriver(driver);
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("第3种方式:"+connection);
    }

    //方式4: 使用Class.forName 自动完成注册驱动,简化代码
    @Test
    public  void connect04() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        //创建url 和user 和password
        String url = "jdbc:mysql://localhost:3306/jwt";
        String user = "root";
        String password = "root";
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("第4种方式:"+connection);
    }
    //方式5: 在方式4 的基础上改进,增加配置文件,让连接mysql 更加灵活
    @Test
    public  void connect05() throws ClassNotFoundException, SQLException, IOException {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src//mysql.properties"));
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        Class.forName(driver);//建议写上
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("第5种方式:"+connection);
    }
}

ResultSet

  • 从数据库查询读取数据,返回的数据放在结果集中

  • ResultSet对象保持一个光标指向其当前的数据行。 最初, 光标位于第一行之前

  • next方法将光标移动到下一行,并且在ResultSet对象中没有更多行时返回false,因此可以在while循环中使用循环来遍历结果集

package com.jwt.jdbc;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.sql.ResultSet;

public class ResultSet_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        //通过Properties 对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src//mysql.properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        //1. 注册驱动
        Class.forName(driver);//建议写上
        //2. 得到连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3. 得到Statement
        Statement statement = connection.createStatement();
        //4. 执行SQL
        String sql = "select id, name from jwt_info";
        ResultSet resultSet = statement.executeQuery(sql);//该语句返回单个ResultSet对象
        //5. 使用while 取出数据
        while (resultSet.next()) { // 让光标向后移动,如果没有更多行,则返回false
            int id = resultSet.getInt(1); //通过索引获取该行的第1列
            //String name = resultSet.getString(2);//通过索引获取该行的第2列
            String name = resultSet.getString("name");//通过列名获取该行的第2列
            System.out.println(id + "\t" + name + "\t" );
        }
        //6. 关闭连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

Statement

  • Statement对象用于执行静态SQL语句并返回其生成的结果的对象
  • Statement对象执行SQL语句,存在SQL注入风险
package com.jwt.jdbc;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

public class Statement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
        //让用户输入管理员名和密码
        System.out.print("请输入管理员的名字: "); //next(): 当接收到空格或者'就是表示结束
        String admin_name = scanner.nextLine(); //如果希望看到SQL 注入,这里需要用nextLine
        System.out.print("请输入管理员的密码: ");
        String admin_pwd = scanner.nextLine();
      
        //通过Properties 对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src//mysql.properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        //1. 注册驱动
        Class.forName(driver);//建议写上
        //2. 得到连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3. 得到Statement
        Statement statement = connection.createStatement();
        //4. 组织SqL
        String sql = "select name , password from user where name ='"
                + admin_name + "' and password = '" + admin_pwd + "'";
        ResultSet resultSet = statement.executeQuery(sql);
        if (resultSet.next()) { //如果查询到一条记录,则说明该管理存在
            System.out.println("恭喜, 登录成功");
        } else {
            System.out.println("对不起,登录失败");
        }
        //关闭连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

正常登陆

请输入管理员的名字: Tom
请输入管理员的密码: 123
恭喜, 登录成功

Sql注入登陆

请输入管理员的名字: Tom' or 
请输入管理员的密码: or '1'='1
恭喜, 登录成功

PreparedStatement

简介

PreparedStatement接口扩展了Statement接口,它添加了比Statement对象更好一些优点的功能。此语句可以动态地提供/接受参数。

  1. PreparedStatement执行的SQL语句中的参数用问号(?)来表示,
  2. 调用setXxx()方法来设置参数,setXxx()方法有两个参数,第一个参数是要设置的SQL语句中的参数的索引(从1开始),第二个是设置的SQL语句中的参数的值
  3. 调用executeQuery(),执行查询,返回ResultSet对象
  4. 调用executeUpdate(),执行更新(增、删、改),返回受影响的行数

预处理的好处

  • 不再使用+拼接sql语句,减少语法错误
  • 有效的解决了sql注入问题!
  • 大大减少了编译次数,效率较高

执行查询

package com.jwt.jdbc;

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

public class PreparedStatement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
        //让用户输入管理员名和密码
        System.out.print("请输入管理员的名字: "); //next(): 当接收到空格或者'就是表示结束
        String admin_name = scanner.nextLine(); //如果希望看到SQL 注入,这里需要用nextLine
        System.out.print("请输入管理员的密码: ");
        String admin_pwd = scanner.nextLine();
        //通过Properties 对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src//mysql.properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        //1. 注册驱动
        Class.forName(driver);//建议写上
        //2. 得到连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3. 得到PreparedStatement
        //3.1 组织SqL , Sql 语句的? 就相当于占位符
        String sql = "select name , password from user where name = ? and password = ?";
        //3.2 preparedStatement 对象实现了PreparedStatement 接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //3.3 给?赋值
        preparedStatement.setString(1, admin_name);
        preparedStatement.setString(2, admin_pwd);
        //4. 执行select 语句使用executeQuery
        // 如果执行的是dml(update, insert ,delete)使用executeUpdate()
        // 这里执行executeQuery ,不要在写sql
        ResultSet resultSet = preparedStatement.executeQuery();
        if (resultSet.next()) { //如果查询到一条记录,则说明该管理存在
            System.out.println("恭喜, 登录成功");
        } else {
            System.out.println("对不起,登录失败");
        }
        //关闭连接
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

正常登陆

请输入管理员的名字: Tom
请输入管理员的密码: 123
恭喜, 登录成功

Sql注入登陆

请输入管理员的名字: Tom' or
请输入管理员的密码: or '1'='1
对不起,登录失败

执行更新

package com.jwt.jdbc;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

public class PreparedStatement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
        //让用户输入管理员名和密码
        System.out.print("请输入管理员的名字: "); //next(): 当接收到空格或者'就是表示结束
        String admin_name = scanner.nextLine(); //如果希望看到SQL 注入,这里需要用nextLine
        System.out.print("请输入管理员的密码: ");
        String admin_pwd = scanner.nextLine();
        //通过Properties 对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src//mysql.properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        //1. 注册驱动
        Class.forName(driver);//建议写上
        //2. 得到连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3. 得到PreparedStatement
        //3.1 组织SqL , Sql 语句的? 就相当于占位符
        String sql = "insert into user values (?,?)";
        //3.2 preparedStatement 对象实现了PreparedStatement 接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //3.3 给?赋值
        preparedStatement.setString(1, admin_name);
        preparedStatement.setString(2, admin_pwd);
        //4. 执行dml(update, insert ,delete),使用executeUpdate()
        int rows = preparedStatement.executeUpdate();//不要写sql
        System.out.println(rows > 0 ? "执行成功" : "执行失败");
        //关闭连接
        preparedStatement.close();
        connection.close();
    }
}

JDBC API

DriverManger驱动管理类

  • getConnection(url, user,pwd) 获取到连接

Connection接口

  • createStatement() 创建Statement对象
  • PreparedStatement(sql) 生成预处理对象

Statement接口

  • executeUpdate(sql) 执行dml语句,返回受影响的行数
  • executeQurey(sql) 执行查询,返回Resultset对象
  • execute(sql) 执行任意sql,返回布尔值

PreparedStatement接口

  • executeUpdate() 执行dml语句,返回受影响的行数
  • executeQurey() 执行查询,返回Resultset对象
  • execute() 执行任意sql,返回布尔值
  • setXxx(占位符索引,占位符的值) 将值绑定到参数,解决sql注入
  • setObject占位符索引,占位符的值)

ResultSet 结果集

  • next() 向下移动一行,如果没有下一行返回false
  • Previous() 向上移动一行
  • getXxx(列的索引|列名) 返回对应列的值,接收类型为Xxx
  • getObject(列的索引|列名) 返回对应列的值,接收类型为Object

JDBC Utils

Utils开发

在JDBC操作时,获取连接和释放连接会经常使用,可以将其封装到JDBC连接到工具类JDBCUtils

Utils DML

Utils Query

option+command+t 包围代码(使用if..else, try..catch, for, synchronized等包围选中的代码)

事务

批处理

package com.jwt.jdbc;

import org.junit.Test;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Properties;

public class Batch_ {
    //传统方法,添加5000 条数据到admin2
    @Test
    public void noBatch() throws Exception {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src//mysql.properties"));//windows路径的//改成\\
        //获取相关的值
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        Connection connection = DriverManager.getConnection(url,user,password);
        String sql = "insert into jwt_info values(?, ?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        System.out.println("开始执行");
        long start = System.currentTimeMillis();//开始时间
        for (int i = 0; i < 5000; i++) {//5000 执行
            preparedStatement.setInt(1, i);
            preparedStatement.setString(2, "jack" + i);
            preparedStatement.executeUpdate();
        }
        long end = System.currentTimeMillis();
        System.out.println("传统的方式耗时=" + (end - start) + "ms") ;//传统的方式耗时=385ms
        //关闭连接
        preparedStatement.close();
        connection.close();
    }

    //使用批量方式添加数据
    @Test
    public void batch() throws Exception {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src//mysql.properties"));//windows路径的//改成\\
        //获取相关的值
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        Connection connection = DriverManager.getConnection(url,user,password);
        String sql = "insert into jwt_info values(?, ?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        System.out.println("开始执行");
        long start = System.currentTimeMillis();//开始时间
        for (int i = 0; i < 5000; i++) {//5000 执行
            preparedStatement.setInt(1, i);
            preparedStatement.setString(2, "jack" + i);
            preparedStatement.addBatch();
            //当有1000 条记录时,在批量执行
            if((i + 1) % 1000 == 0) {//满1000 条sql
                preparedStatement.executeBatch();
                //清空一把
                preparedStatement.clearBatch();
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("批量方式耗时=" + (end - start) + "ms");//批量方式耗时=60ms
        //关闭连接
        preparedStatement.close();
        connection.close();
        }
}

参考

JDBC教程™ (yiibai.com)

您的支持是我不断前进的动力,如果你觉得本文对你有帮助,你可以请我喝一杯冰可乐!嘻嘻🤭

支付宝支付 微信支付

文章作者: 简简
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 简简 !
评论-----昵称和邮箱必填,网址选填
 上一篇
searchable encryption searchable encryption
本篇文章以小简看过的文献以及查阅的资料为基础,归纳和总结了可搜索加密(Searchable Encryption,SE)的相关知识点。 涉及论文 序号 论文名称 作者 年份 来源 链接 1 Hardening Distribut
2022-01-18
下一篇 
版本管理-Git 版本管理-Git
一直只会常用的那几个 Git 命令,每次遇到不会的操作都是现去Google,十分不方便,今个得空咋就仔仔细细的学习学习 Git ! Git简介 Git是目前世界上最先进的分布式版本控制系统。 工作流程 工作区:你在电脑里能看到的目录。
2022-01-05
  目录