一、概述

        JDBC(Java Database ConnectivityJava数据库连接就是使用Java语言操作关系型数据库的一套API。JDBC本质上是一套操作所有关系型数据库的规则,即接口,各个关系型数据库要去实现这个接口,就需要提供各自的数据库驱动jar包。程序员使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

二、JDBC的使用

1.步骤

(1)创建工程,导入对应的驱动jar包
        项目下创建lib目录与src同级,将下载的文件中的jar包放到lib文件夹下 
【注意】光导入驱动jar包还不行,需要注册驱动代码才能识别这个jar包。
(2)注册驱动(MySQL5后可省略)
Class.forName("com.mysql.jdbc.Driver");
【tips】使用Class.forName("com.mysql.jdbc.Driver")后,jvm会加载这个类,然后进入com.mysql.jdbc.Driver,会立即注册驱动。
(3)与数据库建立连接
Connection conn = DriverManager.getConnection(url, username, password);
(4)定义sql语句
String sql = "update account set money=2000 where id=1;";
(5)获取执行sql语句的对象
Statement stmt = conn.createStatement();
(6)执行sql语句
int i = stmt.executeUpdate(sql);//返回受影响的行数
(7)处理结果
(8)释放资源 

2.API详解

(1)DriverManager

        驱动管理类,用来注册驱动获取数据库连接
        1)注册驱动:
Class.forName("com.mysql.jdbc.Driver");
【tips】:MySQL5之后的驱动jar包不需要手动注册驱动的步骤了,会自动进行驱动的注册。
        2)获取连接:
static Connection getConnection(String url, String user, String password)
尝试建立与给定数据库URL的连接。
【tips】url:连接路径,语法:jdbc:mysql://ip地址:端口号/数据库名称?参数值键值对1&参数值键值对2...
【注意】如果连接的是本机mysql服务器且mysql服务器默认端口号是3306,则url可省略IP和端口号:jdbc:mysql:///数据库名称?参数键值对。

(2)Connection

        数据库连接对象,用来获取执行sql语句的对象管理事务
        1)获取执行sql对象
Statement createStatement()
创建一个 Statement对象,用于将SQL语句发送到数据库
PreparedStatement prepareStatement(String sql)
预编译sql的执行sql对象,防止sql注入
CallableStatement prepareCall(String sql)
创建一个 CallableStatement对象来调用数据库存储过程。
【注意】使用createStatement()获取Statement的执行sql对象不需要参数,而使用prepareStatement(sql)获取PrepareStatement的执行sql对象需要传入sql语句!
        2)JDBC中的事务管理
void setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态:true表示自动提交事务,false表示手动提交事务。
void commit()
提交事务。
void rollback()
回滚事务。
【tips】一般用try...catch...来处理事务管理:
try {
    //开启事务
    conn.setAutoCommit(false);

    int i1 = stmt.executeUpdate(sql1);
    System.out.println(i1);
    int i2= stmt.executeUpdate(sql2);
    System.out.println(i1);

    //提交事务
    conn.commit();
} catch (SQLException e) {
    //回滚事务
    conn.rollback();
    e.printStackTrace();
}

(3)Statement

        用于执行静态SQL语句并返回其生成的结果的对象。
int executeUpdate(String sql)
执行DDL、DML语句。
ResultSet executeQuery(String sql)
执行DQL语句,返回结果集对象
【tips】executeUpdate(sql)的返回值:如果执行DDL语句,执行成功后也可能返回0;如果执行DML语句,返回受影响的行数。

(4)★ResultSet:结果集对象,封装了DQL查询语句的结果

获取查询结果
boolean next()
光标从当前位置向下移动一行,并返回该行是否为有效行(有数据的行),有效行则返回true
xxx getXxx(参数) 获取参数。xxx代表数据类型,参数是列的编号(int类型,从1开始!)或列名(String类型)。
【tips】①获得的ResultSet对象的光标默认在表头行
             ②一般用while循环来实现获取查询结果。
while (rSet.next()) {
    int id = rSet.getInt(1);
    String username = rSet.getString(2);
    
    System.out.println("id:" + id + "," + "username" + username);
    System.out.println("-------------------");
}
             ③ResultSet用完也需要释放资源

(5)★PreparedStatement

        1)PreparedStatement是Statement的子类,用来预编译SQL语句并执行,防止SQL注入问题(如何防止?:将敏感字符进行转义)。
        2)SQL注入:通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。
        3)PreparedStatement的使用:
                从上面的“获取执行SQL语句对象”开始往下不一样了:
                ①定义sql语句:参数用占位符"?"来代替,具体参数后续设置(预编译sql);
 String sql = "select * from tb_user where username=? and password=?;";//用"?"代替要接收的数据
                ②获取sql执行对象PreparedStatement需要传入sql语句!
PreparedStatement pstmt = conn.prepareStatement(sql);//需要传入sql语句
                ③设置?参数:使用setXxx(参数1,参数2)设置"?"的值:
                        Xxx:"?"的数据类型
                        参数1:要设置的"?"在sql语句中的序号从1开始 
                        参数2:要设置的"?"的
pstmt.setString(1,"张三");
pstmt.setString(2,"12");
                 ④执行sql语句:在创建sql对象时已经传入sql语句了,在执行时就不需要传sql语句了!
ResultSet res = pstmt.executeQuery();//无参
        4)PreparedStatement的原理?为什么说PreparedStatement预编译SQL性能更高?
        在定义sql语句时使用了占位符"?",获取PreparedStatement对象时把sql语句发送给mysql服务器,对sql进行检查和编译(这些步骤比较耗时);当执行sql时就不需要再执行对sql进行检查和编译的步骤了,速度更快;另外,如果sql语句模板一样,则只需要进行一次检查和编译。

三、数据库连接池

1.简介

        DataSource(数据源)是 jdk 提供的一个接口,然后只提供了两个 getConnection 方法,是跟数据库连接有关的接口,可以通过它来获取数据库连接。
        DruidDataSource 是阿里巴巴写出来的一个DataSource实现类它不仅可以获取数据库连接,还把这些数据库连接管理了起来,也就是所谓的数据库连接池
        数据库连接池是一个负责分配和管理数据库连接(Connection)容器

2.数据库连接池的优点

(1)实现了资源复用:它允许应用程序重复使用一个现有的数据库连接,而不是每次连接都重新建立一个;
(2)提高了系统的响应速度;
(3)避免了数据库连接遗漏:它可以释放空闲时间超过最大空闲时间的数据库连接,来避免因为没有释放数据库连接而引起的数据库连接遗漏。

3.Druid的使用步骤

(1)导入jar包

        将"druid-1.2.8.jar"复制到项目的lib目录下,并Add as library。

(2)定义配置文件

        在src目录下创建一个druid.properties文件,里面写上配置数据库的信息和连接的信息,如url、username、password等,跟之前的JDBC连接方式一样,只是抽取出来写到一个文件里面了。

(3)加载配置文件

        通过Properties的load方法来加载配置文件。

(4)获取数据库连接池对象

        通过DruidDataSourceFactory(Druid数据源工厂)中的DataSource  createDataSource(Properties prop)方法来获取数据连接池对象(其实是DataSource实现类的对象)。

(5)获取连接

        通过DataSource中的getConnection()方法获取连接。
//(1)导入jar包druid-1.2.8.jar
//(2)定义配置文件
//(3)加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("E:\\IDEA_Project\\JDBC\\src\\durid.properties"));

//(4)获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

//(5)获取连接
Connection conn = dataSource.getConnection();
【tips】通过DataSorce访问跟 JDBC 方式相比,省略了实例化数据库连接驱动 Driver 驱动这一步