JDBC&连接池

目录

1.JDBC

1.1概述

1.2简单使用

1.3API介绍

1.3.1DriverManager类

1.3.2Connection接口

1.3.3Statement接口

1.3.4ResultSet接口

1.4PreparedStatement

1.4.1概述

1.4.2使用

1.4.3各自的优点

2.连接池

2.1概述

2.2Druid连接池

2.2.1硬编码方式

2.2.2使用连接池工厂创建连接池

2.2.3读取配置文件创建连接池


1.JDBC

1.1概述

Java DataBase Connectivity,java数据库连接。

作用:通过java操作数据库。

sun公司提供操作所有关系型数据库的规范,各个数据库厂商自行实现接口,提供数据库驱动的jar包。开发人员使用这套接口,即可对各厂商的数据库进行操作。

1.2简单使用

需引入jar包,mysql-connector-java.jar

使用JDBC的步骤:

1.注册驱动。

2.创建连接。

3.获取语句执行者对象。

4.执行语句。

5.处理结果集。

6.释放资源。

public void testSave() throws Exception {
        //1.注册驱动
        DriverManager.registerDriver(new Driver());
        String url = "jdbc:mysql://localhost:3306/study";
        String username = "root";
        String password = "root";
        //2.获得连接
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.获得语句执行者
        Statement st = connection.createStatement();
        //4.执行语句
        String sql = "INSERT INTO tab_account VALUES(NULL , 'jiujiu' , '1000')";
        int count = st.executeUpdate(sql);
        //5.处理结果
        System.out.println(count);
        //6.释放资源
        st.close();
        connection.close();
}

1.3API介绍

1.3.1DriverManager类

主要作用:

  • 注册驱动

  • 获取连接

常用方法:

方法名作用
static void registerDriver(Driver 驱动对象)注册驱动
static Connection getConnection(url,username,password)获取连接

注册驱动:

        翻看mysql的驱动类源码,发现里面有一个静态代码块,其中的逻辑是:注册驱动,静态代码块的执行时机就是加载类对象的时候就会执行,因此实际上只需要将Driver类加载到内存就可以了。

        可以通过反射技术加载:

  • Class.forName("全限定类名");只需要通过类的全限定类名的字符串就可以了。这种方式便于解耦合(因为我们可以将这个字符串提取到配置文件中)

  • 对象.getClass();

  • 类名.class;

从jdk1.5开始,不注册驱动也可以,jdk底层会帮我们自动的注册驱动。

获取连接:

        static Connection getConnection(url,username,pwd):获取连接

  • url:用来确定使用那个协议连接那个数据库

    • 格式:协议:子协议://域名或者主机ip:端口号/数据库名字

    • 例如:jdbc:mysql://loacalhost:3306/study

    • 若我们连接的就是localhost:3306的服务器可以省略为:jdbc:mysql:///study;若数据库的编码默认不是utf8,存入的数据就有中文乱码。我们可以在url后面追加参数声明使用什么编码操作数据 ?characterEncoding=utf-8;

  • username:数据库的用户名

  • password:数据库的密码

1.3.2Connection接口

数据库连接

主要作用:

  • 获取语句执行对象

  • 控制事务

常用方法:

方法名作用
Statement createStatement()创建statement语句执行对象
PreparedStatement prepareStatement(sql)创建PreparedStatement预编译语句执行对象
setAutoCommit(boolean 是否自动提交)设置事务是否自动提交,若设置为false就是手动开启事务
commit()提交事务
rollback()回滚事务

1.3.3Statement接口

语句执行对象

主要作用:

  • 执行sql语句

常用方法:

方法名作用
int executeUpdate(sql语句)主要用来执行dml语句,增删改,返回值为:影响的行数
ResultSet executeQuery(查询sql语句)用来执行dql语句,查询操作,返回值为:查询到的结果集

1.3.4ResultSet接口

查询语句执行后的结果集

常用的方法:

方法名作用
boolean next()向下移动指针,若有数据的话返回true,且移动指针;若无数据的话返回false
getXxx(..)获取指定列或者指定字段名的数据

getXxx(第几列或者字段名):Xxx指的是数据类型

  • getXxx(int 第几列):根据列号获取

  • getXxx(String 字段名):根据列名获取

getString(..): 获取字符串、时间、数字

getObject(..): 获取一切数据

1.4PreparedStatement

1.4.1概述

SQL注入问题:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义,被称为SQL注入。

解决SQL注入:我们不能让用户输入的信息和SQL语句进行字符串拼接。需要使用PreparedSatement对象解决SQL注入。

1.4.2使用

        1.修改SQL语句,使用?替代SQL中变量。

        例如:select * from user where username ='"+username+"' and pwd='"+pwd+"'

        现在:select * from user where username = ? and pwd = ?;

        2.修改语句执行者对象为PreparedStatement,对语句进行预编译。

        之前:conn.createStatement();

        现在:conn.prepareStatement(sql);

        3.用preparedStatement对象给变量进行赋值。

        st.setXxx(int 第几个问号,Object 参数的值)

        xxx就是数据类型

        4.执行SQL,使用PreparedStatement的无参方法。如果使用有参那就相当于调用了Statement的方法,因为PreparedStatement是Statement的子接口。

        之前:st.executeXxxxxx(sql)

        现在:st.executeXxxxxx();

1.4.3各自的优点

Statement(如果要使用 后台需要控制 这些传递的参数)

        对于有多条sql语句,并且每一条都不一样的时候,statement效率更高。

PreparedStatement:

        解决了sql注入的问题,对于同一条sql语句执行多次来说效率更高,一次编译多次运行。

2.连接池

2.1概述

连接池就是一个容器(集合),存放数据库连接的容器。

当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

优点

  • 节约资源,减轻服务器压力

  • 提高连接复用性,用户访问高效

规范

数据源: javax.sql.DataSource 接口

连接池: 各个公司提供的实现类

Java为数据库连接池提供了公共的接口: javax.sql.DataSource ,各个厂商去实现这套接口,提供jar包。

  • 从连接池中获取连接 : 调用连接池对象的 getConnection() 方法

  • 归还连接 : 调用连接的close()方法

常用的连接池技术

  • DBCP : apache提供

  • C3P0:数据库连接池技术,使用它的开源项目有Hibernate、Spring等。

  • Druid:(德鲁伊)阿里巴巴提供的数据库连接池技术,是目前最好的数据库连接池之一。有监控程序,有日志程序..

  • HikariCP:称为效率最高的一款连接池, spring boot 内置数据库

2.2Druid连接池

导入jar包:druid.jar

2.2.1硬编码方式

1.创建连接池对象

2.设置数据库连接的基本方式(驱动,url,username,password)

3.设置其他参数(最大连接数量,最小连接数量,获取连接最大等待时间......)

4.通过连接池对象获取连接

5.使用连接

6.归还连接

public class DRUIDDemo {
    @Test
    //硬编码,所有的配置都写到java代码中
    public void test1() throws SQLException {
        //1. 创建对象
        DruidDataSource ds = new DruidDataSource();

        //2. 设置数据库连接的4个基本参数(驱动,url,username,password)
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/study");
        ds.setUsername("root");
        ds.setPassword("1234");

        //3. 设置其他的参数(最大连接的数量,最小连接空闲数量,获取连接最大等待时间)
        ds.setMaxActive(10);
        ds.setMinIdle(2);
        ds.setMaxWait(2000);

        //4. 通过连接池对象获取连接
        //Connection conn = ds.getConnection();
        //5. 使用连接
        //System.out.println(conn);
        //6. 调用连接close()就可以归还连接
        //conn.close();

        //获取11个连接 ,会出现重复的连接
        for (int i = 1; i <12 ; i++) {
            Connection conn = ds.getConnection();
            System.out.println(conn);

            if (i%7==0){
                conn.close();
            }
        }
    }
}

2.2.2使用连接池工厂创建连接池

public class DruidTest2 {
    /**
     * DruidDataSourceFactory 用于生产数据源连接池的工厂对象
     * @param args
     * @throws SQLException
     */
    public static void main(String[] args) throws Exception {
        //map 存放各种配置信息的
        Map<String , String> map = new HashMap<String, String>();
        //基本四项 key都是api去掉set首字母小写
        map.put("driverClassName" , "com.mysql.jdbc.Driver");
        map.put("url" , "jdbc:mysql://localhost:3306/study");
        map.put("username" , "root");
        map.put("password" , "root");

        //1.核心类(程序的入口)  map 其实就是配置
        DataSource dataSource = DruidDataSourceFactory.createDataSource(map);

        //2.获得连接
        System.out.println(dataSource.getConnection());

    }
}

2.2.3读取配置文件创建连接池

public class DruidTest3 {
    public static void main(String[] args) throws Exception {
        //读取配置文件
        // DruidTest3.class.getClassLoader() 类加载器的好处 加载文件 只加载一次
        InputStream is = DruidTest3.class.getClassLoader().getResourceAsStream("db.properties");
        //创建properties
        Properties properties = new Properties();

        //加载数据
        properties.load(is);

        //1.核心类
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        //2.获得连接
        System.out.println(dataSource.getConnection());
    }
}
db.properties配置文件
#此处的properties 的key不能瞎写
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/study
username=root
password=root
initialSize=3
maxActive=10
maxWait=3000

        以上就是JDBC和连接池的部分知识点啦,后续会继续补充。各位大佬如发现有知识点错误或者有不同的建议与意见,欢迎评论、私信指正,本人才疏学浅还需向各位大佬学习,还请不吝赐教!在此感谢各位的观看!谢谢! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值