【1.4 漫画PostgreSQL高级数据库及国产数据库对比】

发布于:2025-07-02 ⋅ 阅读:(17) ⋅ 点赞:(0)

🐘 漫画PostgreSQL高级数据库及国产数据库对比

👨‍💻 小明:“老王,除了MySQL,还有哪些优秀的关系型数据库?国产数据库发展得怎么样?”

🧙‍♂️ 架构师老王:“PostgreSQL是世界上最先进的开源数据库!而且我们国产数据库也在快速发展,达梦、人大金仓、openGauss都很优秀。让我们一起学习这些数据库的特色!”

📚 目录


🐘 PostgreSQL核心特性

🔧 PostgreSQL配置与连接

// PostgreSQL配置
@Configuration
public class PostgreSQLConfig {
   
    
    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.postgresql")
    public DataSource postgresqlDataSource() {
   
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost:5432/testdb");
        config.setUsername("postgres");
        config.setPassword("password");
        config.setDriverClassName("org.postgresql.Driver");
        
        // 连接池配置
        config.setMaximumPoolSize(20);
        config.setMinimumIdle(5);
        config.setConnectionTimeout(30000);
        config.setIdleTimeout(600000);
        config.setMaxLifetime(1800000);
        
        // PostgreSQL特有配置
        config.addDataSourceProperty("useSSL", "false");
        config.addDataSourceProperty("serverTimezone", "Asia/Shanghai");
        config.addDataSourceProperty("reWriteBatchedInserts", "true");
        
        return new HikariDataSource(config);
    }
    
    @Bean
    public JdbcTemplate postgresqlJdbcTemplate(@Qualifier("postgresqlDataSource") DataSource dataSource) {
   
        return new JdbcTemplate(dataSource);
    }
}

// PostgreSQL特有数据类型支持
@Entity
@Table(name = "postgresql_features")
public class PostgreSQLFeatureEntity {
   
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    // JSON类型支持
    @Column(columnDefinition = "jsonb")
    @Convert(converter = JsonbConverter.class)
    private Map<String, Object> jsonData;
    
    // 数组类型支持
    @Column(columnDefinition = "text[]")
    @Convert(converter = StringArrayConverter.class)
    private String[] tags;
    
    // UUID类型
    @Column(columnDefinition = "uuid")
    private UUID uuid;
    
    // 范围类型
    @Column(columnDefinition = "int4range")
    private String ageRange;
    
    // 地理位置类型
    @Column(columnDefinition = "point")
    private String location;
    
    // 全文搜索向量
    @Column(columnDefinition = "tsvector")
    private String searchVector;
}

🔍 PostgreSQL高级查询

@Repository
public class PostgreSQLAdvancedRepository {
   
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    // JSON查询
    public List<Map<String, Object>> queryByJsonField(String jsonPath, String value) {
   
        String sql = "SELECT * FROM products WHERE json_data->>'category' = ?";
        return jdbcTemplate.queryForList(sql, value);
    }
    
    // 数组查询
    public List<Map<String, Object>> queryByArrayContains(String tag) {
   
        String sql = "SELECT * FROM articles WHERE ? = ANY(tags)";
        return jdbcTemplate.queryForList(sql, tag);
    }
    
    // 全文搜索
    public List<Map<String, Object>> fullTextSearch(String searchTerm) {
   
        String sql = """
            SELECT *, ts_rank(search_vector, plainto_tsquery(?)) as rank
            FROM articles 
            WHERE search_vector @@ plainto_tsquery(?)
            ORDER BY rank DESC
            """;
        return jdbcTemplate.queryForList(sql, searchTerm, searchTerm);
    }
    
    // 窗口函数查询
    public List<Map<String, Object>> getTopProductsByCategory() {
   
        String sql = """
            SELECT product_name, category, sales,
                   ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) as rank
            FROM products
            WHERE ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) <= 3
            """;
        return jdbcTemplate.queryForList(sql);
    }
    
    // CTE公用表表达式
    public List<Map<String, Object>> getHierarchicalData(Long parentId) {
   
        String sql = """
            WITH RECURSIVE category_tree AS (
                SELECT id, name, parent_id, 1 as level
                FROM categories 
                WHERE parent_id = ?
                
                UNION ALL
                
                SELECT c.id, c.name, c.parent_id, ct.level + 1
                FROM categories c
                JOIN category_tree ct ON c.parent_id = ct.id
            )
            SELECT * FROM category_tree ORDER BY level, name
            """;
        return jdbcTemplate.queryForList(sql, parentId);
    }
}

🏛️ Oracle数据库

🔧 Oracle特性与配置

// Oracle数据库配置
@Configuration
public class OracleConfig {
   
    
    @Bean
    @ConfigurationProperties("spring.datasource.oracle")
    public DataSource oracleDataSource() {
   
        HikariConfig config 

网站公告

今日签到

点亮在社区的每一天
去签到