JDBC和数据库连接池

1.jdbc快速入门

且导入mysql包时一定要 Add as Library选择
JDBC和数据库连接池_第1张图片

package com.itheima;

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

public class Test {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接 如果是本地数据库且端口号为3306 则可以省略
        //String url="jdbc:mysql://127.0.0.1:3306/dbl";
        String url="jdbc:mysql:///dbl?useSSL=false";
        String username="root";
        String pssward="1234";
        Connection conn= DriverManager.getConnection(url,username,pssward);

        //3.定义SQL
        String sql1="update emp set salary=7000 where id=1001";
        String sql2="update emp set salary=6000 where id=1002";
        //4.获取执行sql对象的对象Statement
        Statement stmt= conn.createStatement();

        //5.执行sql
        try {
            //开启事务
            conn.setAutoCommit(false);

            int count1= stmt.executeUpdate(sql1);
            System.out.println(count1);
            int w=3/0;
            int count2= stmt.executeUpdate(sql2);
            System.out.println(count2);
            //提交事务
            conn.commit();
        } catch (Exception throwables) {
            //回滚事务
            conn.rollback();
        }
        //6.处理结果

        //7.关闭资源
        stmt.close();
        conn.close();
    }
}


注意:在创建工程时一定要选择jdk版本。

2.JDBC API详解

    1.DriverManager

  • 1.MySQL 5之后的驱动包,可以省略注册驱动的步骤--------Class.forName(“com.mysql.jdbc.Driver”);

参数说明:

  • url : 连接路径

    语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…

    示例:jdbc:mysql://127.0.0.1:3306/db1

    细节:

    • 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
    • 配置 ?useSSL=false 参数,禁用安全连接方式,解决警告提示
  • user :用户名

  • poassword :密码


    2.Connection

Connection(数据库连接对象)作用:

  • 获取执行 SQL 的对象 ------------------------- Statement stmt= conn.createStatement();
  • 管理事务----- //开启事务conn.setAutoCommit(false);----提交事务conn.commit();–回滚事务conn.rollback();

一般用try -cathc ------快捷键ctrl+alt+t

    3.Statement

Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。

  • 执行DDL、DML语句
    在这里插入图片描述
  • 执行DQL语句
    在这里插入图片描述

    4.ResultSet

封装了SQL查询语句的结果。
而执行了DQL语句后就会返回该对象,对应执行DQL语句的方法如下:

ResultSet executeQuery(sql):执行DQL 语句,返回 ResultSet 对象

那么我们就需要从 ResultSet 对象中获取我们想要的数据。ResultSet 对象提供了操作查询结果数据的方法,如下:

boolean next()

  • 将光标从当前位置向前移动一行
  • 判断当前行是否为有效行

方法返回值说明:

  • true : 有效航,当前行有数据

  • false : 无效行,当前行没有数据
    xxx getXxx(参数):获取数据

  • xxx : 数据类型;如: int getInt(参数) ;String getString(参数)

  • 参数

    • int类型的参数:列的编号,从1开始
    • String类型的参数: 列的名称
package com.itheima;

import com.itheima.pojo.Account;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class Result_demo1 {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接 如果是本地数据库且端口号为3306 则可以省略
        //String url="jdbc:mysql://127.0.0.1:3306/dbl";
        String url="jdbc:mysql:///dbl?useSSL=false";
        String username="root";
        String pssward="1234";
        Connection conn= DriverManager.getConnection(url,username,pssward);

        //3.定义SQL
        String sql1="select * from account";

        Statement stm = conn.createStatement();

        ResultSet res = stm.executeQuery(sql1);
        Account ac=new Account();
        List list=new ArrayList<>();
        while(res.next()){
            int i=res.getInt(1);
            String name =res.getString(2);
            Double monkey =res.getDouble(3);
            ac.setId(i);
            ac.setMonkey(monkey);
            ac.setName(name);
            list.add(ac);
        }
        System.out.println(list);
        res.close();
        stm.close();
        conn.close();


    }
}

    5.PreparedStatement

SQL注入问题’ or ‘1’ ='1

select * from tb_user where username = ‘sjdljfld’ and password = ''or ‘1’ = ‘1’
从上面语句可以看出条件 username = 'sjdljfld' and password = '' 不管是否满足,而 or 后面的 '1' = '1' 是始终满足的,最终条件是成立的,就可以正常的进行登陆了。

PreparedStatement对象.

/ SQL语句中的参数值,使用?占位符替代
String sql = “select * from user where username = ? and password = ?”;
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
设置参数值

上面的sql语句中参数使用 ? 进行占位,在之前之前肯定要设置这些 ? 的值。

PreparedStatement对象:setXxx(参数1,参数2):给 ? 赋值

  • Xxx:数据类型 ; 如 setInt (参数1,参数2)
  • 参数:
    • 参数1: ?的位置编号,从1 开始
    • 参数2: ?的值

执行SQL语句

executeUpdate(); 执行DDL语句和DML语句

executeQuery(); 执行DQL语句

注意:

  • 调用这两个方法时不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了。
package com.itheima;

import com.itheima.pojo.Account;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class Result_demo1 {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接 如果是本地数据库且端口号为3306 则可以省略
        //String url="jdbc:mysql://127.0.0.1:3306/dbl";
        String url="jdbc:mysql:///dbl?useSSL=false";
        String username="root";
        String pssward="1234";
        Connection conn= DriverManager.getConnection(url,username,pssward);

        //3.定义SQL
        String sql1="select * from emp where id=? and job_id=?";

        int id=1001;
        int job_id=4;

        PreparedStatement pstm = conn.prepareStatement(sql1);

        pstm.setInt(1,id);
        pstm.setInt(2,job_id);

        ResultSet rs = pstm.executeQuery();

        while(rs.next()){
            String is=rs.getString(2);
            int id1=rs.getInt(1);
            int id2=rs.getInt(3);
            System.out.println(is);
            System.out.println(id1);
            System.out.println(id2);
        }
        rs.close();
        pstm.close();
        conn.close();


    }
}

PreparedStatement原理:
1.PreparedStatement 好处:

  • 预编译SQL,性能更高
  • 防止SQL注入:将敏感字符进行转义
    JDBC和数据库连接池_第2张图片
  • 开启预编译功能
    在代码中编写url时需要加上以下参数。而我们之前根本就没有开启预编译功能,只是解决了SQL注入漏洞.

加入到url中useServerPrepStmts=true
详情见JDBC笔记-----包含mysql日志

3.数据库连池

    1.数据库连接池介绍

数据库连接池是一个容器,不需要创建连接对象,直接从连接池中进行取,用完之后进行归还。
1.好处:

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏 ------当有人一直占用后就会进行取回

之前用的创建对象的创建完使用完就销毁了,重复创建销毁会耗费计算机的性能和时间。

JDBC和数据库连接池_第3张图片
2.常见的数据库连接池:

  • DBCP
  • C3P0
  • Druid
    我们现在使用更多的是Druid,它的性能比其他两个会好一些。

3.Druid(德鲁伊):

  • Druid连接池是阿里巴巴开源的数据库连接池项目
  • 功能强大,性能优秀,是Java语言最好的数据库连接池之一

    2.Druid数据库连接池

  • 导入jar包 druid-1.1.12.jar
  • 定义配置文件
  • 加载配置文件
  • 获取数据库连接池对象
  • 获取连接
      //1.导入jar包
        //2.配置文件
        //3.加载配置文件
        Properties prop=new Properties();
        prop.load(new FileInputStream("F:\\CodeJava\\JDBC\\Test\\src\\druid.properties"));
        //4.获取连接池
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //5.获取连接池对象
        Connection conn = dataSource.getConnection();

注意:添加配置文件-------druid.properties

你可能感兴趣的:(数据库,数据库,java)