首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >java: DDD using sql server 2019 or Oracle21c

java: DDD using sql server 2019 or Oracle21c

作者头像
geovindu
发布2026-06-18 19:28:26
发布2026-06-18 19:28:26
400
举报

如何用工厂模式切换数据库系统

项目结构:

domain --entities ----school.java --repositories ----school.java infrastructure --database -----duoraclehelper.java --model ----school.java --repositories ----Oracle -------school.java ----Sqlserver -------school.java --common ----DatabaseType --factories ----RepositoryFactory --config -----AppConfig

application --server -----school.java presentation --controllers ----school.java --views ----school.java main.java

只需改infrastructure,其他基本一样的。

代码语言:javascript
复制
/**
 * encoding: utf-8
 * 版权所有 2025 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1
 * # OS        : window10
 * Datetime  : 2025 - 2025/7/14 - 22:53
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : DDDdemo
 * File      : DatabaseType.java
 * explain   : 学习  枚举
 **/
package infrastructure.common;
 
/**
 *
 */
public enum DatabaseType {
 
    ORACLE,
    SQL_SERVER,
    MYSQL,
    POSTGRESQL,
    SQLSERVER,
    SQLITE
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2025 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2025 - 2025/7/14 - 23:06
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : DDDdemo
 * File      : AppConfig.java
 * explain   : 学习  类
 **/
 
package infrastructure.config;
 
import infrastructure.common.DatabaseType;
import infrastructure.database.DatabaseConnectionFactory;
import infrastructure.factories.RepositoryFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
 
 
public class AppConfig {
 
    /**
     *
     */
    private static final String CONFIG_FILE = "application.properties";
    private static Properties properties;
 
    static {
        loadConfig();
        initializeComponents();
    }
 
    private static void loadConfig() {
        properties = new Properties();
        try (InputStream is = AppConfig.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) {
            //AppConfig.class.getClassLoader()  src 下
            if (is != null) {
                properties.load(is);
            } else {
                throw new IOException("无法加载配置文件: " + CONFIG_FILE);
            }
        } catch (IOException e) {
 
            System.err.println("加载配置文件失败: " + CONFIG_FILE);
            System.err.println("使用默认配置");
            throw new RuntimeException("加载配置失败", e);
 
        }
    }
 
    private static void initializeComponents() {
        String dbType = properties.getProperty("default.database.type", "SQL_SERVER");
        DatabaseType databaseType;// = DatabaseType.valueOf(dbType.toUpperCase());
 
        try {
            databaseType = DatabaseType.valueOf(dbType.toUpperCase());
            System.out.println(dbType);
 
        } catch (IllegalArgumentException e) {
            System.err.println("无效的数据库类型配置: " + dbType);
            System.err.println("使用默认值: SQL_SERVER");
            databaseType = DatabaseType.SQL_SERVER;
        }
        DatabaseConnectionFactory.initialize(databaseType);
        RepositoryFactory.initialize(databaseType);
    }
 
    public static String getProperty(String key) {
        return properties.getProperty(key);
    }
}
 
 
 
/**
 * encoding: utf-8
 * 版权所有 2025 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2025 - 2025/7/14 - 23:02
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : DDDdemo
 * File      : DatabaseConfigManager.java
 * explain   : 学习  类
 **/
 
package infrastructure.config;
 
import infrastructure.database.DatabaseConnectionFactory;
import infrastructure.common.DatabaseType;
import infrastructure.factories.RepositoryFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
 
public class DatabaseConfigManager {
 
    private static final String CONFIG_FILE = "application.properties";
    private static Properties properties;
    private static final Map<DatabaseType, Map<String, String>> dbConfigs = new HashMap<>();
    private static DatabaseType activeDbType;
 
    static {
        loadConfig();
        initializeDbConfigs();
        // 设置默认数据库
        String defaultType = properties.getProperty("default.database.type", "SQL_SERVER");
        activeDbType = DatabaseType.valueOf(defaultType.toUpperCase());
    }
 
    private static void loadConfig() {
        properties = new Properties();
 
 
        String host = AppConfig.getProperty("sqlserver.host");
        String port = AppConfig.getProperty("sqlserver.port");
        String name = AppConfig.getProperty("sqlserver.name");
        System.out.println("host:"+host + ":" + port);
 
        try (InputStream is = DatabaseConfigManager.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) {
            if (is != null) {
                properties.load(is);
            } else {
                throw new IOException("无法加载配置文件: " + CONFIG_FILE);
            }
        } catch (IOException e) {
            throw new RuntimeException("加载配置失败", e);
        }
    }
 
    private static void initializeDbConfigs() {
        // 初始化 SQL Server 配置
        Map<String, String> sqlServerConfig = new HashMap<>();
        sqlServerConfig.put("host", properties.getProperty("sqlserver.host"));
        sqlServerConfig.put("port", properties.getProperty("sqlserver.port"));
        sqlServerConfig.put("name", properties.getProperty("sqlserver.name"));
        sqlServerConfig.put("user", properties.getProperty("sqlserver.user"));
        sqlServerConfig.put("password", properties.getProperty("sqlserver.password"));
        System.out.println(properties.getProperty("sqlserver.host"));
 
 
        dbConfigs.put(DatabaseType.SQL_SERVER, sqlServerConfig);
 
        // 初始化 Oracle 配置
        Map<String, String> oracleConfig = new HashMap<>();
        oracleConfig.put("host", properties.getProperty("oracle.host"));
        oracleConfig.put("port", properties.getProperty("oracle.port"));
        oracleConfig.put("sid", properties.getProperty("oracle.sid"));
        oracleConfig.put("serviceName", properties.getProperty("oracle.serviceName"));
        oracleConfig.put("user", properties.getProperty("oracle.user"));
        oracleConfig.put("password", properties.getProperty("oracle.password"));
        dbConfigs.put(DatabaseType.ORACLE, oracleConfig);
    }
 
    public static void setActiveDatabase(DatabaseType dbType) {
        activeDbType = dbType;
        // 重新初始化工厂和连接
        DatabaseConnectionFactory.initialize(activeDbType);
        RepositoryFactory.initialize(activeDbType);
    }
 
    public static Map<String, String> getActiveConfig() {
        return dbConfigs.get(activeDbType);
    }
 
    public static DatabaseType getActiveDbType() {
        return activeDbType;
    }
 
 
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2025 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2025 - 2025/7/14 - 23:04
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : DDDdemo
 * File      : DatabaseConnectionFactory.java
 * explain   : 学习  类
 **/
 
package infrastructure.database;
 
import infrastructure.common.DatabaseType;
import infrastructure.config.AppConfig;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
 
public class DatabaseConnectionFactory {
 
    private static DatabaseType currentDbType;
 
    public static void initialize(DatabaseType dbType) {
        currentDbType = dbType;
    }
 
    /**
     *
     * @return
     * @throws SQLException
     * @throws IOException
     */
    public static Connection getConnection() throws SQLException, IOException {
        Properties props = new Properties();
 
        switch (currentDbType) {
            case ORACLE:
                String oracleUrl;
 
                //try {
                    // 加载Oracle驱动
                    //Class.forName("oracle.jdbc.OracleDriver");
                //} catch (ClassNotFoundException e) {
                    //throw new SQLException("找不到Oracle JDBC驱动", e);
                //}
 
                if (AppConfig.getProperty("oracle.sid") != null) {
                    oracleUrl = String.format("jdbc:oracle:thin:@//%s:%s/%s",
                            AppConfig.getProperty("oracle.host"),
                            AppConfig.getProperty("oracle.port"),
                            AppConfig.getProperty("oracle.sid"));
 
                    props.setProperty("user", AppConfig.getProperty("oracle.user"));
                    props.setProperty("password", AppConfig.getProperty("oracle.password"));
 
                } else {
                    oracleUrl = String.format("jdbc:oracle:thin:@//%s:%s/%s",
                            AppConfig.getProperty("oracle.host"),
                            AppConfig.getProperty("oracle.port"),
                            AppConfig.getProperty("oracle.serviceName"));
                            props.setProperty("user", AppConfig.getProperty("oracle.user"));
                             props.setProperty("password", AppConfig.getProperty("oracle.password"));
                }
                return DriverManager.getConnection(oracleUrl, props);
 
            case SQL_SERVER:
 
                //try {
                    // 加载sqlserver驱动
                    //Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
               // } catch (ClassNotFoundException e) {
                   // throw new SQLException("找不到sqlserver JDBC驱动", e);
               // }
 
                String sqlServerUrl = String.format("jdbc:sqlserver://%s:%s;databaseName=%s",
                        AppConfig.getProperty("sqlserver.host"),
                        AppConfig.getProperty("sqlserver.port"),
                        AppConfig.getProperty("sqlserver.name"));
 
                String host = AppConfig.getProperty("sqlserver.host");
                String port = AppConfig.getProperty("sqlserver.port");
                String name = AppConfig.getProperty("sqlserver.name");
                String user=AppConfig.getProperty("sqlserver.user");
                String password=AppConfig.getProperty("sqlserver.password");
 
               // System.out.println("database host:"+host + ":" + port);
                //System.out.println("database user:"+user + ":" + password);
                props.setProperty("user", AppConfig.getProperty("sqlserver.user"));
                props.setProperty("password", AppConfig.getProperty("sqlserver.password"));
 
                System.out.println("database:"+sqlServerUrl);
 
                return DriverManager.getConnection(sqlServerUrl, user, password);
 
            default:
                throw new IllegalArgumentException("不支持的数据库类型");
        }
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2025 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2025 - 2025/7/18 - 20:09
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : DDDdemo
 * File      : OracleSchoolRepositoryImpl.java
 * explain   : 学习  类
 **/
 
package infrastructure.repositories.oracle;
 
import domain.entities.School;
import domain.entities.QueryParams;
import domain.repositories.SchoolRepository;
import infrastructure.repositories.BaseRepository;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
 
 
public class OracleSchoolRepositoryImpl extends BaseRepository implements SchoolRepository {
 
    @Override
    public List<School> findAll(int page, int pageSize) {
        System.out.println("开始分页查询,页码: " + page + ",每页大小: " + pageSize);
        List<School> schools = new ArrayList<>();
        String sql = "SELECT * FROM School ORDER BY SchoolId " +
                "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
 
        try (Connection conn = getConnection()) {
            System.out.println("成功获取数据库连接");
 
            try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
                pstmt.setInt(1, (page - 1) * pageSize);
                pstmt.setInt(2, pageSize);
                System.out.println("执行SQL: " + sql);
                System.out.println("参数1: " + (page - 1) * pageSize);
                System.out.println("参数2: " + pageSize);
 
                try (ResultSet rs = pstmt.executeQuery()) {
                    while (rs.next()) {
                        schools.add(mapToDomain(rs));
                    }
                    System.out.println("查询成功,返回 " + schools.size() + " 条记录");
                }
            }
        } catch (SQLException | IOException e) {
            System.err.println("数据库操作异常: " + e.getMessage());
            e.printStackTrace(); // 打印完整堆栈信息
            throw new RuntimeException("查询学校列表失败", e);
        }
        return schools;
    }
 
    @Override
    public int countAll() {
        String sql = "SELECT COUNT(*) FROM School";
        try (Connection conn = getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
 
            if (rs.next()) {
                return rs.getInt(1);
            }
        } catch (SQLException | IOException e) {
            throw new RuntimeException("统计学校数量失败", e);
        }
        return 0;
    }
    @Override
    public List<School> findByParams(QueryParams params) {
        List<School> schools = new ArrayList<>();
        String sql = "SELECT * FROM (" +
                "  SELECT s.*, ROW_NUMBER() OVER (ORDER BY SchoolId) rn " +
                "  FROM School s " +
                "  WHERE 1=1 ";
 
        if (params.getSearchTerm() != null && !params.getSearchTerm().isEmpty()) {
            sql += "AND (SchoolId LIKE ? OR SchoolName LIKE ?) ";
        }
 
        sql += ") WHERE rn BETWEEN ? AND ?";
 
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
 
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
 
            int paramIndex = 1;
            if (params.getSearchTerm() != null && !params.getSearchTerm().isEmpty()) {
                String searchTerm = "%" + params.getSearchTerm() + "%";
                pstmt.setString(paramIndex++, searchTerm);
                pstmt.setString(paramIndex++, searchTerm);
            }
 
            int startRow = (params.getPageNumber() - 1) * params.getPageSize() + 1;
            int endRow = params.getPageNumber() * params.getPageSize();
 
            pstmt.setInt(paramIndex++, startRow);
            pstmt.setInt(paramIndex, endRow);
 
            rs = pstmt.executeQuery();
            while (rs.next()) {
                schools.add(mapToDomain(rs));
            }
        } catch (SQLException | IOException e) {
            throw new RuntimeException("按条件查询学校失败", e);
        } finally {
            closeResources(conn, pstmt, rs);
        }
 
        return schools;
    }
    @Override
    public int countByParams(QueryParams params) {
        StringBuilder sql = new StringBuilder("SELECT COUNT(*) FROM School WHERE 1=1 ");
 
        // 构建查询条件
        if (params.getSearchTerm() != null && !params.getSearchTerm().isEmpty()) {
            sql.append("AND (SchoolId LIKE ? OR SchoolName LIKE ?)");
        }
 
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql.toString())) {
 
            int paramIndex = 1;
            // 设置查询参数
            if (params.getSearchTerm() != null && !params.getSearchTerm().isEmpty()) {
                String searchTerm = "%" + params.getSearchTerm() + "%";
                pstmt.setString(paramIndex++, searchTerm);
                pstmt.setString(paramIndex, searchTerm);
            }
 
            try (ResultSet rs = pstmt.executeQuery()) {
                if (rs.next()) {
                    return rs.getInt(1);
                }
            }
        } catch (SQLException | IOException e) {
            throw new RuntimeException("统计符合条件的学校数量失败", e);
        }
        return 0;
    }
    @Override
    public School findById(String schoolId) {
        String sql = "SELECT * FROM School WHERE SchoolId = ?";
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
 
            pstmt.setString(1, schoolId);
            try (ResultSet rs = pstmt.executeQuery()) {
                if (rs.next()) {
                    return mapToDomain(rs);
                }
            }
        } catch (SQLException | IOException e) {
            throw new RuntimeException("查找学校失败", e);
        }
        return null;
    }
 
    @Override
    public void save(School school) {
        // 检查是插入还是更新
        if (findById(school.getSchoolId()) == null) {
            insertSchool(school);
        } else {
            updateSchool(school);
        }
    }
 
    private void insertSchool(School school) {
        String sql = "INSERT INTO School (SchoolId, SchoolName, SchoolTelNo) VALUES (?, ?, ?)";
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
 
            pstmt.setString(1, school.getSchoolId());
            pstmt.setString(2, school.getSchoolName());
            pstmt.setString(3, school.getSchoolTelNo());
 
            pstmt.executeUpdate();
        } catch (SQLException | IOException e) {
            throw new RuntimeException("添加学校失败", e);
        }
    }
 
    private void updateSchool(School school) {
        String sql = "UPDATE School SET SchoolName = ?, SchoolTelNo = ? WHERE SchoolId = ?";
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
 
            pstmt.setString(1, school.getSchoolName());
            pstmt.setString(2, school.getSchoolTelNo());
            pstmt.setString(3, school.getSchoolId());
 
            pstmt.executeUpdate();
        } catch (SQLException | IOException e) {
            throw new RuntimeException("更新学校失败", e);
        }
    }
 
    @Override
    public void delete(String schoolId) {
        String sql = "DELETE FROM School WHERE SchoolId = ?";
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
 
            pstmt.setString(1, schoolId);
            pstmt.executeUpdate();
        } catch (SQLException | IOException e) {
            throw new RuntimeException("删除学校失败", e);
        }
    }
    private School mapToDomain(ResultSet rs) throws SQLException {
        return new School(
                rs.getString("SchoolId"),
                rs.getString("SchoolName"),
                rs.getString("SchoolTelNo")
        );
    }
 
 
 
}
 
 
 
/**
 * encoding: utf-8
 * 版权所有 2025 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2025 - 2025/7/18 - 19:57
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : DDDdemo
 * File      : SqlServerSchoolRepositoryImpl.java
 * explain   : 学习  类
 **/
 
package infrastructure.repositories.sqlserver;
 
import domain.entities.School;
import domain.entities.QueryParams;
import domain.repositories.SchoolRepository;
import infrastructure.repositories.BaseRepository;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
 
 
public class SqlServerSchoolRepositoryImpl extends BaseRepository implements SchoolRepository {
 
 
    @Override
    public List<School> findAll(int page, int pageSize) {
        List<School> schools = new ArrayList<>();
        // SQL Server 2012+ 分页语法
        String sql = "SELECT * FROM School " +
                "ORDER BY SchoolId " +
                "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
 
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
 
            pstmt.setInt(1, (page - 1) * pageSize);
            pstmt.setInt(2, pageSize);
 
            try (ResultSet rs = pstmt.executeQuery()) {
                while (rs.next()) {
                    schools.add(mapToDomain(rs));
                }
            }
        } catch (SQLException | IOException e) {
            throw new RuntimeException("查询学校列表失败", e);
        }
        return schools;
    }
 
    @Override
    public int countAll() {
        String sql = "SELECT COUNT(*) FROM School";
        try (Connection conn = getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
 
            if (rs.next()) {
                return rs.getInt(1);
            }
        } catch (SQLException | IOException e) {
            throw new RuntimeException("统计学校数量失败", e);
        }
        return 0;
    }
    @Override
    public List<School> findByParams(QueryParams params) {
        List<School> schools = new ArrayList<>();
        StringBuilder sql = new StringBuilder(
                "SELECT * FROM School WHERE 1=1 "
        );
 
        if (params.getSearchTerm() != null && !params.getSearchTerm().isEmpty()) {
            sql.append("AND (SchoolId LIKE ? OR SchoolName LIKE ?) ");
        }
 
        sql.append("ORDER BY SchoolId OFFSET ? ROWS FETCH NEXT ? ROWS ONLY");
 
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
 
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql.toString());
 
            int paramIndex = 1;
            if (params.getSearchTerm() != null && !params.getSearchTerm().isEmpty()) {
                String searchTerm = "%" + params.getSearchTerm() + "%";
                pstmt.setString(paramIndex++, searchTerm);
                pstmt.setString(paramIndex++, searchTerm);
            }
 
            pstmt.setInt(paramIndex++, (params.getPageNumber() - 1) * params.getPageSize());
            pstmt.setInt(paramIndex, params.getPageSize());
 
            rs = pstmt.executeQuery();
            while (rs.next()) {
                schools.add(mapToDomain(rs));
            }
        } catch (SQLException | IOException e) {
            throw new RuntimeException("按条件查询学校失败", e);
        } finally {
            closeResources(conn, pstmt, rs);
        }
 
        return schools;
    }
 
    @Override
    public int countByParams(QueryParams params) {
        StringBuilder sql = new StringBuilder("SELECT COUNT(*) FROM School WHERE 1=1 ");
 
        // 构建查询条件
        if (params.getSearchTerm() != null && !params.getSearchTerm().isEmpty()) {
            sql.append("AND (SchoolId LIKE ? OR SchoolName LIKE ?)");
        }
 
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql.toString())) {
 
            int paramIndex = 1;
            // 设置查询参数
            if (params.getSearchTerm() != null && !params.getSearchTerm().isEmpty()) {
                String searchTerm = "%" + params.getSearchTerm() + "%";
                pstmt.setString(paramIndex++, searchTerm);
                pstmt.setString(paramIndex, searchTerm);
            }
 
            try (ResultSet rs = pstmt.executeQuery()) {
                if (rs.next()) {
                    return rs.getInt(1);
                }
            }
        } catch (SQLException | IOException e) {
            throw new RuntimeException("统计符合条件的学校数量失败", e);
        }
        return 0;
    }
 
    @Override
    public School findById(String schoolId) {
        String sql = "SELECT * FROM School WHERE SchoolId = ?";
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
 
            pstmt.setString(1, schoolId);
            try (ResultSet rs = pstmt.executeQuery()) {
                if (rs.next()) {
                    return mapToDomain(rs);
                }
            }
        } catch (SQLException | IOException e) {
            throw new RuntimeException("查找学校失败", e);
        }
        return null;
    }
 
    @Override
    public void save(School school) {
        // 检查是插入还是更新
        if (findById(school.getSchoolId()) == null) {
            insertSchool(school);
        } else {
            updateSchool(school);
        }
    }
    private void insertSchool(School school) {
        String sql = "INSERT INTO School (SchoolId, SchoolName, SchoolTelNo) VALUES (?, ?, ?)";
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
 
            pstmt.setString(1, school.getSchoolId());
            pstmt.setString(2, school.getSchoolName());
            pstmt.setString(3, school.getSchoolTelNo());
 
            pstmt.executeUpdate();
        } catch (SQLException | IOException e) {
            throw new RuntimeException("添加学校失败", e);
        }
    }
 
    private void updateSchool(School school) {
        String sql = "UPDATE School SET SchoolName = ?, SchoolTelNo = ? WHERE SchoolId = ?";
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
 
            pstmt.setString(1, school.getSchoolName());
            pstmt.setString(2, school.getSchoolTelNo());
            pstmt.setString(3, school.getSchoolId());
 
            pstmt.executeUpdate();
        } catch (SQLException | IOException e) {
            throw new RuntimeException("更新学校失败", e);
        }
    }
 
    @Override
    public void delete(String schoolId) {
        String sql = "DELETE FROM School WHERE SchoolId = ?";
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
 
            pstmt.setString(1, schoolId);
            pstmt.executeUpdate();
        } catch (SQLException | IOException e) {
            throw new RuntimeException("删除学校失败", e);
        }
    }
    private School mapToDomain(ResultSet rs) throws SQLException {
        return new School(
                rs.getString("SchoolId"),
                rs.getString("SchoolName"),
                rs.getString("SchoolTelNo")
        );
    }
 
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档