02_Java Web——JDBC


JDBC简介

Java DataBase Connectivity Java数据库连接
用于操作关系型数据库的一套API

//0. 创建工程导入jar包(要将jar包导入到库)
public class JDBCDemo {
    public static void main(String[] args) throws Exception{
        //1. 注册驱动
        Class.forName("com.mysql.jdbc.Driver"); //MySQL5之后可以省略
        //2. 获取连接对象
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义SQL
        String sql = "update account set money = 2000 where id = 1";
        //4. 获取执行sql的对象
        Statement stmt = conn.createStatement();
        //5. 执行sql
        int count = stmt.executeUpdate(sql);
        //6. 处理结果
        System.out.println(count);
        //7. 释放资源
        stmt.close();
        conn.close();
    }
}

JDBC API详解

DriverManager

1. 注册驱动
2. 获取数据库连接
//1. 注册驱动
static void registerDriver(Driver driver)   //使用DriverManager注册给定的驱动程序
//MySQL5以后自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
//2. 获取数据库连接
static Connection getConnection(String url, String user, String password)
//url:连接路径
/*
* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2&...
* 例:jdbc:mysql://127.0.0.1:3306/db1
* 例:jdbc:mysql://localhost:3306/db1
* 如果连接本机MySQL数据库且MySQL服务默认端口是3306,则url可以简写为:jdbc:mysql:///db1?键值对...
* 配置useSSL=false参数,禁用安全连接方式,解决警告提示
*/
//user:用户名
//password:密码

Connection

1. 获取执行sql的对象
2. 管理事务
//1. 获取执行sql的对象
    //普通执行sql对象
    Statement createStatement()
    //预编译sql的执行sql对象:防止sql注入
    PreparedStatement prepareStatement(sql)
    //执行存储过程的对象
    CallableStatement prepareCall(sql)
//2. 管理事务
    //开启事务
    setAutoCommit(boolean autoCommit)   //true为自动提交事务,false为手动提交事务
    //提交事务
    commit()
    //回滚事务
    rollback()
//管理事务
public class JDBCDemo {
    public static void main(String[] args) throws Exception{
        //1. 注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接对象
        String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username = "root";
        String password = "";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义SQL
        String sql1 = "insert into account(money) values(300)";
        String sql2 = "delete from account where id = 3";
        //4. 获取执行sql的对象
        Statement stmt = conn.createStatement();
        try {
            //开启事务
            conn.setAutoCommit(false);
            //5. 执行sql
            int count1 = stmt.executeUpdate(sql1);
            //6. 处理结果
            System.out.println(count1);
            //5. 执行sql
            int count2 = stmt.executeUpdate(sql2);
            //6. 处理结果
            System.out.println(count2);
            //提交事务
            conn.commit();
        } catch (Exception e) {
            //回滚事务
            conn.rollback();
            e.printStackTrace();
        }
        //7. 释放资源
        stmt.close();
        conn.close();
    }
}

Statement

1. 执行sql语句
//1. 执行sql语句
    int executeUpdate(sql)  //执行DML、DDL语句
        //返回值:(1)DML语句影响的行数  (2)DDL语句执行后,执行成功也可能返回0
    ResultSet executeQuery(sql) //执行DQL语句
        //返回值:ResultSet结果集对象

ResultSet

1. 封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql)    //执行DQL语句,返回ResultSet对象
//获取查询结果
boolean next()  //(1)将光标从当前位置向前移动一行   (2)判断当前行是否为有效行
xxx getXxx(参数)    //获取数据,如:int getInt(参数)
/*
* 参数
*   int:列的编号,从1开始
*   String:列的名称
*/

PreparedStatement

1. 预编译sql语句并执行:预防sql注入问题
String username = "aaa";
String password = "' or '1'='1";
String sql = "select * from tb_user where username = '" + username + "' and password = '" + password + "'";
//此时sql语句变为
select * from tb_user where username = 'aaa' and password = '' or '1'='1'
1. 获取PreparedStatement对象
2. 设置参数值
3. 执行sql
//1. 获取PreparedStatement对象
    //sql语句中的参数值使用?占位符代替
    String sql = "select * from user where username = ? and password = ?";
    //通过Connection对象获取,并传入对应的sql语句
    PreparedStatement pstmt = conn.prepareStatement(sql);
//2. 设置参数值(?的值)
    setXxx(参数1, 参数2)/*
    * 参数:
    *   参数1:?的位置编号,从1开始
    *   参数2:?的值
    */
//3. 执行sql
    executeUpdate();
    //或者executeQuery();   不需要传递sql
PreparedStatement优点:
    1. 预编译sql,性能更高
    2. 防止sql注入:将敏感字符进行转义

PreparedStatement原理:
    1. 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
    2. 执行时就不用再进行这些步骤,速度更快
    3. 如果sql模板一样,则只需要进行一次检查、编译

预编译功能开启(默认关闭):useServerPrepStmts=true

数据库连接池

数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

好处:
    1. 资源重用
    2. 提升系统响应速度
    3. 避免数据库连接遗漏
//标准接口:DataSource
Connection getConnection()

Druid数据库连接池使用方法

#配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false&useServerPrepStmts=true
username=root
password=
initialSize=5
maxActive=10
maxWait=3000
public class DruidDemo {
    public static void main(String[] args) throws Exception {
        //1. 导入jar包
        //2. 定义配置文件
        //3. 加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        //4. 获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //5. 获取数据库连接
        Connection connection = dataSource.getConnection();

        System.out.println(connection);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子平Zziping

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值