JDBC

JDBC:

  *概念:Java DataBase Connectivity    Java 数据库链接, Java语言操作数据库

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

  *快速入门:

    *步骤:(存在sql注入的问题)

      1.导入驱动jar包

      2.注册驱动

      3.获取数据库链接对象 Connection

      4.定义sql

      5.获取执行sql的语句对象 Statement

      6.执行sql

      7.处理结果,释放资源

    *详解各个对象:

      1.DriverManager:驱动管理对象

        *功能:

          1.注册驱动

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

          2.获取数据库链接

            Connection getConnection(String url ,String user ,String password);

              url:指定链接路径

              user:用户名

              password :密码

      2.Connection:数据库链接对象

        *功能:

          1.获取执行sql的对象:

            Statement createStatement();

            PreparedStatement preparedStatement(String sql);

          2.管理事务:

            *开启事务:setAutoCommit(bollean autoCommit):调用该方法设置参数为false,开启事务

            *提交事务:commit();

            *回滚事务:rollback();

      3.Statement:执行sql对象

        1.执行sql

          1.int executUpdate(String sql):执行DML(增删改)

            *返回值是影响的行数

          2.ResultSet executeQuery(String sql):执行DQL(查询)

      4.ResultSet:结果集对象,封装查询结果

        *boolean next( ):游标向下移动一行,当返回false时,表示这一行没有数据

          遍历结果集

            while(resultset.next()){

              sout(打印结果)

                }

            例子:

while(resultSet.next()){
System.out.println(resultSet.getInt(1)+"--"+resultSet.getString(2));
}

        *getXxx():获取对象

           *Xxx代表类型  :例如: int getInt()

           *参数:

             1.int:代表列的编号,从1开始  如getString(1) 获取第一列的数据

      

      5.PreparedStatement:执行sql对象 

        1.SQL注入问题:在拼接sql时,有一些sql的特殊关键词参与字符串的拼接。会造成安全性问题

            1.输入用户随便,输入密码时:a' or 'a' ='a'a

            2.sql:select *from user where username = 'dasdas' and password = 'a' or 'a' ='a'

        2.解决sql注入问题:使用PreparedStatement对象来解决

        3.预编译的sql:参数使用?作为占位符

//比起比之前的步骤解决了sql注入问题

 

 

 

    **JDBU工具类

      

package com.xxxx.util;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class JDBCUtil {
private static String url;
private static String user;
private static String password;
private static String driver;
static {
Properties properties =new Properties();
try {
properties.load(new FileInputStream("src/db.properties"));
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
driver = properties.getProperty("driver");
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
public static void close(ResultSet resultSet, Statement statement, Connection connection) throws SQLException {
statement.close();
connection.close();
resultSet.close();
}
}

  *JDBC控制事务:

    1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败

    2.操作:

      *开启事务

      *提交事务

      *回滚事务

    3.使用Connection对象来管理事务

            *开启事务:setAutoCommit(bollean autoCommit):调用该方法设置参数为false,开启事务

            *提交事务:commit();

            *回滚事务:rollback();

      

package com.xxxx.jdbc;
import com.xxxx.util.JDBCUtil;
import java.sql.*;
import java.util.Scanner;
public class JDBC {
//导入驱动jar包
public static void main(String[] args) throws Exception {
//注册驱动
Connection connection = JDBCUtil.getConnection();
//开启事务
connection.setAutoCommit(false);
String sql1 ="update tb_user set uerAge = uerAge-? where userId = ?";
String sql2 ="update tb_user set uerAge = uerAge+? where userId = ?";
//获取sql语句的执行对象preparedStatement
PreparedStatement preparedStatement1 = connection.prepareStatement(sql1);
PreparedStatement preparedStatement2 = connection.prepareStatement(sql2);
//执行sql
preparedStatement1.setString(1, String.valueOf(5));
preparedStatement1.setString(2, String.valueOf(1));
preparedStatement2.setString(1, String.valueOf(5));
preparedStatement2.setString(2, String.valueOf(2));
//处理结果
preparedStatement2.executeUpdate();
//手动制造异常
int x = 1/0 ;
preparedStatement1.executeUpdate();
//提交事务
connection.commit();
//回滚
connection.rollback();
//释放资源
preparedStatement1.close();
preparedStatement2.close();
connection.close();
}
}

 

posted @   会秃头的小白  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
  1. 1 原来你也在这里 周笔畅
  2. 2 世间美好与你环环相扣 柏松
  3. 3 起风了 吴青峰
  4. 4 极恶都市 夏日入侵企划
极恶都市 - 夏日入侵企划
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 王星

作曲 : 灰鸿啊/皮皮

编曲 : 夏日入侵企画

制作人 : 邢硕

节奏吉他 : 肯尼

主音吉他 : 张伟楠

贝斯 : 皮皮

鼓 : 海鑫

和声 : 邢硕

音效制作 : 邢硕

录音 : 邢硕/夏国兴

混音 : 于昊

特别鸣谢 : 张伟楠

这城市的车流和这地表的颤抖

像一颗石子落入地心之后泛起的温柔

暗涌

河水流过转角她的楼

被梦魇

轻声呓语唤醒身后的幼兽

失效感官焦灼只剩下

麻木愚钝无从感受

共同支撑全都瓦解

只是我们现在都

已忘记到底是

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去陈旧的还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

眼看这情节开始变旧

所有的城池已失守

最终无法占有

无眠辗转

伴着人间破碎的旧梦

像繁星

退却后只剩下混沌的夜空

炙热

掩盖风声鹤唳的担忧

把所有失落无助反手推入

无尽的白昼

失效感官焦灼只剩下

麻木愚钝无从感受

共同支撑全都瓦解

只是我们现在都已经忘记到底是

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

眼看这情节开始变旧

所有的城池早已失守

惶恐难以接受

缠绵往复不肯放手

最终无法占有

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁 灭 即 拯 救

谁掠夺春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

明知城池已失守

缠绵往复不肯放手

最终无法占有

点击右上角即可分享
微信分享提示