文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java基础之JDBC连接数据库与基本操作的示例分析

2023-06-14 23:24

关注

小编给大家分享一下Java基础之JDBC连接数据库与基本操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Java可以用来干什么

Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5. 企业级应用开发;6. Java大数据开发;7.游戏开发等。

一、JDBC概述

Java基础之JDBC连接数据库与基本操作的示例分析 

二、JDBC操作数据库、操作表步骤

我来总结一下JDBC操作数据库与表的步骤,然后详细来介绍它们

注册驱动 (只做一次)

建立连接(Connection)

创建执行SQL的语句(Statement)

执行语句

处理执行结果(ResultSet)

释放资源

看到这里是不是很熟悉,没错,就跟我们前面学习Mysql一样,首先我来介绍一下JDBC的结构与数据库的连接

三、JDBC体系结构与JDBC API

JDBC体系结构由下面两部分组成:

JDBC API

Java基础之JDBC连接数据库与基本操作的示例分析 

四、注册与加载驱动

Driver接口

加载与注册JDBC驱动

前面我们说了,JDBC就是通过一个接口和不同数据库提供了JDBC的驱动来完成数据的操作,因此,我们将驱动加载到JDBC中,加载驱动有两种方式:

方式一:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名

Class.forName(“com.mysql.jdbc.Driver”);

方式二:DriverManager 类是驱动程序管理器类,负责管理驱动程序

DriverManager.registerDriver(com.mysql.jdbc.Driver);

通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例

五、建立连接(Connection)

jdbc:子协议:子名称协议:JDBC URL中的协议总是jdbc 子协议:子协议用于标识一个数据库驱动程序子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名

下面我来列举几个常见的JDBC URL,大家使用的时候直接复制就好

// 对于 Oracle 数据库连接,采用如下形式: jdbc:oracle:thin:@localhost:1521:DatabaseName// 对于 SQLServer 数据库连接,采用如下形式:jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid// 对于 MYSQL 数据库连接,采用如下形式:   jdbc:mysql://localhost:3306/DatabaseName// 插入中文的时候,这个url要写成这个jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&characterEncoding=UTF-8

小伙伴们注意一下,当我们使用Java向数据库中插入一个数据时,如果是中文,首先数据库和表的编码是utf8,其次就是我们要在URL中声明一下编码是UTF-8,不然插入数据是?,如果你们遇到这个问题,那就忽略它

好了,下面是连接数据库的示例代码,这里我操作的是Mysql数据库

package com.company;// 导入依赖包import org.junit.Test;import java.io.FileInputStream;import java.sql.Connection;import java.sql.Driver;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Properties;public class Demo1 {    public static void main(String[] args) {        System.out.println("JDBC Test...");    }// 使用Driver来实现数据库连接    @Test    public void test1() throws SQLException {//         Driver driver=new com.mysql.jdbc.Driver();        Properties p1 = new Properties();        p1.setProperty("user", "root");        p1.setProperty("password", "mysql123");        Connection connect = driver.connect("jdbc:mysql://localhost:3306/myemployees", p1);        System.out.println("connect = " + connect);    }// 使用DriverManager来实现数据库连接    @Test    public void test2() throws SQLException {        com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();        Properties p1 = new Properties();        p1.setProperty("user", "root");        p1.setProperty("password", "mysql123");        DriverManager.registerDriver(driver);        Connection connection = DriverManager.getConnection                ("jdbc:mysql://localhost:3306/myemployees", p1);        System.out.println("connection = " + connection);    }// 将账号密码抽出到配置文件中,并使用IO流读取配置文件的方式连接数据库    @Test    public void test3() throws Exception {        Properties p = new Properties();        FileInputStream fis = new FileInputStream("p.properties");        p.load(fis);        fis.close();        Class.forName(p.getProperty("driverClass"));        Connection connection = DriverManager.getConnection(p.getProperty("url"),                p.getProperty("user"), p.getProperty("password"));        System.out.println("connection = " + connection);    }}

properties文件内容

url=jdbc:mysql://localhost:3306/myemployeesuser=rootpassword=mysql123driverClass=com.mysql.jdbc.Driver

六、使用PreparedStatement

介绍完注册驱动与数据库的连接,接下来就是操作SQL了,在JDBC中,操作SQL需要使用Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象

PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句

PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值

在操作SQL前还要说明一下数据类型,我们知道SQL与Java的数据类型命名是不一样的,所以我们在编码时要注意

java类型SQL类型
booleanBIT
byteTINYINT
shortSMALLINT
intINTEGER
longBIGINT
StringCHAR,VARCHAR,LONGVARCHAR
byte arrayBINARY , VAR BINARY
java.sql.DateDATE
java.sql.TimeTIME
java.sql.TimestampTIMESTAMP

使用PreparedStatementSQL的操作步骤

调用连接对象的prepareStatement方法,创建PreparedStatement对象

完成预编译的SQL语句

对SQL语句中的占位符进行赋值

提交SQL语句

释放资源

接下来就是操作SQL增删改查的示例代码(为了方便操作,我将数据库连接抽出到了JDBCUtils类中)

// 使用PreparedStatement来完成数据的增删改查操作package com.company.jdbc;import org.junit.Test;import java.io.FileInputStream;import java.sql.*;import java.util.ArrayList;import java.util.List;import java.util.Properties;public class CRUDDemo {        @Test    public void test() throws SQLException {        //1.获取数据库连接对象        Connection connection = JDBCUtils.getConnection();        //2.预编译        // ? : 占位符(只能是设置数据的地方可以写成占位符)        String sql = "insert into student(sid,sname,sage) values(?,?,?)";        PreparedStatement ps = connection.prepareStatement(sql);        //3.给占位符赋值                ps.setInt(1,100);        //数据设置成中文可不可以取决于表的编码集        ps.setString(2,"longge");        ps.setInt(3,20);        //4.执行sql        //返回值 : 有几条数据受到影响        int result = ps.executeUpdate();//增,删,改的语句使用该方法        System.out.println("有"+result+"条数据受到影响");        //5.关资源        JDBCUtils.close(ps,connection);    }        @Test    public void test2() throws SQLException {        //1.获取数据库连接对象        Connection connection = JDBCUtils.getConnection();        //2.预编译        String sql = "update student set sid=? where sid=?";        PreparedStatement ps = connection.prepareStatement(sql);        //3.给占位符赋值        ps.setInt(1,10);        ps.setInt(2,100);        //4.执行sql语句        int result = ps.executeUpdate();        System.out.println("有"+result+"条数据受到影响");        //5.关闭资源        JDBCUtils.close(ps,connection);    }        @Test    public void test3() throws SQLException {        //1.获取数据库连接对象        Connection connection = JDBCUtils.getConnection();        //2.预编译        String sql = "delete from student where sid=?";        PreparedStatement ps = connection.prepareStatement(sql);        //3.给占位符赋值        ps.setInt(1,10);        //4.执行sql语句        int i = ps.executeUpdate();        System.out.println("有"+i+"条数据受到影响");        //5.关闭资源        JDBCUtils.close(ps,connection);    }        @Test    public void test4() throws Exception {        List<Student> students = getStudent();        for (Student s : students) {            System.out.println(s);        }    }    public List<Student> getStudent() throws Exception {        //1.获取数据库连接对象        Connection connection = JDBCUtils.getConnection();        //2.预编译        PreparedStatement ps = connection.prepareStatement("select sid,sname,sage from student");        //3.执行sql语句        ResultSet resultSet = ps.executeQuery();//查询语必须执行此方法        List<Student> list =  new ArrayList<>();        //4.遍历ResultSet        while(resultSet.next()){//是否有数据                        int sid = resultSet.getInt("sid");            String sname = resultSet.getString("sname");            int sage = resultSet.getInt("sage");            //System.out.println(sid + " " + sname + " " + sage);            list.add(new Student(sid,sname,sage));        }        //5.关闭资源        JDBCUtils.close(ps,connection,resultSet);        return list;    }}

JDBCUtils连接数据库的工具类

//JDBCUtils类,专门实现数据库的连接与资源释放操作package com.company.jdbc;import java.io.FileInputStream;import java.io.IOException;import java.sql.*;import java.util.Properties;public class JDBCUtils {    private static String driverClass;    private static String url;    private static String username;    private static String password;    static{        FileInputStream fis = null;        try {            //1.获取数据库连接对象            //通过Properties读取内容            //1.创建Properties对象            Properties p = new Properties();            //2.加载流            fis = new FileInputStream("jdbc.properties");            p.load(fis);            driverClass = p.getProperty("driverClass");            url = p.getProperty("url");            username = p.getProperty("username");            password = p.getProperty("password");        }catch (Exception e){            //终止程序的运行            e.printStackTrace();            //将编译时异常转换成运行时异常            throw new RuntimeException("xxxxxxxx");        }finally {            if (fis != null){                //3.关资源                try {                    fis.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }        public static Connection getConnection(){        try {            Class.forName(driverClass);            //获取数据库连接对象            Connection connection = DriverManager.getConnection(url, username, password);            return connection;        }catch (Exception e){            e.printStackTrace();            throw new RuntimeException("获取连接失败");        }    }        public static void close(PreparedStatement ps, Connection connection) {        if (ps != null){            try {                ps.close();            } catch (SQLException throwables) {                throwables.printStackTrace();            }        }        if (connection != null){            try {                connection.close();            } catch (SQLException throwables) {                throwables.printStackTrace();            }        }    }    public static void close(PreparedStatement ps, Connection connection, ResultSet resultSet) {        close(ps,connection);        if (resultSet != null){            try {                resultSet.close();            } catch (SQLException throwables) {                throwables.printStackTrace();            }        }    }}

七、关于ResultSet的说明

在前面对数据的增删改查操作中,查询操作比较复杂一些,因为我们要接收数据库返回的结果,因此我们要了解一下ResultSet 接口,它由数据库厂商实现

查询需要调用Prepared Statement 的 executeQuery() 方法,查询结果是一个 ResultSet 对象

ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行,具体方法可以自定百度

ResultSet:代表结果集,其封装了使用 JDBC 进行查询的结果. 调用 PreparedStatement 对象的 executeQuery() 可以得到结果集.ResultSet 返回的实际上就是一张数据表. 有一个指针指向数据表的第一条记录的前面

Java基础之JDBC连接数据库与基本操作的示例分析 

以上是“Java基础之JDBC连接数据库与基本操作的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯