JDBC(基于Mysql数据库)

本文介绍了JavaJDBCAPI的使用,包括JDBCDriverManager的驱动注册、Connection获取、Statement和PreparedStatement的区别,以及如何防止SQL注入。详细展示了从连接数据库到执行SQL的完整步骤和预编译参数化查询的示例。
摘要由CSDN通过智能技术生成

体系结构

  1. JDBC API:面向程序,供Java程序开发人员使用
  2. JDBC Driver Manager:注册数据库驱动,供Java程序开发人员使用
  3. JDBC Driver API:面向数据库,供数据库厂商使用

JDBC程序开发步骤:

  1. 加载并注册数据库驱动(Driver类)
  2. 获取数据库连接(Connection对象)
  3. 获取SQL语句执行者(Statement对象)
  4. 执行SQL语句
  5. 操作结果集(ResultSet对象)
  6. 回收数据库资源

代码如下:

package com.qfedu;

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

public class jdbc {
    public static void main(String[] args) throws Exception {
        //注册数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost:3306/world"; //world是一个数据库
        String username="root";
        String password="123456";

        //获取连接
        Connection connection = DriverManager.getConnection(url, username, password);

        //定义sql语句(city是一个表)
        String sql="select * from city";

        //获取执行的sql对象
        Statement statement = connection.createStatement();
        //执行sql查询语句
        ResultSet resultSet = statement.executeQuery(sql);

        while(resultSet.next()){
            int ID=resultSet.getInt("ID");
            String Name=resultSet.getString("Name");
            String CountryCode=resultSet.getString("CountryCode");
            String District=resultSet.getString("District");
            String Population=resultSet.getString("Population");
            System.out.println(ID+" "+Name+" "+CountryCode+" "+District+" "+Population);
        }
        connection.close();
        statement.close();

    }
}

JDBC的API详解

  • DriverManager

1.注册驱动

Class.forName("com.mysql.cj.jdbc.Driver");

2.获取数据库连接

  • Connection

1.获取sql对象

普通执行sql对象 Statement createStatement()

预编译sql的执行sql对象:防止sql注入 PreparedStatement prepareStatement(sql)

执行存储过程 CallableStatement prepareCall(sql)

2.管理事务

  • Statement

执行sql语句

int excuteUpdate(sql):执行DML和DDL语句(简单理解为:增加,删除,更新操作)

返回值:DML影响的行数,执行后也可能返回为0

ResultSet excuteQuery(sql):执行DQL语句

返回ResultSet结果集对象

一般是遍历查询

result.next();   详见Overview (Java SE 11 & JDK 11 ) (runoob.com)

流程上

ResultSet resultSet = statement.executeQuery(sql);执行sql语句,返回ResultSet对象

boolean next():将光标向前移动一行,并判断是否为有效行

xxx  getxxx(参数) 获取数据

xxx:数据类型   如:getint(参数)   getString(参数)

参数是int表示列的编号,是String表示列的名称

另外把查询的对象(ResultSet)的数据放到集合里面

Connection connection = DriverManager.getConnection(url,username,password);
String sql="select * from employee";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
//建立集合
ArrayList<Employee> list =new ArrayList<>();

while (resultSet.next()){
    Employee employee =new Employee();//创建一个对象
    employee.setId(resultSet.getInt("id"));
    employee.setName(resultSet.getString("name"));
    employee.setAge(resultSet.getInt("age"));
    employee.setTelephone(resultSet.getString("telephone"));
    list.add(employee);
}
System.out.println(list);
connection.close();
statement.close();

sql注入

 出现原因(以登录为例):selet * from 用户表 where name ='admin' and password='12345 or 1=1 '

 无论密码正确与否,用户均可登录。上述查询已无效

一般解决方案是利用PreparedStatement对象

PreparedStatemnet:能够执行参数化的sql语句

package com.qfedu;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class preparedStament {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost:3306/world"; //world是一个数据库
        String username="root";
        String password="123456";
        Connection conn = DriverManager.getConnection(url,username,password);
        String sql="select * from city where Name=?";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        preparedStatement.setString(1,"Tilburg");//表示第一个问号赋值为Tilburg
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            int id=resultSet.getInt(1);//city表的第一列
            String name=resultSet.getString(2);
            String countryCode=resultSet.getString(3);
            String district=resultSet.getString(4);
            String population=resultSet.getString(5);
            System.out.println(id+" "+name+" "+countryCode+" "+district+" "+population);

        }
        resultSet.close();
        preparedStatement.close();
        conn.close();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值