SpringBoot工程中的JDBC

连接池原理分析:在系统初始化的时候,在内存中开辟一片空间,将一定数量的数据库连接多为对象存储在对象池里,并对外提供数据库连接的获取和归还方法,用户访问数据库时,并不是建立一个新的连接,而是从数据库连接池中取出一个空闲的连接对象,使用完归还后的连接不会马上关闭,而是由数据库连接池统一管理回收,为下一次借用做准备,如果由于高并发请求导致数据库连接池中的连接被借用完,其他线程就会等待,直到连接被归还,在整个过程中连接不会关闭,循环使用,有借有还,连接池还可以根据参数来控制池中的连接数,连接的上下限数,以及每个连接的最大使用次数

连接池的好处:数据库连接是非常消耗资源的,影响程序的性能,连接池用来管理,分配,释放数据库连接的,可以数程序重复使用同一个数据库连接,而不是每次都创建一个新的数据库连接,通过释放空间时间较长的数据库连接避免数据库因为创建太多的连接而造成连接的遗漏问题

JDBC

流程:先导入jar包

1注册驱动

Class.forName("类的全路径")

getClass

类名点Class

2.获取和数据库的连接

3.获取传输器

4.执行sql

5.解析结果集

6.释放资源

package cn.tedu.jdbc;

import java.sql.*;

//测[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SC5BTs9w-1623158031193)(RackMultipart20210608-4-1h5920r_html_10fb1dcdf23d273.png)]试 jdbc
//需求:查询cgb2104库里的students表里的所有数据
public class Test1 {
    public static void main(String[] args) throws Exception {
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取和数据库的连接
//String url= "jdbc:mysql://localhost:3306/cgb2104?characterEncoding=utf8";//指定要连接哪个数据库
String url= "jdbc:mysql:///cgb2104?characterEncoding=utf8";//指定要连接哪个数据库
        String user= "root" ; //使用的用户名
        String pwd= "root" ; //使用的密码
        Connection conn = DriverManager.getConnection(url, user, pwd);
        //3,获取传输器,执行SQL
        Statement st = conn.createStatement();
        //4,执行SQL
        ResultSet rs = st.executeQuery("select * from students");
        //5,解析结果集
        while( rs.next() ){//next()判断结果集中是否有数据
            for (int i = 1; i <= 5 ; i++) {
                //获取每列的值并打印
                System.out.println( rs.getString(i) );
            }
        }
        //6,释放资源
        rs.close(); //关闭结果集
        st.close();//关闭传输器
        conn.close();//关闭连接
    }
}

 

SQL注入的解决方案

//解决SQL注入攻击的方案
private static void login2() {
    try{
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql:///cgb2104?characterEncoding=utf8";
        Connection conn = DriverManager.getConnection(url, "root", "root");
//            Statement st = conn.createStatement();不行,不安全,会被SQL攻击

        String user = new Scanner(System.in).nextLine();//用户输入jack'#
        String pwd = new Scanner(System.in).nextLine();
        //?叫占位符 ,SQL的骨架
String sql ="select * from user2 where name=? and password=?";
        //先把SQL骨架发给数据库执行
        PreparedStatement ps = conn.prepareStatement(sql);
        //给SQL里的? 设置参数
        ps.setString(1,user);//给第一个?设置值是user
        ps.setString(2,pwd);//给第二个?设置值是pwd
        
        ResultSet rs = ps.executeQuery();//执行拼接好的SQL,返回结果集

        if(rs.next()){
            System.out.println("登录成功~");
        }else{
            System.out.println("登录失败~");
        }
        ps.close();
        conn.close();
    }catch(Exception e){
        e.printStackTrace();//有异常,直接打印异常信息
        //System.out.println("执行失败。。。");//上线
    }
}

Java中的连接池

在这里插入图片描述

 


版权声明:本文为m0_58144419原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。