javaweb 之 JDBC 详解 数据库连接池

 JDBC简介

JDBC 就是使用Java语言操作关系型数据库的一套API

全称:( Java DataBase Connectivity ) Java 数据库连接

JDBC 本质:

官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口

各个数据库厂商去实现这套接口,提供数据库驱动jar包

我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

JDBC 好处

各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发

可随时替换底层数据库,访问数据库的Java代码基本不变

JDBC快速入门

 测试代码:

public class Jdbc {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取链接
        String url="jdbc:mysql://127.0.0.1:3306/db1";
        //自己电脑的用户名跟密码
        String username="root";
        String password="123";
        Connection conn= DriverManager.getConnection(url,username,password);

        //3. 定义sql语句
        String sql ="update account set money = 1000 where id= 1";
        //4.获取执行sql的对象 Statement
        Statement stmt =conn.createStatement();

        //5.执行sql
        int count =stmt.executeUpdate(sql);//返回受影响的行数

        //6.处理结果
        System.out.println(count);

        //7.释放资源
        stmt.close();
        conn.close();
    }
}

JDBC API详解

1.DriverManager

DriverManager(驱动管理类)作用:

1.注册驱动

2.获取数据库连接

2.connection(数据库连接对象)

Connection作用:

1.获取执行 SQL 的对象

2.管理事务

 在管理事务中,我们如果操作数据交互,那么一方修改完出错,另一方没有修改 我们则需要回滚事务

所以我们可以使用try catch来捕获异常,在catch中回滚事务,就可以了

 try {
            conn.setAutoCommit(false);//开启事务
            int count1 =stmt.executeUpdate(sql1);//返回受影响的行数
            System.out.println(count1);
            int count2 =stmt.executeUpdate(sql2);//返回受影响的行数
            System.out.println(count2);
            conn.commit();//提交事务
        } catch (Exception e) {
            conn.rollback();//回滚事务
            throw new RuntimeException(e);
        }

Statement

 executeUpdate(sql) :我们可以根据返回值是否大于0 判断是否修改成功。分别输出不同的语句

Resultset(结果集对象)

 String sql1 ="select * from account";

        //4.获取执行sql的对象 Statement
        Statement stmt =conn.createStatement();

        //执行sql 并返回得到的数据对象
        ResultSet rs = stmt.executeQuery(sql1);

        //当rs.next()有数据时就循环遍历每一行
        while (rs.next()){
            //获取每列数据
            int id=rs.getInt(1);
            String name=rs.getString(2);
            double money =rs.getDouble(3);
            System.out.println(id);
            System.out.println(name);
            System.out.println(money);
            System.out.println("---------");

        }

resultset 案例 

需求:查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中

 String sql1 ="select * from account";

        //4.获取执行sql的对象 Statement
        Statement stmt =conn.createStatement();

        //执行sql 并返回得到的数据对象
        ResultSet rs = stmt.executeQuery(sql1);
        
        //创建集合
        ArrayList<Account> list =new ArrayList<>();

        //当rs.next()有数据时就循环遍历每一行
        while (rs.next()){

            //获取每列数据
            int id=rs.getInt(1);
            String name=rs.getString(2);
            double money =rs.getDouble(3);
            //利用带参构造直接创建对象
            Account account =new Account(id,name,money);
            //将对象加入集合
            list.add(account);
        }
        System.out.println(list);

PreparedStatement:

作用:预编译SQL语句并执行:预防SQL注入问题

SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

举例:

如用户登录时的sql语句:

String name ="asdasd"

String pwd=" 'or '1' ='1 "

String sql ="select * from tb_user where username =' "+name+" ' and password = ' "+pwd+" ' "; 

sql 语句就成为了 select * from tb_user where username =' asdasd' and password = ' ' or '1' ='1 '

or 后面 1=1 恒等 所以一定会登录成功 

这时候我们就需要使用preparedStatement

 String uname ="zhangSan";
        String pwd ="123";
        String sql1 ="select * from account where name=? and password=?";
        //获取pstmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql1);
        //设置各个问号的值
        pstmt.setString(1,uname);
        pstmt.setString(2,pwd);
        //运行sql并返回数据
        ResultSet rs = pstmt.executeQuery();

        if(rs.next()){
            System.out.println("登陆成功");
        }else {
            System.out.println("登录失败");
        }

prepared 会将敏感字符进行转义,这样就不会影响sql语句

 预编译需要在String url 加上useServerPrepStmts=true 

数据库连接池

数据库连接池简介:

数据库连接池是个容器,负责分配、管理数据库连接(Connection)

它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

好处:

1.资源重用 2.提升系统响应速度 3.避免数据库连接遗漏

 

Druid 使用步骤:

导入jar包 druid-1.1.12.jar

定义配置文件

加载配置文件

获取数据库连接池对象

获取连接

定义配置文件: 

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true

username=root

password=123

//初始化连接数量

initialSize=5

//最大连接数

maxActive=10

//最大等待时间

maxWait=3000

加载配置文件:

Properties prop =new properties();

prop.load(new FileInputStream("配置文件路径"));

获取连接池对象

DataSource datasource = DruidDataSourceFactory.createDataSource(prop);

获取数据库链接Connection

Connection connetion = dataSource.getConnection();

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值