JDBC

作者: 扶光_ | 来源:发表于2023-10-16 15:50 被阅读0次

一,JDBC(java database connecticity)java数据库连接

就是用java语言来操作关系型数据库的API
开发一个jdbc代码可以同时操作多个关系型数据库


jdbc

步骤:
1 首先导入jdbc的jar包
2 注册驱动
Class.forName("com.mysql.jdbc.Driver");
3 获取连接
Connection conn = DriverManager.getConnection(url,username,password);
4 定义SQL语句
String sql = "update 表名 ...";
5 获取执行SQL对象
Statement stmt = conn.createStatement();
6 执行SQL
stmt.executeUpdate(sql);
7 处理返回结果
8 释放资源

 // 1 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2 获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";//自己数据库名字密码
        String password = "1234";
        Connection conn = DriverManager.getConnection(url,username,password);
        // 3 定义sql语句
        String sql = "update emp set salary = 20000 where id = 1";
        // 4 获取执行sql对象
        Statement stmt =  conn.createStatement();
        // 5执行SQL 有返回值 返回整数
        int count = stmt.executeUpdate(sql);
        System.out.println("影响数目"+count);
        //6 是否资源
        stmt.close();
        conn.close();

二,JDBC的一些API

1 DriverManger(驱动管理类)

1 注册驱动
2 获取数据库连接
DriverManager.getConnection(url,username,password)
url:jdbc:mysql://127.0.0.1:3306/db1
安全提示取消命令
jdbc:mysql://127.0.0.1:3306/db1?useSSL=false 加上

2 Connection

1获取执行sql对象
普通执行sql对象
Statement createStatement()
预编译sql的执行sql对象,防止sql注入
PreparedStatement prepareStatement(sql)
2管理事务
BEGIN 开启
ROLLBACK 回滚
COMMIT 提交

这里可以使用try catch语法进行包裹,如果出现异常回滚事务,成功的执行commit

3Statement作用

1 执行SQL语句
executeUpdate(sql) 执行dml ddl语句
返回dml影响的行数,ddl执行可能返回0

4 ResultSet

结果集封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql) 返回ResultSet对象
获取查询结果 Boolean next() true有效
比如表中的数据是id name salary
获取数据int GetInt(参数)

while(rs.next()){
    //获取数据
int id = rs.getInt(第一列数据所在位置)//1  也可以使用字段名 "id"
String name = rs.getString(第二列数据)//2 
double money = rs.getDouble(第三列数据)//3
    rs.getXxx(参数);
  }
过程
  // 1 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2 获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";//自己数据库名字密码
        String password = "1234";
        Connection conn = DriverManager.getConnection(url,username,password);
        // 3 定义sql语句
        String sql = "select * from emp";
        // 4 获取执行sql对象
        Statement stmt =  conn.createStatement();
        // 5执行SQL 有返回值 返回整数
        ResultSet rs= stmt.executeQuery(sql);
        //创建集合
        ArrayList<Account> list = new ArrayList<>();
        while(rs.next()){
            //创建对象
            Account ac = new Account();
            //获取数据
             int id=rs.getInt("id");
             String name= rs.getString("name");
             String gender= rs.getString("gender");
             Double salary= rs.getDouble("salary");
             Date date= rs.getDate("join_date");
             int dep_id=rs.getInt("dep_id");
             //赋值
             ac.setId(id);
             ac.setName(name);
             ac.setGender(gender);
             ac.setDate(date);
             ac.setSalary(salary);
             ac.setDep_id(dep_id);
             //存入集合
             list.add(ac);
        }
        System.out.println(list);
        //6 是否资源
        stmt.close();
        conn.close();

5 PreparedStatement

预编译sql语句并执行:预防SQL注入问题
SQL注入:通过事先定义好的SQL语句,用以达到执行代码攻击服务器的方法

select id from users where username = '"+username +"' and password = '" + password +"'" 这里的username和password都是我们存取从web表单获得的数据。下面我们来看一下一种简单的注入,如果我们在表单中username的输入框中输入' or 1=1-- ,password的表单中随便输入一些东西,假如这里输入123.此时我们所要执行的sql语句就变成了select id from users where username = '' or 1=1-- and password = '123',我们来看一下这个sql,因为1=1是true,后面 and password = '123'被注释掉了。所以这里完全跳过了sql验证。

SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。

String name = "侯旭";
String pwd= "1234";
//定义sql 使用?拼接参数
String sql = "select * from user where name=? and pwd=?"
//获取PreparedStatement对象
PreparedStatement ps= conn.PreparedStatement(sql);
//设置问号值
ps.setString(1,name);
ps.setString(2,pwd);
//执行sql
Result rs =  ps.executeQuery();//执行SQL

预编译优点
1 性能更高
2 将敏感字符进行转义

  • 1要开启预编译功能,需要在连接后面拼接
&useServerPrepStmts=true添加到连接后面
String url = "jdbc:mysql://127.0.0.1:3306/db1&useServerPrepStmts=true";
  • 2 配置sql配置文件 在my.ini中加入
log-output=FILE
general
general_log_file=“D:\mysql.log"
slow-query-log=1
slow_query_log_file=“D:\mysql_slow.log"
long_query_time=2

  • 3 重启mysql服务

三,数据库连接池

管理数据库连接的容器,负责分配,管理数据库连接

之前我们是来一个用户我们建立一个连接然后释放掉,来一个用户建立一个连接然后再释放掉
这是一个非常耗时的操作

连接池就是一个多个连接的容器,当一个用户使用完之后还得归还回来,就像银行柜台共享的多只笔,使用完归还,下一个人继续使用

好处:资源复用 提升响应速度 避免遗漏

连接池的实现 标准接口是DataScource
由第三方来实现该接口
常见数据库连接池有

  • DBCP
  • C3P0
  • Druid

Druid是阿里巴巴开源项目 ,

Druid 使用步骤

  1. 导入jar包
    2 定义配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
username=root
password=1234
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

放在src下druid.properties名的文件下
3 加载配置文件

Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));

4 获取数据库连接池对象

DataScource ds = DuridDataScourceFactory.createDataScource(prop);

5 获取连接

Connection conn = ds.getConnection();
sout(conn);

相关文章

  • JDBC

    JDBC原理: JDBC: 抽取JDBC工具类 : JDBCUtils JDBC控制事务:

  • JDBC 的使用

    JDBC JDBC什么是JDBCJDBC 的使用JDBC 的数据类型 什么是JDBC JDBC(Java Data...

  • Java和MySQL简建立连接

    JDBC JDBC插入多条数据 JDBC查询 JDBC动态传参 JDBC回滚 JDBC将数据库中的信息装入List...

  • JDBC

    JDBC JDBC:Java DataBase Connectivity JDBC的本质是什么?JDBC是SUN公...

  • java异常合集

    jdbc com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExce...

  • Day05--JDBC

    JDBC: 抽取JDBC工具类:JDBCUtils JDBC控制事务

  • JDBC

    JDBC: 抽取JDBC工具类 : JDBCUtils JDBC控制事务:

  • JDBC编程目录

    JDBC编程目录 SQL基础JDBC基础JDBC进阶

  • JDBC和数据库连接池

    1.JDBC介绍1.1 1.1 JDBC介绍 2.JDBC之API2.1 2.1 JDBC之API 3.JDBC例...

  • # day10_JDBC基础

    一,JDBC概述 1.为什么要使用JDBC 1.1没有JDBC 1.2有了JDBC后 2.JDBC的概念 2.1....

网友评论

      本文标题:JDBC

      本文链接:https://www.haomeiwen.com/subject/owrtidtx.html