07Java之JDBC

1. JDBC简介

1. JDBC基本概念

Java DataBase Connectivity简称JDBC是Java数据库连接, Java语言操作数据库。JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

在这里插入图片描述

2. JDBC快速入门

  • 步骤:
    1. 导入驱动jar包
    2. 注册驱动
    3. 获取数据库连接对象 Connection
    4. 定义sql
    5. 获取执行sql语句的对象 Statement
    6. 执行sql,接受返回结果
    7. 处理结果
    8. 释放资源

导入驱动jar包

首先:在项目下创建libs目录,然后把jar报辅助到该目录下
在这里插入图片描述然后:右键–>Add As Library;将jar包解压:效果如下
在这里插入图片描述
代码实现

public class Demo01 {
   
    public static void main(String[] args) throws Exception {
   
        // 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
        // 定义sql语句
        String sql = "SELECT  * FROM  USER";
        // 获取执行sql语句的对象 Statement
        Statement stmt = conn.createStatement();
        //6.执行sql
        ResultSet set = stmt.executeQuery(sql);
        //7.遍历结果集合
        int i=1;
        while (set.next()) {
   
            String id = set.getString("id");
            String username = set.getString("username");
            String birthday = set.getString("birthday");
            String sex = set.getString("sex");
            String address = set.getString("address");
            System.out.println(id+":"+username+":"+birthday+":"+sex+":"+address);
        }
        //8.释放资源
        stmt.close();
        conn.close();
    }
}

Class.forName是什么?这是反射的东西,可以简单理解为将该字符串路径下的类加载到内存中

遍历Set集合中的getString是通过数据库中的数据名称来一一对应实现的

2. JDBC各个功能

逻辑框架图
在这里插入图片描述

1. DriverManager(驱动管理对象)

功能

1.注册驱动,通过静态代码块实现(因为驱动只注册一次)

 
 使用反射机制,直接将类加载到内存中去
 Class.forName("com.mysql.jdbc.Driver"); 
 

注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。

2.获取数据库连接

public static Connection getConnection(String url, String user, String password) 方法

参数

  • url:指定连接的路径(格式:jdbc:mysql://ip地址(域名):端口号/数据库名称 )
  • user:用户名
  • password:密码

2. Connection(数据库连接对象)

功能

1.获取执行sql的对象

  • Statement createStatement() 该方法返回一个Statement对象。(没有防止SQL注入功能)
  • PreparedStatement prepareStatement(String sql) 该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译。(有防止SQL注入功能)

2.管理事务

  • 开启事务:void setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
  • 提交事务:void commit()
  • 回滚事务:void rollback()

3.Statement(执行sql的对象)

执行sql

  • boolean execute(String sql) :该方法可以执行任何SQL语句,如果执行后第一个结果是ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false;一般不用这个方法。
  • int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
    返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
  • ResultSet executeQuery(String sql) :执行DQL(select)语句

boolean execute(String sql);需要特别注意,当我使用该方法查询不存在的数据是,它依旧返回true,这是因为,查询返回的结果集合是一个ResultSet对象,但是ResultSet是从表头开始的,而表头一定存在,所以结果一定为true,不管是否真的存在该数据,所以一般情况下不要用这个方法

4.PreparedStatement(执行sql的对象)

  1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,是逻辑本身出现错误,导致整个SQL语句逻辑改变
    1. 输入用户随便,输入密码:sd’ or ‘sd’ = 'sd
    2. sql:select * from user where username = ‘fhdsjkf’ and password = ‘a’ or ‘a’ = ‘a’ 后面的 or ‘a’ = ‘a’始终都为true因此密码逻辑始终正确,导致不需要正确用户名和密码都可以实现登录

举例:用户输入用户名和密码 ,如果数据库中有,则显示登录成功,如果没有,则显示登录失败

public class Demo01 {
   
    public static void main(String[] args) throws Exception {
   
        // 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
        // 定义sql语句


        System.out.println("请输入用户名");
        String user = new Scanner(System.in).next();
        System.out.println("请输入密码");
        String password = new Scanner(System.in).next();
        String sql = "select * from s1 where user = '"+user+"' and passord = '"+password+"' ";
        // 获取执行sql语句的对象 Statement
        Statement stmt = conn.createStatement();
        //6.执行sql
        boolean execute = stmt.execute(sql);
        if(execute==true){
   
            System.out.println("密码输入正确");
        }else {
   
            System.out.println(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值