• MySQL之JDBC编程



    提示:以下是本篇文章正文内容,Java系列学习将会持续更新

    一、JDBC

    Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。

    JDBC访问数据库层次结构:
    在这里插入图片描述

     那么如何实现JDBC呢?

    1-1 创建 Maven 项目

    在这里插入图片描述在这里插入图片描述

    1-2 在 pom.xml 中添加依赖

     pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。

    <!-- 添加 mysql 依赖 -->
    <dependency>
    	<groupId>mysql</groupId>
    	<artifactId>mysql-connector-java</artifactId>
    	<version>5.1.49</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1-3 建立连接

    package com.shaoyuwang;
    
    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    /**
     * 测试jdbc: Java代码与数据库连接,打印全部数据库名
     */
    public class Demo1 {
        public static void main(String[] args) throws SQLException {
            // show databases
            // 类似:保存联系人信息
            MysqlDataSource db = new MysqlDataSource();
            // 找到服务器和端口
            db.setServerName("localhost");
            db.setPort(3306);
            // 验证用户名和密码
            db.setUser("root");
            db.setPassword("123456");
            // 配置其它信息
            db.setUseSSL(false);
            db.setCharacterEncoding("utf-8");
            db.setServerTimezone("Asia/Shanghai");
    
    //        Connection c = null;
    //        try {
    //            c = db.getConnection();
    //        } finally {
    //            if (c != null) {
    //                c.close();
    //            }
    //        }
    
            String sql = "show databases";
            // Connection :连接
            try (Connection c = db.getConnection()) {
                // Statement: 语句 :要说的话
                try (PreparedStatement ps = c.prepareStatement(sql)) {
                    // execute: 执行   query:查询
                    try (ResultSet rs = ps.executeQuery()) {
                        // 遍历得到的结果,打印到控制台(屏幕)
                        while (rs.next()) {
                            String name = rs.getString(1);
                            System.out.println(name);
                        }
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    回到目录…

    二、连接步骤

    2-1 先获取 Connection 对象

    a. 通过DataSource方式

    MysqlDataSource db = new MysqlDataSource();
    db.setServerName("localhost");
    db.setPort(3306);
    db.setUser("root");
    db.setPassword("123456");
    // db.setDatabaseName("lib_0403"); 该语句表示之后的操作仅对该库执行
    db.setUseSSL(false);
    db.setCharacterEncoding("utf-8");
    db.setServerTimezone("Asia/Shanghai");
    
    try (Connection c = db.getConnection()) {
        // ......
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    b. 通过DriverManager方式

    Class.forName("com.mysql.jdbc.Driver");
    
    String url = "jdbc:mysql://localhost:3306/lib_0403?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
    
    Connection c = DriverManager.getConnection(url, "root", "123456");
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2-2 再获取 SQL 语句对象

    String sql = "show databases";
    try (PreparedStatement ps = c.prepareStatement(sql)) {
        // 。。。。。。
    }
    
    • 1
    • 2
    • 3
    • 4

    2-2-1 带结果的SQL,select、show

    try (PreparedStatement ps = c.prepareStatement(sql)) {
        try (ResultSet rs = ps.executeQuery()) {
            while (rs.next()) {
                int reid = rs.getInt(1);
                int rid = rs.getInt("rid");
                String bid = rs.getString(3);
                String borrowedAt = rs.getString("borrowed_at");
    
                System.out.printf("%d, %d, %s, %s\n", reid, rid, bid, borrowedAt);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2-2-2 不带结果的SQL,create

    try (PreparedStatement ps = c.prepareStatement(sql)) {
        // n影响行数
        int n = ps.executeQuery();
        System.out.println(n);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2-3 动态 SQL

    String n = scanner.nextLine();
    try (Connection c = db.getConnection()) {
    	 // 被 SQL 注入
    	 // String sql = "select reid, rid, bid, borrowed_at from records where reid > " + n + " order by reid";
         // ? 表示占位符
         String sql = "select reid, rid, bid, borrowed_at from records where reid > ? order by reid";
    
         try (PreparedStatement ps = c.prepareStatement(sql)) {
              // 有了 PreparedStatment 之后
              // execute 之前
              // 为占位符绑定真实的数据
              // 1表示第i个?,n表示填入的数据
              ps.setString(1, n);
              System.out.println(ps);
    
              try (ResultSet rs = ps.executeQuery()) {
                   // 。。。。。。
              }
         }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2-4 自增 id

    // Statement.RETURN_GENERATED_KEYS 返回自增的键
    try(PreparedStatement ps = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
        ps.setString(1, name);
        
        ps.executeUpdate();
    
        try (ResultSet rs = ps.getGeneratedKeys()) {
            if (rs.next()) {
                int rid = rs.getInt(1);
                System.out.println(rid + "|" + name);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    回到目录…

    三、JDBC使用事务

    3-1 使用事务

    import com.shaoyuwang.util.DBUtil;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    /**
     * jdbc使用事务
     */
    public class TransDemo {
        public static void main(String[] args) throws SQLException {
            String sql1 = "insert into records (rid, bid) values (1, 2)";
            String sql2 = "update books set count = count - 1 where bid = 2";
    
            // 要使用事务,在同一个事务中,操作 sql1 和 sql2,意味着必须在一条 Connection 完成
            try (Connection c = DBUtil.connection()) {
                // connection 中有一个 自动提交(autocommit)的属性,默认情况下,是 true(开启)
                // 开启状态下,意味着,每一条 sql 都会被独立的视为一个事务
                // 我们要让 sql1 和 sql2 看作整体,只需要关闭 connection 的自动提交
                c.setAutoCommit(false);
                // 此时就可以手动的控制事务的结束位置,并且需要手动提交
    
                try (PreparedStatement ps = c.prepareStatement(sql1)) {
                    ps.executeUpdate();
                }
    
                try (PreparedStatement ps = c.prepareStatement(sql2)) {
                    ps.executeUpdate();
                }
    
                // 由于我们关闭了自动提交了,所以,所有的修改还没有真正地落盘
                c.commit();     // 只有加上这句话,才表示事务被提交了(数据真正落盘了)
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    3-2 DBUtil类

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    /**
     * 获取Connection对象
     */
    public class DBUtil {
    
        private static final DataSource dataSource;
    
        static {
            MysqlDataSource db = new MysqlDataSource();
            String url = "jdbc:mysql://localhost:3306/lib_0403?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
            db.setUrl(url);
            db.setUser("root");
            db.setPassword("123456");
    
            dataSource = db;
        }
    
        public static Connection connection() throws SQLException {
            return dataSource.getConnection();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    回到目录…


    总结:
    提示:这里对文章进行总结:
    以上就是今天的学习内容,本文是MySQL的学习,学习JDBC编程,通过Java程序来操作控制数据库,以及JDBC使用事务。之后的学习内容将持续更新!!!

  • 相关阅读:
    SQL server中:常见问题汇总(如:修改表时不允许修改表结构、将截断字符串或二进制数据等)
    【新技术】是实现智慧燃气的基础
    用C++编写动画+音频版极乐净土
    AppLink结合金蝶云星空作订单信息同步流程
    AnotherRedisDesktopManager无法连接本地redis原因之一
    Triple协议 和dubbo协议
    数据结构刷题——图论
    PieCloudDB Database 3.0 正式发布丨数仓虚拟化技术为数据要素流转注入创新动能
    java计算机毕业设计springboot+vue协同过滤算法及在个性化音乐推荐系统
    编写单元测试
  • 原文地址:https://blog.csdn.net/qq15035899256/article/details/126316677