核心步驟
- 引入驅動:
mssql-jdbc-x.x.x.jre11.jar 放入 WEB-INF/lib。
- 配置連接池(推薦 Druid/HikariCP)或直接
DriverManager.getConnection。
- 編寫 DAO:
PreparedStatement 防注入,ResultSet 映射實體。
- Service 層組裝多表關聯業務邏輯。
- Servlet/Controller 調用 Service,轉發到 JSP 渲染。
關鍵代碼片段
// DBUtil.java
public static Connection getConn() throws SQLException {
String url = "jdbc:sqlserver://localhost:1433;databaseName=test";
return DriverManager.getConnection(url, "sa", "pwd");
}
// UserDao.java
public List<User> findWithOrders() {
String sql = "SELECT u.*, o.id AS oid, o.amount " +
"FROM users u LEFT JOIN orders o ON u.id = o.user_id";
try (Connection c = DBUtil.getConn();
PreparedStatement ps = c.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
Map<Integer, User> map = new LinkedHashMap<>();
while (rs.next()) {
int uid = rs.getInt("id");
User u = map.computeIfAbsent(uid, k -> mapRow(rs));
if (rs.getInt("oid") > 0) {
u.getOrders().add(mapOrder(rs));
}
}
return new ArrayList<>(map.values());
}
}
JSP 顯示
<c:forEach items="${users}" var="u">
${u.username}
<c:forEach items="${u.orders}" var="o"> ${o.amount} </c:forEach>
</c:forEach>
避坑清單
- 關閉資源用
try-with-resources。
- SQL Server 字符集設置
sendStringParametersAsUnicode=false 避免中文亂碼。
- 大數據量分頁用
OFFSET ... ROWS FETCH NEXT ... ROWS ONLY (SQL Server 2012+)。