十五分钟学会JDBC

一、概念理解

最近在学狂神说javaweb视频,他的JDBC讲的很不错,写成技术博客分享给大家,同时方便自己复习,使用。进入正题:

什么是JDBC(Java DataBase Connectivity):java连接数据库

在这里插入图片描述需要jar包支持:

  • java.sql
  • javax.sql
  • mysql-connector-java 连接驱动,必须导入!

二、写JDBC代码前环境搭建:

  1. 数据库代码:
CREATE TABLE users(
	id INT PRIMARY KEY,
	`name` VARCHAR(40),
	`password` VARCHAR(40),
	email VARCHAR(60),
	birthday DATE
); 


INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(1,'张三','123456','[email protected]','2000-01-01');

INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(2,'李四','123456','[email protected]','2000-01-01');

INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(3,'王五','123456','[email protected]','2000-01-01');

SELECT * FROM users;

  1. 导入数据库依赖
<!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
  1. IDEA中连接数据库

在这里插入图片描述

三、JDBC代码步骤

  1. 加载驱动
  2. 连接数据库,该对象代表数据库
  3. 向数据库发送sql的对象 statement : CRUD
  4. 编写sql (根据业务,不同的sql)
  5. 执行sql
  6. 关闭连接

代码如下:

package com.xu.test;

import jdk.nashorn.internal.runtime.OptimisticReturnFilters;

import java.sql.*;

public class TestJdbc {
    
    
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
    
    
        //配置信息
        //useUnicode=true&characterEncoding=utf-8  解决中文乱码
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "root";

        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.连接数据库,该对象代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.向数据库发送sql对象 statement,PreparedStatement : CRUD
        Statement statement = connection.createStatement();

        //4.编写sql
        String sql = "select * from users";

        //5.执行查询sql,返回一个结果集
        ResultSet rs = statement.executeQuery(sql);

        while (rs.next()){
    
    
            System.out.println("id = " + rs.getObject("name"));
            System.out.println("name = " + rs.getObject("name"));
            System.out.println("password = " + rs.getObject("password"));
            System.out.println("email = " + rs.getObject("email"));
            System.out.println("birthday = " + rs.getObject("birthday"));
        }
        //6.关闭连接,释放资源,一定要做,先开后关
        rs.close();
        statement.close();
        connection.close();
    }
}

上述代码中,查询使用的代码是:

ResultSet rs = statement.executeQuery(sql);

然而,增删改都是用,返回值是受影响的行数

int i = statement.executeUpdate(sql);

预编译sql代码:

package com.xu.test;

import java.sql.*;

public class TestJdbc2 {
    
    
    public static void main(String[] args) throws Exception {
    
    
        //配置信息
        //useUnicode=true&characterEncoding=utf-8  解决中文乱码
        String url = "jdbc:mysql://localhost:3306/jdbc";
        String username = "root";
        String password = "root";

        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.连接数据库,该对象代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.编写sql
        String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";

        //4.预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,4); //给第一个占位符? 的值赋值为4
        preparedStatement.setString(2,"徐志斌"); //给第二个占位符? 的值赋值为徐志斌
        preparedStatement.setString(3,"123456"); //给第三个占位符? 的值赋值为123456
        preparedStatement.setString(4,"[email protected]"); //给第四个占位符? 的值赋值为4
        preparedStatement.setDate(5,new Date(new java.util.Date().getTime())); //给第五个占位符? 的值赋值为5

        //5.执行sql
        int i = preparedStatement.executeUpdate();
        if (i > 0){
    
    
            System.out.println("插入成功");
        }

        //6.关闭连接,释放资源,一定要做,先开后关
        preparedStatement.close();
        connection.close();
    }
}

四、事务

要么都成功,要么都失败
ACID原则:保证数据安全 (例如转账问题)

开启事务
关闭事务		commit()
事务回滚		rollback()
关闭事务

假如甲给已转账,万一系统崩溃,甲转出的钱,乙没有收到。为了防止这种情况发生,这时候就提选出事务的作用

代码展示如下:

package com.xu.test;

import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class TestJdbc3 {
    
    

    @Test
    public void test(){
    
    
        //配置信息
        //useUnicode=true&characterEncoding=utf-8  解决中文乱码
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "root";

        Connection connection = null;
        try {
    
    
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.连接数据库,该对象代表数据库
            connection = DriverManager.getConnection(url, username, password);
            //3.通知数据库开启事务,false代表开启
            connection.setAutoCommit(false);
            String sql = "update account set money = money - 100 where name = 'A'";
            connection.prepareStatement(sql).executeUpdate();
            //4.制造错误,体现事务作用
            //int i = 1 / 0;
            String sql2 = "update account set money = money + 100 where name = 'B'";
            connection.prepareStatement(sql2).executeUpdate();

            connection.commit(); //以上两条sql都执行成功,就提交事务!
            System.out.println("success");
        }catch (Exception e){
    
    
            try {
    
    
                //如果出现异常,就通知数据库回滚事务
                connection.rollback();
            } catch (SQLException e1) {
    
    
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
    
    
            try {
    
    
                connection.close();
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_46594796/article/details/109586431