JDBC

作者: 扶光_ | 来源:发表于2023-10-16 15:50 被阅读0次

    一,JDBC(java database connecticity)java数据库连接

    就是用java语言来操作关系型数据库的API
    开发一个jdbc代码可以同时操作多个关系型数据库


    jdbc

    步骤:
    1 首先导入jdbc的jar包
    2 注册驱动
    Class.forName("com.mysql.jdbc.Driver");
    3 获取连接
    Connection conn = DriverManager.getConnection(url,username,password);
    4 定义SQL语句
    String sql = "update 表名 ...";
    5 获取执行SQL对象
    Statement stmt = conn.createStatement();
    6 执行SQL
    stmt.executeUpdate(sql);
    7 处理返回结果
    8 释放资源

     // 1 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2 获取连接
            String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
            String username = "root";//自己数据库名字密码
            String password = "1234";
            Connection conn = DriverManager.getConnection(url,username,password);
            // 3 定义sql语句
            String sql = "update emp set salary = 20000 where id = 1";
            // 4 获取执行sql对象
            Statement stmt =  conn.createStatement();
            // 5执行SQL 有返回值 返回整数
            int count = stmt.executeUpdate(sql);
            System.out.println("影响数目"+count);
            //6 是否资源
            stmt.close();
            conn.close();
    

    二,JDBC的一些API

    1 DriverManger(驱动管理类)

    1 注册驱动
    2 获取数据库连接
    DriverManager.getConnection(url,username,password)
    url:jdbc:mysql://127.0.0.1:3306/db1
    安全提示取消命令
    jdbc:mysql://127.0.0.1:3306/db1?useSSL=false 加上

    2 Connection

    1获取执行sql对象
    普通执行sql对象
    Statement createStatement()
    预编译sql的执行sql对象,防止sql注入
    PreparedStatement prepareStatement(sql)
    2管理事务
    BEGIN 开启
    ROLLBACK 回滚
    COMMIT 提交

    这里可以使用try catch语法进行包裹,如果出现异常回滚事务,成功的执行commit

    3Statement作用

    1 执行SQL语句
    executeUpdate(sql) 执行dml ddl语句
    返回dml影响的行数,ddl执行可能返回0

    4 ResultSet

    结果集封装了DQL查询语句的结果
    ResultSet stmt.executeQuery(sql) 返回ResultSet对象
    获取查询结果 Boolean next() true有效
    比如表中的数据是id name salary
    获取数据int GetInt(参数)

    while(rs.next()){
        //获取数据
    int id = rs.getInt(第一列数据所在位置)//1  也可以使用字段名 "id"
    String name = rs.getString(第二列数据)//2 
    double money = rs.getDouble(第三列数据)//3
        rs.getXxx(参数);
      }
    
    过程
      // 1 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2 获取连接
            String url = "jdbc:mysql://127.0.0.1:3306/db1";
            String username = "root";//自己数据库名字密码
            String password = "1234";
            Connection conn = DriverManager.getConnection(url,username,password);
            // 3 定义sql语句
            String sql = "select * from emp";
            // 4 获取执行sql对象
            Statement stmt =  conn.createStatement();
            // 5执行SQL 有返回值 返回整数
            ResultSet rs= stmt.executeQuery(sql);
            //创建集合
            ArrayList<Account> list = new ArrayList<>();
            while(rs.next()){
                //创建对象
                Account ac = new Account();
                //获取数据
                 int id=rs.getInt("id");
                 String name= rs.getString("name");
                 String gender= rs.getString("gender");
                 Double salary= rs.getDouble("salary");
                 Date date= rs.getDate("join_date");
                 int dep_id=rs.getInt("dep_id");
                 //赋值
                 ac.setId(id);
                 ac.setName(name);
                 ac.setGender(gender);
                 ac.setDate(date);
                 ac.setSalary(salary);
                 ac.setDep_id(dep_id);
                 //存入集合
                 list.add(ac);
            }
            System.out.println(list);
            //6 是否资源
            stmt.close();
            conn.close();
    

    5 PreparedStatement

    预编译sql语句并执行:预防SQL注入问题
    SQL注入:通过事先定义好的SQL语句,用以达到执行代码攻击服务器的方法

    select id from users where username = '"+username +"' and password = '" + password +"'" 这里的username和password都是我们存取从web表单获得的数据。下面我们来看一下一种简单的注入,如果我们在表单中username的输入框中输入' or 1=1-- ,password的表单中随便输入一些东西,假如这里输入123.此时我们所要执行的sql语句就变成了select id from users where username = '' or 1=1-- and password = '123',我们来看一下这个sql,因为1=1是true,后面 and password = '123'被注释掉了。所以这里完全跳过了sql验证。

    SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。

    String name = "侯旭";
    String pwd= "1234";
    //定义sql 使用?拼接参数
    String sql = "select * from user where name=? and pwd=?"
    //获取PreparedStatement对象
    PreparedStatement ps= conn.PreparedStatement(sql);
    //设置问号值
    ps.setString(1,name);
    ps.setString(2,pwd);
    //执行sql
    Result rs =  ps.executeQuery();//执行SQL
    

    预编译优点
    1 性能更高
    2 将敏感字符进行转义

    • 1要开启预编译功能,需要在连接后面拼接
    &useServerPrepStmts=true添加到连接后面
    String url = "jdbc:mysql://127.0.0.1:3306/db1&useServerPrepStmts=true";
    
    • 2 配置sql配置文件 在my.ini中加入
    log-output=FILE
    general
    general_log_file=“D:\mysql.log"
    slow-query-log=1
    slow_query_log_file=“D:\mysql_slow.log"
    long_query_time=2
    
    
    • 3 重启mysql服务

    三,数据库连接池

    管理数据库连接的容器,负责分配,管理数据库连接

    之前我们是来一个用户我们建立一个连接然后释放掉,来一个用户建立一个连接然后再释放掉
    这是一个非常耗时的操作

    连接池就是一个多个连接的容器,当一个用户使用完之后还得归还回来,就像银行柜台共享的多只笔,使用完归还,下一个人继续使用

    好处:资源复用 提升响应速度 避免遗漏

    连接池的实现 标准接口是DataScource
    由第三方来实现该接口
    常见数据库连接池有

    • DBCP
    • C3P0
    • Druid

    Druid是阿里巴巴开源项目 ,

    Druid 使用步骤

    1. 导入jar包
      2 定义配置文件
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
    username=root
    password=1234
    # 初始化连接数量
    initialSize=5
    # 最大连接数
    maxActive=10
    # 最大等待时间
    maxWait=3000
    

    放在src下druid.properties名的文件下
    3 加载配置文件

    Properties prop = new Properties();
    prop.load(new FileInputStream("src/druid.properties"));
    
    

    4 获取数据库连接池对象

    DataScource ds = DuridDataScourceFactory.createDataScource(prop);
    

    5 获取连接

    Connection conn = ds.getConnection();
    sout(conn);
    

    相关文章

      网友评论

          本文标题:JDBC

          本文链接:https://www.haomeiwen.com/subject/owrtidtx.html