惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
C
Check Point Blog
B
Blog RSS Feed
G
Google Developers Blog
H
Help Net Security
博客园 - Franky
Blog — PlanetScale
Blog — PlanetScale
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Recent Announcements
Recent Announcements
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
DataBreaches.Net
小众软件
小众软件
T
The Blog of Author Tim Ferriss
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
T
Tailwind CSS Blog
J
Java Code Geeks
MyScale Blog
MyScale Blog
雷峰网
雷峰网
有赞技术团队
有赞技术团队
博客园 - 聂微东

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈
Java JDBC的简单实现 - OXOXTECH 牛牛技术客栈
Mr.Potato · 2023-02-12 · via 牛牛技术客栈

Mr.Potato Java Java, MySQL, JDBC

1、基本jdbc的代码实现

/*
   基本jdbc操作
 */

import java.sql.*;

public class JdbcDemo {
    public static final String URL = "jdbc:mysql://localhost:3306/test";
    public static final String USER = "root";
    public static final String PASSWORD = "root";
    public static final String SELECT_SQL = "SELECT * FROM t_order";
    public static final String UPDATE_SQL = "INSERT into t_role VALUES(3,'jiwei','kaishi','')";

    public static void main(String[] args) {
        // 1、导入MySQL或者其他数据库驱动包
        Connection con = null;
        ResultSet rs = null;
        Statement statement = null;

        try {
            // 2、加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            // 3、获取数据库连接
           con = DriverManager.getConnection(URL, USER, PASSWORD);
                //自动提交事务改为手动提交
                con.setAutoCommit(false);
            // 4、获取执行sql的小火车-statement对象
           statement = con.createStatement();
                // 预编译的小火车:提前装载sql
                //PreparedStatement pst = con.prepareStatement(SELECT_SQL);
                //pst.executeQuery();
            // 5、执行sql,拿到结果集
            rs = statement.executeQuery(SELECT_SQL);
            //int i = statement.executeUpdate(UPDATE_SQL);
            // 6、遍历结果集,获取数据
            while (rs.next()) {
                System.out.println(rs.getString(1));
                System.out.println(rs.getString(2));
            }
            //提交事务  没问题,提交吧
            con.commit();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            //数据回滚
            if (con !=null){
                try {
                    con.rollback();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }finally {
            // 7、 释放资源,后调用的先关闭;关闭之前先判断对象是否存在
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}

2、内置Api一览

连接对象——Connection

客户端与数据库的操作都是基于Connection进行交互的。

// 创建运送sql的小火车~
Statement statement = Connection.createStatement();
PreparedStatement pst = con.prepareStatement(SELECT_SQL);

// 事务
con.setAutoCommit(false);
con.commit();// 提交
con.rollback();	// 回滚

小火车——Statement

将sql语句运输到数据库。

// 查询
statement.executeQuery(SELECT_SQL)
// 增删改
statement.executeUpdate(UPDATE_SQL)
// 执行
statement.execute(SQL)
// 批处理(导入)
statement.addBatch(); 
statement.executeBatch();
statement.clearBatch();

结果集——ResultSet

ResultSet维护了一个数据行的游标,调用ResultSet.next(),可以让游标指向具体行,获取数据。

(ps:工作时验证,调用ResultSet.next(),结果集中才有数据,而非执行sql时)

// 获取指定字段/行的数据
rs.getString(1)//第一个字段
rs.next() //对结果集滚动查看
// 遍历结果集
if 1条数据一下
while 循环遍历多条

3、JDBC的细节

PreparedStatement的优势:

​ 同样是小火车,比Statement的绿皮火车强大多了!

1、 Statement编译SQL时,比较古板,变量必须要用分隔符’++‘隔开,而PreparedStatement可以使用占位符,写起来简单多了;  最关键能够防止SQL注入问题!!!
2、 Statement需要频繁编译SQL,而PreparedStatement可以进行预编译,将SQL存储起来,能极大提升效率;