• javaweb 之 JDBC 详解


     JDBC简介

    JDBC 就是使用Java语言操作关系型数据库的一套API

    全称:( Java DataBase Connectivity ) Java 数据库连接

    JDBC 本质:

    官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口

    各个数据库厂商去实现这套接口,提供数据库驱动jar包

    我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

    JDBC 好处

    各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发

    可随时替换底层数据库,访问数据库的Java代码基本不变

    JDBC快速入门

     测试代码:

    public class Jdbc {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取链接
            String url="jdbc:mysql://127.0.0.1:3306/db1";
            //自己电脑的用户名跟密码
            String username="root";
            String password="123";
            Connection conn= DriverManager.getConnection(url,username,password);
    
            //3. 定义sql语句
            String sql ="update account set money = 1000 where id= 1";
            //4.获取执行sql的对象 Statement
            Statement stmt =conn.createStatement();
    
            //5.执行sql
            int count =stmt.executeUpdate(sql);//返回受影响的行数
    
            //6.处理结果
            System.out.println(count);
    
            //7.释放资源
            stmt.close();
            conn.close();
        }
    }

    JDBC API详解

    1.DriverManager

    DriverManager(驱动管理类)作用:

    1.注册驱动

    2.获取数据库连接

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

    Connection作用:

    1.获取执行 SQL 的对象

    2.管理事务

     在管理事务中,我们如果操作数据交互,那么一方修改完出错,另一方没有修改 我们则需要回滚事务

    所以我们可以使用try catch来捕获异常,在catch中回滚事务,就可以了

    1. try {
    2. conn.setAutoCommit(false);//开启事务
    3. int count1 =stmt.executeUpdate(sql1);//返回受影响的行数
    4. System.out.println(count1);
    5. int count2 =stmt.executeUpdate(sql2);//返回受影响的行数
    6. System.out.println(count2);
    7. conn.commit();//提交事务
    8. } catch (Exception e) {
    9. conn.rollback();//回滚事务
    10. throw new RuntimeException(e);
    11. }

    Statement

     executeUpdate(sql) :我们可以根据返回值是否大于0 判断是否修改成功。分别输出不同的语句

    Resultset(结果集对象)

    1. String sql1 ="select * from account";
    2. //4.获取执行sql的对象 Statement
    3. Statement stmt =conn.createStatement();
    4. //执行sql 并返回得到的数据对象
    5. ResultSet rs = stmt.executeQuery(sql1);
    6. //当rs.next()有数据时就循环遍历每一行
    7. while (rs.next()){
    8. //获取每列数据
    9. int id=rs.getInt(1);
    10. String name=rs.getString(2);
    11. double money =rs.getDouble(3);
    12. System.out.println(id);
    13. System.out.println(name);
    14. System.out.println(money);
    15. System.out.println("---------");
    16. }

    resultset 案例 

    需求:查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中

    1. String sql1 ="select * from account";
    2. //4.获取执行sql的对象 Statement
    3. Statement stmt =conn.createStatement();
    4. //执行sql 并返回得到的数据对象
    5. ResultSet rs = stmt.executeQuery(sql1);
    6. //创建集合
    7. ArrayList list =new ArrayList<>();
    8. //当rs.next()有数据时就循环遍历每一行
    9. while (rs.next()){
    10. //获取每列数据
    11. int id=rs.getInt(1);
    12. String name=rs.getString(2);
    13. double money =rs.getDouble(3);
    14. //利用带参构造直接创建对象
    15. Account account =new Account(id,name,money);
    16. //将对象加入集合
    17. list.add(account);
    18. }
    19. System.out.println(list);

    PreparedStatement:

    作用:预编译SQL语句并执行:预防SQL注入问题

    SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

    举例:

    如用户登录时的sql语句:

    String name ="asdasd"

    String pwd=" 'or '1' ='1 "

    String sql ="select * from tb_user where username =' "+name+" ' and password = ' "+pwd+" ' "; 

    sql 语句就成为了 select * from tb_user where username =' asdasd' and password = ' ' or '1' ='1 '

    or 后面 1=1 恒等 所以一定会登录成功 

    这时候我们就需要使用preparedStatement

    1. String uname ="zhangSan";
    2. String pwd ="123";
    3. String sql1 ="select * from account where name=? and password=?";
    4. //获取pstmt对象
    5. PreparedStatement pstmt = conn.prepareStatement(sql1);
    6. //设置各个问号的值
    7. pstmt.setString(1,uname);
    8. pstmt.setString(2,pwd);
    9. //运行sql并返回数据
    10. ResultSet rs = pstmt.executeQuery();
    11. if(rs.next()){
    12. System.out.println("登陆成功");
    13. }else {
    14. System.out.println("登录失败");
    15. }

    prepared 会将敏感字符进行转义,这样就不会影响sql语句

     预编译需要在String url 加上useServerPrepStmts=true 

    数据库连接池

    数据库连接池简介:

    数据库连接池是个容器,负责分配、管理数据库连接(Connection)

    它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

    释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

    好处:

    1.资源重用 2.提升系统响应速度 3.避免数据库连接遗漏

     

    Druid 使用步骤:

    导入jar包 druid-1.1.12.jar

    定义配置文件

    加载配置文件

    获取数据库连接池对象

    获取连接

    定义配置文件: 

    driverClassName=com.mysql.jdbc.Driver

    url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true

    username=root

    password=123

    //初始化连接数量

    initialSize=5

    //最大连接数

    maxActive=10

    //最大等待时间

    maxWait=3000

    加载配置文件:

    Properties prop =new properties();

    prop.load(new FileInputStream("配置文件路径"));

    获取连接池对象

    DataSource datasource = DruidDataSourceFactory.createDataSource(prop);

    获取数据库链接Connection

    Connection connetion = dataSource.getConnection();

  • 相关阅读:
    【Spring】AOP实现原理
    python中hasattr()函数用法详解
    计算机毕业设计Java奖助学金管理系统(源码+系统+mysql数据库+lw文档)
    YOLO目标检测——安全帽手套数据集【含对应voc、coco和yolo三种格式标签】
    04【单例设计模式】
    基于深度学习的车辆检测技术
    通信行业的必备网站
    i.MX 6ULL 驱动开发 二十二:SPI(SPI子系统+MISC子系统)
    Java中常用的48个关键字和2个保留字
    2023-09-10 LeetCode每日一题(课程表 II)
  • 原文地址:https://blog.csdn.net/m0_73859807/article/details/127547877