public class Contact {
private Long id;
private String name;
private String phone;
private String email;
private String address;
private LocalDateTime createTime;
// Getter/Setter/ToString...
}
2. 數據庫配置與連接池
// db.properties
jdbc.url=jdbc:mysql://localhost:3306/contact_db?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8
jdbc.user=root
jdbc.password=123456
jdbc.pool.size=10
// DBUtil.java (單例連接池)
public class DBUtil {
private static DataSource dataSource;
static {
Properties props = new Properties();
props.load(DBUtil.class.getResourceAsStream("/db.properties"));
HikariConfig config = new HikariConfig();
config.setJdbcUrl(props.getProperty("jdbc.url"));
config.setUsername(props.getProperty("jdbc.user"));
config.setPassword(props.getProperty("jdbc.password"));
config.setMaximumPoolSize(Integer.parseInt(props.getProperty("jdbc.pool.size")));
dataSource = new HikariDataSource(config);
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
3. DAO 層 (CRUD)
public interface ContactDAO {
void add(Contact c);
void update(Contact c);
void delete(Long id);
Contact getById(Long id);
List getAll();
List search(String keyword);
}
public class JdbcContactDAO implements ContactDAO {
// 實現上述方法,使用 PreparedStatement 參數化
// 示例:添加
public void add(Contact c) {
String sql = "INSERT INTO contacts (name, phone, email, address, create_time) VALUES (?,?,?,?,?)";
try (Connection conn = DBUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
ps.setString(1, c.getName());
ps.setString(2, c.getPhone());
ps.setString(3, c.getEmail());
ps.setString(4, c.getAddress());
ps.setObject(5, c.getCreateTime());
ps.executeUpdate();
try (ResultSet rs = ps.getGeneratedKeys()) {
if (rs.next()) c.setId(rs.getLong(1));
}
} catch (SQLException e) { throw new RuntimeException(e); }
}
// ... 其他方法類似
}
4. Service 層 (事務控制、業務規則)
public class ContactService {
private ContactDAO dao = new JdbcContactDAO();
public void addContact(Contact c) {
if (c.getName() == null || c.getName().trim().isEmpty())
throw new IllegalArgumentException("姓名不能為空");
dao.add(c);
}
// ... 其他業務方法
}