JDBC的使用

JDBC的使用

描述:JDBC 就是使用 Java 语言操作关系型数据库的一套 API,是 Java 和数据库的一个桥梁,是一个规范,由各大数据库厂商实现,能够执行 SQL 语句。

1、JDBC 使用

准备:

为了使用 JDBC,还需要引入一个 MySQL 的 Connector 驱动类,实际上就是 Java 的 JDBC 规范的一个针对 MySQL 的具体实现,这里有两个方式引入 Connector 到项目中:
1、手动导入依赖包
2、Maven 导入 Mysql 的驱动器类依赖
相关:Maven的使用

使用步骤
1. 注册驱动
2. 获取连接对象 Connection 以及 SQL 执行对象
3. 定义SQL语句
4. 执行 SQL 获取返回结果
5. 处理结果
6. 释放资源
1、注册驱动
方式1、Class.forName("com.mysql.jdbc.Driver");
方式2、DriverManager.registerDriver(new Driver());

当使用高版本依赖时会出现控制日志爆红
在这里插入图片描述

方式1、Class.forName("com.mysql.cj.jdbc.Driver");
方式2、DriverManager.registerDriver(new Driver());
2、获取连接对象
  1. 获取执行sql 的对象
    Statement createStatement()
    PreparedStatement prepareStatement(String sql)

  2. 管理事务
    开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
    提交事务:commit()
    回滚事务:rollback()

  3. Statement:执行sql的对象

  boolean execute(String sql) :可以执行任意的sql 了解 
  int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
    	 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功
  ResultSet executeQuery(String sql)  :执行DQL(select)语句
  1. PreparedStatement:执行sql的对象
 解决sql注入问题:使用PreparedStatement对象来解决
 预编译的SQL:参数使用?作为占位符
 给?赋值:
  		setXxx(参数1,参数2)
  				* 参数1:?的位置编号 从1 开始
  				* 参数2:?的值

好处:
   prepareStatement()会先将 SQL 语句发送给数据库预编译。PreparedStatement描述:JDBC 就是使用 Java 语言操作关系型数据库的一套 API,是 Java 和数据库的一个桥梁,是一个规范,由各大数据库厂商实现,能够执行 SQL 语句。
  1. ResultSet:结果集对象,封装查询结果
    boolean next(): 游标向下移动一行,开始时指向表头,到表末尾返回false
    getXxx(参数):获取数据

6、事务demo

public class test7 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement ps1 = null;
        PreparedStatement ps2 = null;
        try {
        //调用工具类获取连接对象
            connection = JDBCUtils.getConnection();
            connection.setAutoCommit(false); //开启事务
            //定义sql语句:将grade为1的losalary减1000,hisalary加1000;
            String sql = "update salarygrade set losalary=losalary-? where grade =?";
            String sql1 = "update salarygrade set hisalary=hisalary+? where grade =?";
            //获取执行sql语句的对象
            ps1 = connection.prepareStatement(sql);
            ps2 = connection.prepareStatement(sql1);
            //为?赋值
            ps1.setInt(1,1000);
            ps1.setInt(2,1);
            ps2.setInt(1,1000);
            ps2.setInt(2,1);
            //执行sql语句
            ps1.executeUpdate();
            //手动制造异常
            int a = 3/0;
            ps2.executeUpdate();
            connection.commit(); //事务提交
        } catch (Exception e) {
            try {
                connection.rollback(); //事务回滚
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
        //调用工具类释放资源
            JDBCUtils.close(ps1,connection);
            JDBCUtils.close(ps2,null);
        }
    }
}

  1. JDBC工具类
//具体代码
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    //将配置文件的读取放在静态代码块中,只要读取一次,随着类的加载而加载
    static {
        try {
            //创建properties集合类   加载并读取配置文件
            Properties pro = new Properties();
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL url1 = classLoader.getResource("jdbc.properties");
            String path = url1.getPath();
//            System.out.println(path);
            pro.load(new FileReader(path));
            //获取数据 赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //获取连接对象
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }
    public static void close(Statement stmt,Connection conn){
        //调用下面重载的方法 简化代码
    close(null,stmt,conn);
    }
    //重载方法
    public static void close(ResultSet resultSet,Statement statement, Connection connection){
        try {
            if (resultSet!=null)
                resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (statement!=null)
                statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (connection!=null)
                connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

2、 获取插入主键

PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

...
int count = pstmt.executeUpdate();
// 获取动态自增主键
ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next()) {
    int insertedKey = rs.getInt(1);
    System.out.println("自增主键:" + insertedKey);
}

3、加载配置方式

方式1.

Properties pp = new Properties();
pp.load(new FileInputStream("jdbc连接数据库\\src\\druid.properties"));

方式2.

 //1.读取配置文件
InputStream inputStream = JDBCTest003.class.getClassLoader().getResourceAsStream("db.properties");
//2.创建属性对象
Properties pro = new Properties();
//3.通过属性对象的load()方法将配置文件读取到流中(Map集合对象中(内存中))
pro.load(inputStream);

4、事务

1、事务的定义

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务是恢复和并发控制的基本单位。

2、事务的四个特性

事务应该具有4个属性:原子性、一致性、隔离性、持久性,这四个属性通常称为ACID特性。

原子性(atomicity)
一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

一致性(consistency)
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)
持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

5、SQL 分类

数据库查询语言(DQL)
简称:DQL,Data Query Language
代表关键字:select

DQL主要是查询表中的数据

数据库操作语言(DML)
简称:DML,Data Manipulation Language
代表关键字:insert、delete 、update

DML主要是增、删、改表中的数据

数据库定义语言(DDL)
简称:DDL,Data Denifition Language
代表关键字:create、drop、alter

DDL主要是创建、删除、修改表的结构

事务控制语言(TCL)
简称:TCL,Trasactional Control Language
代表关键字:commit、rollback

TCL主要是对jdbc中的事务进行提交和回滚操作

数据控制语言(DCL)
简称:DCL,Data Control Language
代表关键字:grant、revoke

DML和DDL的区别是什么
DML是数据库操作语言,主要是修改数据库表中的数据,而DDL是数据库定义语言,主要修改数据中表的结构

6、配置最连接数

MySQL数据库默认支持的最多连接数量为100
我们大家都知道MySQL最大连接数的默认值是100,这个数值对于高并发下的应用是远远不够的,当连接请求大于默认连接数后,就会出现无法连接数据库的错误,因此我们需要把它适当调大一些。
在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to MySQL server. Too many connections”-mysql 1040错误,这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。通常,mysql的最大连接数默认是100,最大可以达到16384。
MySQL查看最大连接数和修改最大连接数:
查看最大连接数
show variables like '%max_connections%';
修改最大连接数
set GLOBAL max_connections = 2000;
也可以通过修改配置文件来修改mysql最大连接数(max_connections),这种方式说来很简单,只要修改MySQL配置文件my.ini或my.cnf的参数max_connections,将其改为max_connections=2000,然后重启MySQL即可。

7、资源释放

一个Connection可以创建多个Statement,一个Statement可以得出多个ResultSet,所以先关闭ResultSet,再关闭Statement,最后关闭Connection
需要关闭ResultSet、Statement、Connection
为了保障能够释放资源,将释放代码编写到finally语句中
分别进行try catch关闭资源
JDBC驱动对象的创建、连接、获取数据库操作对象,执行sql、处理结果集等,都需要消耗时间,其中,这里面涉及到的ResultSet、Statement、Connection对象,使用完了需要释放,否则,造成资源浪费,严重的,服务器宕机
 	//释放资源部分代码片段
    catch (SQLException e){
        e.printStackTrace();
    } finally{
        //第六步:释放资源,分别进行try catch
        //从小的开始关闭
        try {
            if (resultSet != null) {
                resultSet.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            if (statement != null) {
                statement.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


8、连接池

DBCP
C3P0
Druid

9、数据库常见配置

useSSL=false

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值