Mysql笔记04:JDBC编程

JDBC编程:
JDBC(Java Database Connectivity),Java数据库连接,是一种可以执行SQL语句的Java API。

JDBC编程的大体流程:

1). 创建数据库连接Connection
2). 创建操作命令Statement
3). 使用操作命令来执行SQL
4). 处理结果集ResultSet
5). 释放资源

1 注册 Driver
加载JDBC驱动程序:反射,调用初始化com.mysql.jdbc.Driver类,即将该类加载到JVM方法区,并执行该类的静态方法块、静态属性

Class.forName("com.mysql.jdbc.Driver");  此处需要抛出异常

2 创建数据库连接:

String url = "jdbc:mysql://127.0.0.1:3306/java20_20191218?useSSL=false&characterEncoding=utf8”;
String username = "root";
String password = "mysql";
Connection connection = DriverManager.getConnection( 
               //此处需要抛出异常
                url,
                username,
                password
        );

java20_20191218:数据库名
127.0.0.1:3306:要连接数据库的ip和mysql标准端口
SSL: (Secure Socket Layer) 安全的套接字层
jdbc:mysql:在jdbc中使用默认的mysql协议
1

3 获取语句 Statement
通过连接获取一条语句对象(每个 statement 对象只能用于一条语句)

import java.sql.Statement;
Statement statement = connection.createStatement();

4. 执行一条sql语句 SELECT DATABASE()

String sql = "SELECT DATABASE()";
ResultSet resultSet = statement.executeQuery(sql);

5. 处理结果集,事先知道结果只有一行 + 一列

resultSet.next();   // 调一次 next 才到第一行
String name = resultSet.getString(1); // 下标是从 1 开始的
System.out.println(name);  

// -3. 关闭结果集(resultSet)
resultSet.close();

sql = "SELECT id, username FROM users ORDER BY id";
resultSet = statement.executeQuery(sql);

2

获取结果集数据需要不同的类型,调用不同的方法
int r = resultSet.getInt();
long r = resultSet.getLong();
String r = resultSet.getString();
while (resultSet.next()) {
            int id = resultSet.getInt(1);  //resultSet.getLong(1);
            String user = resultSet.getString(2);
            
            除了下标也可以用字段名	如:”name”
			String user = resultSet.getString(“name”);
			
            System.out.println(id + ", " + user);
        }

resultSet.close();

关闭语句
statement.close();

关闭连接
connection.close();

注意:

  • Driver只注册一次;
  • 可以获取多个Statement, 推荐一个语句使用一个Statement.
  • Connection一般只需要连接一次,特殊情况下需要多个连接。
  • 增/删/改操作insert delete update ————使用executeUpdate执行sql语句;
  • 查select————使用executeQuery执行sql语句,因executeQuery可以返回一个结果集。

通过 statement 对象来执行 SQL 语句
Insert:

Statement statement = connection.createStatement();
String sql = "INSERT INTO users (id, name) VALUES (1, 'glp')";
statement.executeUpdate(sql);

Update:

Statement statement = connection.createStatement();
String sql = "UPDATE users SET name = 'glp' WHERE id = 1";
statement.executeUpdate(sql); 

Delete:

Statement statement = connection.createStatement();
String sql = "DELETE FROM users WHERE id = 1";
statement.executeUpdate(sql); 

select:

Statement statement = connection.createStatement();
String sql = "SELECT id, name FROM users";
ResultSet resultSet = statement.executeQuery(sql);
JDBC常用连接方法

数据库连接Connection
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
(1)一种是通过DriverManager(驱动管理类)的静态方法获取:

加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");

创建数据库连接
Connection connection = DriverManager.getConnection(url);

(2)一种是通过DataSource(数据源)对象获取(实际应用中会使用DataSource对象)

MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setServerName("127.0.0.1");  ip
mysqlDataSource.setPort(3306);    端口
mysqlDataSource.setUser("root");   用户名
mysqlDataSource.setPassword("");   密码
mysqlDataSource.setDatabaseName("java20_0211");  数据库名
mysqlDataSource.setUseSSL(false);         SSL
mysqlDataSource.setCharacterEncoding("utf8");    编码

DataSource dataSource = mysqlDataSource;
Connection con = dataSource.getConnection();

PreparedStatement使用:

try (Connection con = dataSource.getConnection()) {
    String sql = "SELECT chinese FROM voc WHERE english = ?";
    try (PreparedStatement stmt = con.prepareStatement(sql)) {
       stmt.setString(1, request); 尤其要注意 SQL 注入的问题                                                                 
       try (ResultSet rs = stmt.executeQuery()) {
           if (rs.next()) {
             response = rs.getString("chinese");
            }
        }
    }catch (SQLException e) {
                    e.printStackTrace();       
                }

如果获取插入后的 自增 id需使用Statement.RETURN_GENERATED_KEYS) 来获取:

try (PreparedStatement stmt = con.prepareStatement(sql, 
					Statement.RETURN_GENERATED_KEYS)) {
	执行插入操作
}

插入成功,就可以通过 getGeneratedKeys 获取自增 id
      try (ResultSet rs = stmt.getGeneratedKeys()) {
           if (rs.next()) {
               id = rs.getInt(1);
               return new User(id);
            }
      }

(3)以上两种方式的区别是:

  1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
  2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收. 优点就是有连接池,代码简单点。

Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。
1)PrepareStatement: 预编译,速度快;防止 SQL 注入;代码简单点,参数化SQL查询
5
注意:

  • executeQuery() 方法执行后返回单个结果集的,通常用于select语句
  • executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句
  • execute 用于 DDL 语句(create, drop, alter)

(4)JDBC常用写法

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class Database {
    private static DataSource dataSource;

    static {
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setServerName("127.0.0.1");
        mysqlDataSource.setPort(3306);
        mysqlDataSource.setUser("root");
        mysqlDataSource.setPassword("mysql");
        mysqlDataSource.setDatabaseName("java20_blog04");
        mysqlDataSource.setUseSSL(false);
        mysqlDataSource.setCharacterEncoding("utf8");

        dataSource = mysqlDataSource;
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值