jdbc_连接数据库_操作MySQL数据库

jdbc是指各个数据库管理系统厂商提供给Java开发人员操作它们的数据库的驱动包。

 

 


一、使用jdbc步骤

使用jdbc的操作步骤为:

  1、准备好要连接的数据库系统,如MySQL、Oracle数据库系统。

  2、配置好jdbc驱动包。

  3、调用驱动包的类进行数据操作。


二、具体操作

在代码中的操作步骤一般为:

1.加载驱动包
2.获取连接
3.发送sql语句
4.获取结果集
5.释放资源

例子:连接MySQL数据库操作。

    static void jdbcConnection() throws ClassNotFoundException, SQLException {
        //1.加载驱动包
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection(
                //指定ip、端口、数据库名,mysql需要指定SSL为false
                "jdbc:mysql://localhost:3306/leaningjdbc"+"?useSSL=false",
                //用户名
                "root",
                //密码
                "123456");

        //3.使用Statement对象发送sql语句,存在sql注入风险。
        Statement stmt = connection.createStatement();
        //sql语句
        String sql = "insert into t_user(username,pwd) values ('张三',123456)";
        //执行sql语句,返回值为此语句是否有结果集
        boolean haveResult = stmt.execute(sql);
        //执行sql语句,返回值为结果集
        ResultSet result = stmt.executeQuery(sql);
        //执行sql语句,返回值为此语句修改数据的行数
        int updateNumber = stmt.executeUpdate(sql);

        //3.使用PreparedStatement对象发送sql语句,有预编译过程,避免了SQL注入风险.
        //预编译sq语句: ? 表示待传入参数。
        String sql2 = "insert into t_user(username,pwd) values (?,?)";
        //用于执行sql语句的对象,传入预编译的sql。
        PreparedStatement pstmt = connection.prepareStatement(sql2);
        //指定索引传入参数,索引从1开始
        pstmt.setObject(1,"张三");
        pstmt.setObject(2,"123456");
        //执行sql语句
        boolean haveResult2 = pstmt.execute(sql);
        ResultSet result2 = pstmt.executeQuery(sql);
        int updateNumber2 = pstmt.executeUpdate(sql);

        //4.结果集的获取,游标往下移一位,并且判断下一个是否为空
        while (result.next()){
            //通过字段名获取字段数据
            System.out.print(result.getString("id")+"###"+result.getString("username"));
            //通过字段索引获取字段数据,索引从1开始
            System.out.println(result.getString(3)+"###"+result.getString(4));
        }

        //5.释放资源
        //结果集会随着Statement对象释放而释放
        //result.close();
        stmt.close();
        pstmt.close();
        connection.close();
    }

封装例子:jdbc简单封装


三、事务(Transaction)

指一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元。

当这个单元中的一部分操作失败时,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。

jdbc默认是自动提交的,为了保障数据库的一致性,需要进行保护操作:

步骤:

  1. 调用 Connection 对象的 setAutoCommit(false);        以取消默认的自动提交事务。
  2. 调用Connection 对象的 commit();                             手动提交事务。
  3. 在出现异常时,调用Connection 对象的 rollback();   回滚事务。

示例:

static void testTransaction() throws SQLException, ClassNotFoundException {
        //1.加载驱动包
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:53306/leaningjdbc"+"?useSSL=false",
                "root",
                "123456");
        //3.设置事务为手动提交
        connection.setAutoCommit(false);

        //准备sql语句:插入一条数据
        String sql1 = "insert into t_user(username,pwd) values ('张三',123456)";
        String sql5 = "insert into t_user(username,pwd) values (?,?)";

        //4.准备sql执行操作
        Statement stmt = connection.createStatement();
        PreparedStatement pstmt = connection.prepareStatement(sql5);
        pstmt.setObject(1,"红孩儿");
        //缺少参数,会插入失败
        //pstmt.setObject(2,"123456");

        try {
            //5.执行sal语句
            stmt.execute(sql1);
            System.out.println("语句1执行成功...");
            //5.执行sal语句,它会执行失败
            pstmt.execute();
            System.out.println("语句2执行成功...");
            //6.提交事务
            connection.commit();
            System.out.println("事务已经提交");
        }catch (Exception e){
            //6.执行错误时,不进行事务提交,进行回滚
            connection.rollback();
            System.out.println("事务中发生错误....执行回滚操作");
        }
        //7.释放资源
        stmt.close();
     connection.close();
}

运行结果:

控制台输出:

--------start-----------
语句1执行成功...
事务中发生错误....执行回滚操作
--------end-----------

四、批处理(Batch)

成批次地执行sql语句。

步骤:

  1、使用addBatch(String  sql),将给定的SQL命令添加到此 Statement对象的当前命令列表中。 

  2、使用executeBatch(),将一批命令提交到数据库以执行,并且所有命令都执行成功,返回一个更新计数的数组。 

示例:

    static void testBatch() throws ClassNotFoundException, SQLException {
        //1.加载驱动包
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:53306/leaningjdbc"+"?useSSL=false",
                "root",
                "123456");
        //3.设置事务为手动提交
        connection.setAutoCommit(false);
        //sql语句
        String sql = "insert into t_user(username,pwd) values ('张三',123456)";
        String sql2 = "insert into t_user(username,pwd) values ('李四',123456)";
        String sql3 = "insert into t_user(username,pwd) values ('王五',123456)";
        String sql4 = "insert into t_user(username,pwd) values ('老六',123456)";

        Statement stmt = connection.createStatement();
        //4.添加到命令列表
        stmt.addBatch(sql);
        stmt.addBatch(sql2);
        stmt.addBatch(sql3);
        stmt.addBatch(sql4);

        try{
            //5.执行批处理
            stmt.executeBatch();
            System.out.println("执行成功");
        }catch (Exception e){
            //执行过程中发生错误,回滚到初始状态
            connection.rollback();
            System.out.println("事务中发生错误....执行回滚操作");
        }
        //6.提交事务
        connection.commit();
        //7.释放资源
     stmt.close();
connection.close();
    }

五、数据库中的时间类型

Java中提供了三个相关类。

  java.sql.Date          java.sql.Date
  java.sql.Time         表示时分秒
  java.sql.Timestamp          表示年月日时分秒

它们的构造器都需要传入时间戳。

    /**
     * 字符串转为时间戳,字符串格式:2022-12-12 12:32:11
     */
    static long stringToDate(String s){
        try {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(s).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }

六、CLOB与BLOB大对象()

CLOB:用来存储大量的文本数据,操作它需要使用字符流。

    TINYTEXT           255字符
    TEXT              65,535字符
    MEDIUMTEXT         16,777,215字符
    LONGTEXT         4,292,967,295字符(4GB)

写入操作:

            pstmt = conn.prepareStatement("insert into t_user (username,text) values(?,?)");
            pstmt.setObject(1,"xiaowang");
            //文本文件写入CLOB中
            pstmt.setObject(2,new FileReader(new File("d:/a.txt")));
            //字符串写入CLOB中,使用setClob更加具体罢了
            pstmt.setClob(2,new BufferedReader
                    (new InputStreamReader(
                            new ByteArrayInputStream("woainia".getBytes()))));
            pstmt.execute();    

读出操作:

//通过结果集可以获取Clob对象
Clob c = rs.getClob("字段名");
//Clob对象转为字符流
Reader  r = c.getCharcterStream();
//结果集获取的时候可以直接读取为字符串
rs.getString("字段名");

BLOB:用来存储大量的二进制数据,操作它需要使用字节流。

    TINYBLOB           255字节
    BLOB              65,535字节
    MEDIUMBLOB         16,777,215字节
    LONGBOLB         4,292,967,295字节(4GB)

写入操作:

//把指定文件放入blob字段中,也可以使用setObject()
pstmt.setBlob(1,new FileInputStream(new File("C:/logo.png")));

读出操作:

//通过结果集可以获取Blob对象
Blob c = rs.getBlob("字段名");
//Blob对象获取字符流
InputStream r = c.getBinaryStream();
posted @ 2022-12-01 23:27  在博客做笔记的路人甲  阅读(122)  评论(0编辑  收藏  举报