JAVA进阶 JDBC技术学习笔记(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: JAVA进阶 JDBC技术学习笔记(二)

三、JDBC编写步骤

我们可以通过DriverManager对象下的getConnection()方法创建与当前数据库的连接,得到connection对象。得到该对象表示完成和数据库的一次连接。创建好连接之后需要使用Connection对象创建statement对象或者是PreparedStatement对象发送SQL语句,如果执行的语句是查询语句的话返回一个resultSet对象。

3.1获取连接

package cn.it.bz.JDBC;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//获取数据库连接
public class GetConnection {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //连接MySQL的url、username、password
        String url = "jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "123456";
            //通过反射实现数据库驱动对象的加载和注册
            Class.forName("com.mysql.cj.jdbc.Driver");
        /*在加载com.mysql.jdbc.Driver类信息时,会执行静态块中的代码。
        在静态块中,数据库驱动会实例化自己并通过DriverManager的registerDriver方法,
        将自己注册DriverManager驱动管理器中.*/
             // 获取数据库连接对象
            Connection conn = DriverManager.getConnection(url, username, password);
            System.out.println(conn);
    }
}

3.1.1Properties文件的使用

properties文件介绍

后缀properties的文件是一种属性文件。这种文件以key=value格式存储内容。Java中可以使用Properties工具类来读取这个文件。项目中会将一些配置信息放到properties文件中,所以properties文件经常作为配置文件来使用。

Properties工具类

Properties工具类,位于java.util包中,该工具类继承自Hashtable<Object,Object>。通过Properties工具类可以读取.properties类型的配置文件。

工具类中常用方法

load(InputStream is):通过给定的输入流对象读取properties文件并解析,将解析的结果放在Properties工具类存储。

getProperty(String key):根据key获取对应的value

注意

如果properties文件中含有中文那么需要对idea进行设置。

使用properties文件

package cn.it.bz.JDBC;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
//读取配置文件信息
public class PropertiesTest {
    public static void main(String[] args) throws IOException {
        //实例化操作配置文件的对象
        Properties prop = new Properties();
        //获取能读取配置文件的输入流对象
        InputStream resourceAsStream = PropertiesTest.class.getClassLoader().getResourceAsStream("cn/it/bz/JDBC/JDBC.properties");
        //通过Properties工具类读取已经转换为输入流的JDBC.properties文件并解析
        prop.load(resourceAsStream);
        //解析后的文件放在Properties工具类中,
        String name = prop.getProperty("name");
        System.out.println(name);
        String name1 = prop.getProperty("name1");
        System.out.println(name1);
    }
}

3.1.2优化获取数据库连接

# 连接MySQL的url、username、password、driverName
url = jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC
username = root
password = 123456
driverName = com.mysql.cj.jdbc.Driver
package cn.it.bz.JDBC;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class GetConnection2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        //实例化配置文件工具类
        Properties props = new Properties();
        //通过类加载器获取配置文件的字节输入流数据
        InputStream resourceAsStream = GetConnection2.class.getClassLoader().getResourceAsStream("cn/it/bz/JDBC/JDBC.properties");
        //读取并解析文件
        props.load(resourceAsStream);
        //获取连接数据库的url
        String url = props.getProperty("url");
        //获取连接数据库的用户名
        String username = props.getProperty("username");
        //获取连接数据库的密码
        String password = props.getProperty("password");
        //获取连接数据库驱动的全名
        String driverName = props.getProperty("driverName");
        //加载并注册驱动
        Class.forName(driverName);
        //获取连接数据库的对象
        Connection conn = DriverManager.getConnection(url, username, password);
        System.out.println(conn);
    }
}

3.1.3封装JDBC工具类

package cn.it.bz.JDBC;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
//数据库连接工具(工具类的异常不能往外抛出)
public class JdbcUtils {
   private static String url = null;
   private static String username = null;
   private static String password = null;
    //类加载的时候执行,只进行一次加载,适合读取配置文件的IO操作。
    static {
        Properties prop = new Properties();
        try {
            InputStream resourceAsStream = JdbcUtils.class.getClassLoader().getResourceAsStream("cn/it/bz/JDBC/JDBC.properties");
            prop.load(resourceAsStream);
            //获取配置文件中的连接数据库的url
            url = prop.getProperty("url");
            //获取配置文件中的连接数据库的用户名
            username = prop.getProperty("username");
            //获取配置文件中的连接数据库的密码
            password = prop.getProperty("password");
            //获取驱动程序的全名
            String  driverName = prop.getProperty("driverName");
            //实例化驱动
            Class.forName(driverName);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //获取数据库连接对象
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    //关闭数据库连接对象
    public static void closeConnection(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
     //提交事务
    public  static void commit(Connection conn) {
        if (conn != null) {
            try {
                conn.commit();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //事务回滚
    public static void rollback(Connection conn) {
        if (conn != null) {
            try {
                conn.rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //关闭statement对象(preparedStatement)
    public static void closeStatement(Statement stmt) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //关闭resultSet
    public static void closeResultSet(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //关闭DML操作时的资源
    public static void closeDMLResource(Statement ps, Connection con){
        closeStatement(ps);//先关闭statement对象
        closeConnection(con);//再关闭Connection对象
    }
    //关闭DQL时的资源
    public static void closeDQLResource(Connection conn, Statement stmt, ResultSet rs) {
        closeResultSet(rs);//先关闭ResultSet
        closeStatement(stmt);//再关闭Statement
        closeConnection(conn);//最后关闭Connection
    }
}

3.2发送SQL、处理结果

3.2.1通过Statement添加、修改、删除数据

package cn.it.bz.JDBC;
import java.sql.Connection;
import java.sql.Statement;
public class TestStatement {
    //添加用户
    public void insertUser(String username,int userAge) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //获取数据库连接对象
            conn = JdbcUtils.getConnection();
            //获取statement对象
            stmt = conn.createStatement();
            //定义需要statement对象执行的sql
            String sql = "insert into users values(default,'"+username + "',"+userAge + ")";
            //执行该sql;true表示添加成功,false表示添加失败
            boolean execute = stmt.execute(sql);
            System.out.println(execute);
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭连接(先关闭Statement,再关闭Connection)
            JdbcUtils.closeDMLResource(stmt,conn);
        }
    }
    //修改数据
    public void updateUser(int id,String username, int userAge) {
        Connection conn = null;
        Statement stmt = null;
        try {
            conn = JdbcUtils.getConnection();
            stmt = conn.createStatement();
            String sql = "update users set username='"+username + "',userage="+userAge + " where userid=" + id;
            int i = stmt.executeUpdate(sql);
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.closeDMLResource(stmt, conn);
        }
    }
    //删除数据
    public void deleteUser(int id) {
        Connection conn = null;
        Statement stmt = null;
        try {
            conn = JdbcUtils.getConnection();
            stmt = conn.createStatement();
            String sql = "delete from users where userid="+id;
            int i = stmt.executeUpdate(sql);
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.closeDMLResource(stmt, conn);
        }
    }
    public static void main(String[] args) {
        TestStatement testStatement = new TestStatement();
        testStatement.insertUser("zhangsan", 18);
        testStatement.updateUser(1, "lisi", 20);
        testStatement.deleteUser(1);
    }
}

3.2.2通过PreparedStatement添加、修改、删除数据

package cn.it.bz.JDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class TestPreparedStatement {
   //添加数据
    public void insertUser(String username, int userAge){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            // 获取数据库连接
            conn = JdbcUtils.getConnection();
            //定义sql,?是参数占位符位置是从1开始计算的。
            String sql = "insert into users values(default,?,?)";
            //完成参数绑定
            ps = conn.prepareStatement(sql);
            ps.setString(1, username);
            ps.setInt(2, userAge);
            int i = ps.executeUpdate();
            System.out.println(i);
        }catch (Exception exception){
             exception.printStackTrace();
        }finally {
            //PreparedStatement是Statement的子接口
            JdbcUtils.closeDMLResource(ps,conn);
        }
    }
    //修改数据
    public void updateUser(int id, String username, int userAge) {
        Connection con = null;
        PreparedStatement ps = null;
        try {
            con = JdbcUtils.getConnection();
            String sql = "update users set username=?,userage=? where userid=?";
            ps = con.prepareStatement(sql);
            ps.setString(1, username);
            ps.setInt(2, userAge);
            ps.setInt(3, id);
            int i = ps.executeUpdate();
            System.out.println(i);
        }catch (Exception exception) {
            exception.printStackTrace();
        }finally {
             JdbcUtils.closeDMLResource(ps, con);
        }
    }
    //删除数据
    public void deleteUser(int id) {
        Connection con = null;
        PreparedStatement ps = null;
        try {
            con = JdbcUtils.getConnection();
            String sql = "delete from users where userid=?";
            ps = con.prepareStatement(sql);
            ps.setInt(1, id);
            int i = ps.executeUpdate();
            System.out.println(i);
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            JdbcUtils.closeDMLResource(ps, con);
        }
    }
    public static void main(String[] args) {
          TestPreparedStatement testPreparedStatement = new TestPreparedStatement();
          testPreparedStatement.insertUser("Java",123);
          testPreparedStatement.updateUser(3, "Tom", 20);
          testPreparedStatement.deleteUser(3);
    }
}

3.2.3ResultSet的使用

ResultSet接口的特点

ResultSet用来存放数据库查询操作获得结果集,通过对ResultSet的操作可以获取查询到的结果集数据。

注意:

ResultSet 对象中存放的并不是我们查询到的所有的结果集。它采用分块加载的方式来载入结果集数据,防止大量数据涌入到内存。

ResultSet特点

  • ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next 方法将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
  • 默认的 ResultSet 对象仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。
  • ResultSet 接口提供用于获取当前行检索列值的获取方法(getBoolean、getLong 等)。可以使用列的索引位置或列的名称检索值。

ResultSet使用原理

3.2.4通过ResultSet获取查询结果

package cn.it.bz.JDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestResultSet {
    //查询所有用户
    public ResultSet getAllUsers(){
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet resultSet = null;
        try {
           //获取Connection对象
            con = JdbcUtils.getConnection();
            String sql = "select * from users";
            ps = con.prepareStatement(sql);
            resultSet = ps.executeQuery();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return resultSet;
    }
    public static void main(String[] args) throws SQLException {
        TestResultSet testResultSet = new TestResultSet();
        ResultSet allUsers = testResultSet.getAllUsers();
        while (allUsers.next()) {
            System.out.println(allUsers.getInt("userid"));
            System.out.println(allUsers.getString("username"));
            System.out.println(allUsers.getString("userAge"));
        }
    }
}

四、ORM编程思想

4.1ORM简介

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/R mapping)是一种为了解决面向对象语言与关系数据库存在的互不匹配的现象。

4.2实体类

实体类就是一个定义了属性,拥有getter、setter、无参构造方法(基本必备)的一个类。实体类可以在数据传输过程中对数据进行封装,相当于一个“工具”、“容器”、“载体”,能存储、传输数据,能管理数据。

实体类特点:

  1. 实体类名,尽量和数据库中的表名一一对应
  2. 实体类中的属性对应数据库表中的字段,相关的命名最好也一一对应
  3. 实体类内方法主要有,getter、setter方法,用于设置、获取数据
  4. 实体类属性一般为private类型,方法为public类型
  5. 实体类应该有,无参、有参构造方法

4.3ORM的使用

   List<Users> usersList = new ArrayList<Users>();
        while (allUsers.next()) {
            //ORM映射
            Users users = new Users();
            users.setUserid(allUsers.getInt("userid"));
            users.setUsername(allUsers.getString("username"));
            users.setUserage(allUsers.getInt("userage"));
            usersList.add(users);
        }



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
66 11
|
1月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
71 7
|
1天前
|
SQL Java 关系型数据库
使用 JDBC 实现 Java 数据库操作
JDBC(Java Database Connectivity)是 Java 提供的数据库访问技术,允许通过 SQL 语句与数据库交互。本文详细介绍了 JDBC 的使用方法,包括环境准备、编程步骤和完整示例。
22 7
|
1天前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
19 5
|
29天前
|
Java 数据库连接 数据库
springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver应该如何解决
通过上述步骤,可以有效解决Spring Boot项目中遇到的 `java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver`问题。确保在项目中正确添加达梦数据库的JDBC驱动依赖,并在配置文件中正确配置数据源信息,是解决此问题的关键。通过这些方法,可以确保Spring Boot项目能够正确连接达梦数据库并正常运行。
205 31
|
27天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
13天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
1月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
2月前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
64 1