栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[JDBC连接] 使用JDBC操作数据库中的数据

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[JDBC连接] 使用JDBC操作数据库中的数据

目录​​​​​​​

什么是JDBC

前期配置

连接数据库

JDBC操作数据库

基本操作执行静态SQL语句

预编译操作执行动态SQL语句

处理返回结果

查询结果

增删改结果

Druid连接池

关闭资源

总结


什么是JDBC

JDBC就是通过Java语言操作关系型数据库的一套API, 使用Java代码对数据库中的数据完成增删改查的功能

前期配置

1. mysql的驱动连接jar包

2. druid连接池jar包

连接数据库

1. 注册驱动 : 告诉Java要注册的是什么数据库管理系统,.

不同数据库管理系统的驱动在java中是Driver接口的实现类, 按照规范给出自己的逻辑, 在mysql的Driver类中有一个静态代码块, 使用DriverManager注册当前的Driver, 完成注册驱动.

2. 使用DriverManager获取连接

//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取连接
//参数一:连接mysql数据库管理系统 本机IP下的3306端口 test数据库 禁用安全模式
//参数二:数据库用户名
//参数三:数据库密码
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?useSSL=false","root","root");

JDBC操作数据库

基本操作执行静态SQL语句

1. 通过连接创建Statement执行对象

2. 使用Statement执行对象的executeQuery / executeUpdate 操作提前写好的静态SQL语句

Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM person");

预编译操作执行动态SQL语句

SQL注入问题: 先说一下为什么会出现预编译执行对象, 在某种场景下, 我们知道筛选条件, 但并不确定筛选条件的值的情况下, 如果使用执行对象 进行拼接的话, 那么会产生SQL注入的问题

//举个例子
String name = "张三";
String password = "1 OR 1=1";
Statement statement = connection.createStatement("SELECt * FROM person WHERe name ='"+name+"' AND password = "+password);
//拼接的结果是 SELECt * FROM person WHERe name='张三' AND password = 1 OR 1=1
//这种拼接的后果就是 无论张三的密码是什么  用这个方式都能登录成功 

另外​​​​​​​在整理的时候犯了个大错误, 如图!!!!!谨记谨记o(╥﹏╥)o

所以说预编译是不能指定字段的!!!!只能对sql语句的限制条件内容进行预编译!

 那么如何正确使用预编译执行对象:

1. 使用连接创建预编译对象PreStatement 并给出需要预编译的SQL, 不确定的条件值写  ?

2. 给? 赋值, 一般可以写一个scanner, 将控制台的内容作为查询条件

3. 使用PreStatement执行对象的executeQuery / executeUpdate 执行SQL

//想要按照暂时还没指定好的两个条件去查询
//使用预编译执行对象
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM person WHERe id ?");
//给不确定的内容赋值,是什么类型就使用set类型 的方法
//参数一:第几个问号
//参数二:赋值内容
preparedStatement.setObject(1,3);
preparedStatement.setObject(2,3000);

处理返回结果

返回结果分为两种情况, 一种是DQL查询语句会返回的结果集, 另一种是DML操作语句返回影响数据的条数

查询结果

使用executeQuery返回的结果是ResultSet结果集, 有可能查不到数据, 也有可能一条或者很多条,ResultSet封装了一个next()方法用来判断是否还有下一条数据, 又封装了get类型()的方法用来从数据库中获取不同字段的值

//创建一个ArrayList集合, 将数据库中每条数据封装到Person对象中, 并将查询并封装好的每个Person对象存储到集合中
ArrayList persons = new ArrayList<>();
//判断是否还有下一条数据
while (resultSet.next()){
//根据列名和列的数据类型 获取到数据 添加到集合中的person对象中
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    String password = resultSet.getString("password");
    String money = resultSet.getString("money");
    persons.add(new Person(id,name,password,money));
}
persons.forEach(p-> System.out.println(p));

增删改结果

对于DML语句的增删改返回的是int值: 受影响的行数, 直接打印或者根据业务进行处理就ok

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?useSSL=false","root","root");
        PreparedStatement preparedStatement = connection.prepareStatement("UPDATe person SET name = ? WHERe id = ?");
        //给不确定的内容赋值,是什么类型就使用set类型 的方法
        //参数一:第几个问号
        //参数二:赋值内容
        preparedStatement.setObject(1,"tianqi");
        preparedStatement.setObject(2,2);

        int i = preparedStatement.executeUpdate();
        System.out.println("执行sql后受影响的行数是:"+i);
    }
}

Druid连接池

Java定义了连接池的规范为DataSource接口, 不同厂商做的连接池作为该接口的实现类进而完成自己的功能

Druid连接池在创建的过程中, 将数据库的注册, url, 用户名以及密码等信息封装到一个配置文件中, 在创建Druid连接池时给一个配置文件对象, 就能创建一个连接

db.properties:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?uesSSL=false
username=root
password=root

initialSize=5
maxActive=5
maxWait=3000

DruidTest:

import com.abc.entity.Person;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

public class DruidTest {
    private static DataSource dataSource;

    static{
        Properties prop = new Properties();
        try {
            prop.load(ClassLoader.getSystemClassLoader().getResourceAsStream("db.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static void main(String[] args) throws SQLException {
        Connection connection = dataSource.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM person");
        ResultSet resultSet = preparedStatement.executeQuery();

        while (resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            String password = resultSet.getString("password");
            String money = resultSet.getString("money");
            Person person = new Person(id,name,password,money);
            System.out.println(person);
            }
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

关闭资源

使用完记得关闭资源, 避免浪费

关闭结果集

关闭执行对象

关闭连接对象

总结

为了节省资源, 建议使用连接池创建连接对数据库中的数据进行操作

1. 创建配置文件

2. 加载配置文件

3. 创建连接池对象 , 传入配置文件对象

4. 使用连接池对象创建连接

5. 使用连接对象创建执行对象

6. 执行sql语句

7. 处理返回结果

8. 关闭资源

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/967130.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号