从在线访问到 ORM:数据处理技术全解

一、在线访问

1.概念

在线访问意味着设备或用户在连接网络的状态下,能够即时与远程服务器或云端资源进行交互。在当今数字化时代,大多数基于网络的应用和服务都依赖在线访问来实现其功能。

2.工作原理
  • 客户端 - 服务器模型:这是在线访问最常见的模式。客户端(如浏览器、移动应用等)向服务器发送请求,服务器接收到请求后进行处理,并将处理结果返回给客户端。例如,当你在浏览器中输入一个网址并按下回车键时,浏览器会向对应的服务器发送一个 HTTP 请求,服务器接收到请求后,会查找并返回该网页的 HTML、CSS、JavaScript 等文件,浏览器再将这些文件解析并渲染成网页展示给你。
  • 实时数据同步:在线访问允许数据在客户端和服务器之间实时同步。以社交媒体应用为例,当你发布一条新的动态时,应用会将这条动态的数据发送到服务器进行存储,同时,其他关注你的用户的客户端会实时接收到更新通知,并从服务器获取最新的动态数据进行展示。
3.应用场景
  • 在线办公:如 Google Docs、Microsoft Office 365 等在线办公软件,用户可以在浏览器中直接创建、编辑和共享文档、表格和演示文稿等,所有的数据都存储在云端,多个用户可以同时在线协作编辑。
  • 在线娱乐:在线游戏、在线视频、在线音乐等娱乐服务都依赖在线访问。例如,玩家可以通过网络连接到游戏服务器,与全球的其他玩家一起进行游戏;用户可以在视频平台上实时观看各种影视作品。
4.优缺点
  • 优点:能够获取最新的数据和服务,保证信息的及时性和准确性;无需在本地存储大量数据,节省设备存储空间;便于多用户之间的协作和数据共享。
  • 缺点:高度依赖网络连接,一旦网络出现故障或信号不稳定,就会影响使用体验甚至无法正常使用;存在一定的安全风险,如数据泄露、网络攻击等。

二、Data Access Object(数据访问对象)

1.概念

Data Access Object(DAO)是一种设计模式,它的主要作用是将数据访问逻辑从业务逻辑中分离出来。通过使用 DAO,业务逻辑代码可以专注于处理业务规则,而无需关心数据的存储和检索细节。

2.工作原理
  • 封装数据访问逻辑:DAO 类通常会封装与特定数据源(如数据库、文件系统等)的交互操作。例如,在一个基于数据库的应用中,DAO 类会包含对数据库表的增删改查操作的方法。这些方法会使用 SQL 语句或其他数据访问技术来执行具体的操作。
  • 提供统一接口:DAO 为业务逻辑代码提供了一个统一的接口,业务逻辑代码只需要调用 DAO 提供的方法,而不需要关心数据是如何从数据源中获取或存储的。这样可以提高代码的可维护性和可测试性。
3.应用场景
  • 企业级应用开发:在大型企业级应用中,通常会有多个数据源,如关系型数据库、非关系型数据库、文件系统等。使用 DAO 可以将不同数据源的访问逻辑进行封装,使业务逻辑代码更加清晰和易于维护。
  • 数据持久化:当需要将业务对象的数据持久化到数据库或其他存储介质时,DAO 可以负责处理数据的存储和检索操作。例如,在一个电子商务应用中,ProductDAO 类可以负责将产品信息存储到数据库中,并从数据库中查询产品信息。

4.示例代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

// 产品数据传输对象
class ProductDTO {
    private int id;
    private String name;
    private double price;

    public ProductDTO(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    // Getters 和 Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

// 产品数据访问对象
class ProductDAO {
    private static final String DB_URL = "jdbc:sqlite:products.db";

    public void createTable() {
        String sql = "CREATE TABLE IF NOT EXISTS products ("
                + "id INTEGER PRIMARY KEY AUTOINCREMENT,"
                + "name TEXT NOT NULL,"
                + "price REAL NOT NULL"
                + ")";
        try (Connection conn = DriverManager.getConnection(DB_URL);
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.execute();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }

    public void addProduct(ProductDTO product) {
        String sql = "INSERT INTO products(name, price) VALUES(?,?)";
        try (Connection conn = DriverManager.getConnection(DB_URL);
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, product.getName());
            pstmt.setDouble(2, product.getPrice());
            pstmt.executeUpdate();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }

    public List getAllProducts() {
        List products = new ArrayList<>();
        String sql = "SELECT * FROM products";
        try (Connection conn = DriverManager.getConnection(DB_URL);
             PreparedStatement pstmt = conn.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                double price = rs.getDouble("price");
                products.add(new ProductDTO(id, name, price));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        return products;
    }
}

三、Data Transfer Object(数据传输对象)

1.概念

Data Transfer Object(DTO)是一种用于在不同层(如表示层和业务层、业务层和数据访问层)之间传输数据的对象。它通常是一个简单的 JavaBean 或 POJO(Plain Old Java Object),只包含数据和对应的 getter 和 setter 方法,不包含任何业务逻辑。

2.工作原理
  • 数据封装:DTO 会将需要传输的数据封装到一个对象中,这样可以减少网络传输的数据量,提高传输效率。例如,在一个用户管理系统中,当从数据库查询用户信息后,可能会将用户的部分信息(如用户名、邮箱、头像等)封装到一个 UserDTO 对象中,然后将该对象传输到前端页面进行显示。
  • 隐藏业务对象内部结构:DTO 可以隐藏业务对象的内部结构,只暴露需要传输的数据。这样可以增强系统的安全性,防止敏感信息泄露。例如,在一个金融系统中,业务对象可能包含用户的账户余额、交易记录等敏感信息,而在传输到前端页面时,只需要将用户的基本信息(如用户名、联系方式等)封装到 UserDTO 对象中进行传输。
3.应用场景
  • 分布式系统:在分布式系统中,不同的服务之间需要进行数据传输。使用 DTO 可以将需要传输的数据进行封装,减少网络传输的数据量,提高系统的性能。例如,在一个微服务架构的应用中,用户服务和订单服务之间需要进行数据交互,此时可以使用 UserDTO 和 OrderDTO 来传输用户和订单的相关信息。
  • 前后端数据交互:在前端和后端进行数据交互时,使用 DTO 可以将后端的业务对象转换为前端可以理解的数据格式。例如,在一个基于 RESTful API 的应用中,后端可以将业务对象转换为 UserDTO 对象,并以 JSON 格式返回给前端,前端可以直接使用这些数据进行页面渲染。
4.示例代码
// 用户数据传输对象
class UserDTO {
    private int id;
    private String name;
    private String email;

    public UserDTO(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // Getters 和 Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "UserDTO{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

四、离线数据模式

1.概念

离线数据模式指的是应用程序在没有网络连接的情况下,仍然能够访问和处理数据。为了实现这一模式,应用程序通常会在本地存储数据,如使用本地数据库(如 SQLite)、文件系统或缓存等。

2.工作原理
  • 本地数据存储:应用程序会在有网络连接时,将需要离线使用的数据存储到本地。例如,一个新闻阅读应用会在用户有网络连接时,下载一些新闻文章到本地存储。这些数据可以存储在本地数据库中,也可以存储为文件。
  • 离线数据访问:当应用程序处于离线状态时,会从本地存储中获取数据进行访问和处理。例如,在新闻阅读应用中,当用户没有网络连接时,可以打开之前下载的新闻文章进行阅读。
  • 数据同步:当网络连接恢复后,应用程序会将本地数据与服务器数据进行同步。例如,在新闻阅读应用中,当用户重新连接到网络时,应用会将本地存储的新闻阅读记录同步到服务器,同时从服务器获取最新的新闻文章。
3.应用场景
  • 移动应用:许多移动应用都支持离线数据模式,以提高用户体验。例如,地图应用可以在有网络时下载地图数据到本地,用户在没有网络的情况下仍然可以使用地图进行导航;笔记应用可以让用户在离线状态下创建和编辑笔记,当网络连接恢复后再将笔记同步到云端。
  • 企业级应用:在一些企业级应用中,如销售管理应用、库存管理应用等,用户可能需要在没有网络的情况下进行数据录入和查询。离线数据模式可以满足这些需求,提高工作效率。
4.示例代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

// 离线数据存储类
class OfflineDataStorage {
    private static final String FILE_NAME = "offline_data.ser";

    public static void saveData(List data) {
        try (FileOutputStream fos = new FileOutputStream(FILE_NAME);
             ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(data);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    public static List loadData() {
        List data = new ArrayList<>();
        try (FileInputStream fis = new FileInputStream(FILE_NAME);
             ObjectInputStream ois = new ObjectInputStream(fis)) {
            data = (List) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            System.out.println(e.getMessage());
        }
        return data;
    }
}

五、对象 / 关系映射(Object/Relational Mapping,ORM)

1.概念

对象 / 关系映射(ORM)是一种编程技术,用于将面向对象编程语言中的对象模型与关系型数据库中的数据模型进行映射。通过 ORM,开发人员可以使用面向对象的方式操作数据库,而无需编写复杂的 SQL 语句。

2.工作原理
  • 对象 - 表映射:ORM 框架会将面向对象编程语言中的类映射到关系型数据库中的表,类的属性映射到表的列。例如,在一个 Python 应用中,定义了一个 User 类,ORM 框架会将 User 类映射到数据库中的 users 表,User 类的属性(如 idnameemail 等)映射到 users 表的列。
  • 对象操作转换为 SQL 语句:当开发人员使用面向对象的方式对对象进行操作时,ORM 框架会自动将这些操作转换为对应的 SQL 语句,并执行这些语句。例如,当调用 user.save() 方法时,ORM 框架会将其转换为 INSERT 或 UPDATE SQL 语句,将对象的数据保存到数据库中。
3.应用场景
  • Web 应用开发:在 Web 应用开发中,ORM 可以简化数据库操作,提高开发效率。例如,在 Django 框架中,使用 ORM 可以方便地进行数据库的增删改查操作,开发人员无需编写复杂的 SQL 语句。
  • 数据持久化:当需要将业务对象的数据持久化到数据库时,ORM 可以帮助开发人员实现这一功能。例如,在一个电子商务应用中,使用 ORM 可以将产品对象、订单对象等数据存储到数据库中,并从数据库中查询这些数据。
4.示例代码(使用 Hibernate)
  • 首先,你需要在 pom.xml 中添加 Hibernate 依赖: 

    
        org.hibernate
        hibernate-core
        5.4.32.Final
    
    
        com.h2database
        h2
        1.4.200
    
  •  以下是 Java 代码:
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import java.util.List;
    
    // 用户实体类
    class User {
        private int id;
        private String name;
        private String email;
    
        public User() {
        }
    
        public User(String name, String email) {
            this.name = name;
            this.email = email;
        }
    
        // Getters 和 Setters
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", email='" + email + '\'' +
                    '}';
        }
    }
    
    // Hibernate 配置和操作示例
    public class HibernateExample {
        public static void main(String[] args) {
            // 创建配置对象
            Configuration config = new Configuration();
            config.configure("hibernate.cfg.xml");
            config.addAnnotatedClass(User.class);
    
            // 创建会话工厂
            SessionFactory sessionFactory = config.buildSessionFactory();
    
            // 创建会话
            Session session = sessionFactory.openSession();
            Transaction transaction = null;
    
            try {
                // 开始事务
                transaction = session.beginTransaction();
    
                // 创建用户对象
                User user = new User("John Doe", "[email protected]");
    
                // 保存用户对象
                session.save(user);
    
                // 提交事务
                transaction.commit();
    
                // 查询所有用户
                List users = session.createQuery("FROM User", User.class).getResultList();
                for (User u : users) {
                    System.out.println(u);
                }
    
            } catch (Exception e) {
                if (transaction != null) {
                    transaction.rollback();
                }
                e.printStackTrace();
            } finally {
                // 关闭会话
                session.close();
                // 关闭会话工厂
                sessionFactory.close();
            }
        }
    }

  • hibernate.cfg.xml 配置文件示例: 
    
    
        
            
            org.h2.Driver
            jdbc:h2:mem:testdb
            sa
            
    
            
            org.hibernate.dialect.H2Dialect
    
            
            true
    
            
            create-drop
        
    

    上述代码涵盖了 DAO、DTO、离线数据模式和 ORM 的 Java 实现。其中 DAO 负责数据的增删改查操作;DTO 用于在不同层之间传输数据;离线数据模式通过文件存储和读取实现;ORM 借助 Hibernate 框架实现对象和数据库表的映射。 

你可能感兴趣的:(数据库,软件开发)