Bettini, competing for the Mapei team in his first Tour, crossed the finish line after 4 hours 29.06 seconds ahead of Belgian Geert Verheyen and Jose Angel Vidal of Spain.
"Winning a Tour de France stage is fantastic," said the 26-year-old Bettini.
"I didn't feel well at (last month's) Giro d'Italia but everything is going as planned here."
The four-man group broke away from the pack after 143K of the 9th stage. They extended their lead over the final hour to more than a minute before the chasers, led by sprint specialist Erik Zabel, trimmed the final margin to less than one second.
The yellow jersey was defended by Italian veteran Alberto Elli, who is on his 11th Tour and won it for the first time ever Thursday.
The 36-year-old is second-oldest rider in the field after fellow Italian Massimo Podenzana, who is 38.
With his fifth-placed finish, the German Zabel of Team Telekom took the green sprinter's jersey away from compatriot Marcel Wuerst.
Monday starts the first mountain stage through the Pyrenees with a 205K ride from Dax to Lourdes-Hautacam and the hunt for the favorites.
"This will be the first major test," defending champion Lance Armstrong said.
The weather forecast for Monday's 10th stage calls for possible snow in altitudes up to 1,709 meters at Col d'Aubisque, the second major ascent of the stage.
More on Stage 9:
Map of Stage 9
Complete results of Stage 9
General classification after Stage 9
Tour de France category standings after Stage 9
Stage 9 results:
1. Paolo Bettini (ITA) 4:29:06
2. Geert Verheyen (BEL) same time
3. Jos Angel Vidal (Spa) s.t.
4. Didier Rous (Fra) s.t.
5. Erik Zabel (Ger) s.t.
6. Romans Vainsteins (Lat) s.t.
7. Enrico Cassani (Ita) s.t.
8. Arvis Piziks (Lat) s.t.
9. Stefano Zanini (Ita) s.t.
10. Zoran Klemencic (Slo) s.t.
39. Marco Pantani (ITA) s.t.
47. Lance Armstrong (USA) s.t.
48. Jan Ullrich (GER) s.t.
49. Laurent Jalabert (FRA) s.t.
59. Bo Hamburger (DEN) s.t.
61. Bobby Julich (USA) s.t.
67. Fernando Escartin (SPA) s.t.
72. Alex Zulle (SUI) s.t.
82. Frankie Andreu (USA) s.t.
86. Tyler Hamilton (USA) s.t.
109. Kevin Livingston (USA) s.t.
General Classification after Stage 8:
1. Alberto Elli (ITA) 28.39.28
2. Fabrice Gougot (FRA) at +0:12
3. Marc Wauters (BEL) +1:15
4. Pascal Chanteur (FRA) +2:56
5. Jos Luis Arrieta (SPA) +3:08
6. Jacky Durand (FRA) +3.17
7. Jens Voigt (GER) +s.t.
8. Salvatore Commesso (ITA) +3.52
9. Servais Knaven (NED) +4.31
10. Arvis Piziks (LAT) +4.38
14. Laurent Jalabert (FRA) at +5.40
16. Lance Armstrong (USA) +5: 54
25. Tyler Hamilton (USA) +6.35
26. Jan Ullrich (GER) +6.37
29. Kevin Livingston (USA) +6.58
37. Bobby Julich (USA) +7.55
72. Frankie Andreu (USA) +9.50
74. Alex Zulle (SUI) +9.59
87. Marco Pantani (ITA) +11.06
89. Bo Hamburger (DEN) +11:12
100. Fernando Escartin (SPA) +11.56