写点什么

MyBatis 学习笔记之 JDBC

作者:fly
  • 2022 年 10 月 01 日
    上海
  • 本文字数:3714 字

    阅读完需:约 12 分钟

前言

JDBC 概述:Java Database Connectivity ,是 sun 公司为了简化和统一 java 连接数据库定义的一套规范;JDBC 和数据库驱动的关系:接口(JDBC)和实现(驱动 jar)的关系;

JDBC 开发流程

  1. 注册驱动 DriverManger:DriverManager.registerDriver(new Driver());

  2. 建立连接 Connection

  3. 获取执行 SQL 语句的对象 Statement

  4. 执行 SQL 语句

  5. 处理结果

  6. 释放资源


DriverManager.getConnection("数据库路径","数据库用户名","数据库密码");statement : 执行SQL语句的对象Connection:连接数据库的对象ResultSet:结果集对象,作用:保存查询后的结果集Close:释放资源
复制代码

DEMO

POM 依赖

<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --><!-- 引入以上依赖,会自动引入 logback-classic、 logback-core、 slf4j-api 依赖--><dependency>    <groupId>ch.qos.logback</groupId>    <artifactId>logback-classic</artifactId>    <version>1.2.7</version></dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.22</version>    <scope>provided</scope></dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version></dependency>
复制代码

代码示例

package com.fly9;
import com.mysql.cj.jdbc.Driver;import lombok.extern.slf4j.Slf4j;
import java.sql.*;
/** * @author anthony * @date 2022/4/2 */@Slf4jpublic class Application { public static void main(String[] args) {
ResultSet resultSet = null; Statement statement = null; Connection connection = null;
try { // 1.注册驱动 DriverManger DriverManager.registerDriver(new Driver()); // 2.建立连接Connection String url = "jdbc:mysql://192.168.5.129:3306/db_learn"; String user = "root"; String password = "123456"; connection = DriverManager.getConnection(url, user, password); // 3.获取执行sql语句的对象Statement statement = connection.createStatement(); // 4.执行sql语句 String sql = "select * from `user`"; resultSet = statement.executeQuery(sql); // 5.处理结果 while (resultSet.next()){ // 可以通过指定的字段名获取 log.info("{}", resultSet.getString("username")); // 也可以通过字段顺序获取,其中字段顺序是从1开始 log.info("{}", resultSet.getString(1)); } } catch (SQLException e) { log.error("the exception is {}", e.getMessage(), e); } finally { // 6.释放资源 try { // 关闭结果集 if (null != resultSet){ resultSet.close(); } if (null != statement){ // 关闭执行sql语句的对象statement statement.close(); } if (null != connection){ // 关闭连接 connection.close(); } } catch (SQLException e) { log.error("the exception is {}", e.getMessage(), e); } } }}
复制代码

JDBC API 详解

java.sql.DriverManager

作用:主要是用于加载驱动,并且创建和数据库的连接;

注册驱动

// 第一种方式// 1.注册驱动 DriverMangerDriverManager.registerDriver(new Driver());// 2.建立连接ConnectionString url = "jdbc:mysql://192.168.5.129:3306/db_learn";String user = "root";String password = "123456";connection = DriverManager.getConnection(url, user, password);
// 第二种方式// 1.注册驱动 DriverMangerClass.forName("com.mysql.cj.jdbc.Driver");// 2.建立连接ConnectionString url = "jdbc:mysql://192.168.5.129:3306/db_learn";String user = "root";String password = "123456";connection = DriverManager.getConnection(url, user, password);
复制代码


翻阅源码发现,通过第一种方式注册驱动,会 new 两次,一次 new Driver(),一次 new DriverInfo(driver, da);所以推荐第二种方式方式注册驱动;

建立连接

// 2.建立连接ConnectionString url = "jdbc:mysql://192.168.5.129:3306/db_learn";String user = "root";String password = "123456";Connection connection = DriverManager.getConnection(url, user, password);
复制代码


jdbc:协议 mysql:子协议 192.168.5.129:主机名 3306:端口号 db_learn:数据库名


常见的几种数据库连接


  1. MySql 写法: jdbc:mysql://localhost:3306/sid

  2. Oracle 写法: jdbc:oracle:thin:@localhost:1521:sid

  3. SqlServer 写法: jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid

java.sql.Connection

作用:接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。


// 创建执行sql语句对象String sql = "select * from `user` where id = 1";Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery(sql);
// 创建预编译执行sql语句的对象String sql = "select * from `user` where id = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);// 设置占位符的值,占位符顺序从 1 开始preparedStatement.setLong(1, 1);ResultSet resultSet = preparedStatement.executeQuery();
复制代码

java.sql.Statement

  1. ResultSet executeQuery(String sql):根据查询语句返回结果集。只能执行 select 语句;

  2. int executeUpdate(String sql):根据执行的 DML(insert update delete)语句,返回受影响的行数;

  3. boolean execute(String sql):此方法可以执行任意 sql 语句。返回 boolean 值,表示是否返回的是 ResultSet 结果集。仅当执行 select 语句,且有返回结果时返回 true,其它语句都返回 false;

java.sql.ResultSet

作用:封装结果集,查询结果表的对象。


  1. 提供一个游标,默认游标指向结果集第一行之前;

  2. 调用一次 next(),游标向下移动一行;

  3. 提供一些 getXXX 方法。XXX 代表的是数据类型;


ResultSet 接口常用 API


  • boolean next() : 将光标从当前位置向下移动一行;

  • XXX getXXX(int columnIndex) : 根据列的序号获取 XXX 类型的值,列的序号从 1 开始;

  • XXX getXXX(String columnName) : 根据列名去获取 XXX 类型的值;

  • void close() 关闭 ResultSet 对象;

SQL 注入问题解决:preparedStatement

什么是 SQL 注入 : SQL 注入是用户利用某些系统没有对输入数据进行充分的检查,从而进行恶意破坏的行为。preparedStatement 概述 : 预编译对象, 是 Statement 对象的子类。特点:


  • 性能要高;

  • 会把 SQL 语句先编译,格式固定好;

  • SQL 语句中的参数会发生变化,过滤掉用户输入的关键字(or);


DEMO


// 创建一个带有占位符(?)的 SQL 语句String sql = "select * from `user` where id = ?";// 创建预编译对象 PreparedStatementPreparedStatement preparedStatement = connection.prepareStatement(sql);// 设置占位符的值,占位符顺序从 1 开始preparedStatement.setLong(1, 1);// 执行 SQL 语句,获取结果集ResultSet resultSet = preparedStatement.executeQuery();
复制代码

连接池

C3P0 连接池



DBCP 连接池


需要导入 commons-dbcp-xx.jar 和 commons-pool-xx.jar



druid 连接池


DbUtils


发布于: 刚刚阅读数: 3
用户头像

fly

关注

InfoQ签约作者 2021.08.03 加入

还未添加个人简介

评论

发布
暂无评论
MyBatis学习笔记之JDBC_mybatis_fly_InfoQ写作社区