Button won from Red Bull’s Sebastian Vettel – last year’s winner here – with Hamilton finishing third.
Mark Webber was fourth – his best result in his home race – and a resurgent Fernando Alonso came fifth for Ferrari.
Button said: “We had a strong winter and qualifying really shows that. It’s nice to come away with a win in the first race of the season. Every win means a lot to you.”
Vettel, who climbed to second from a below-par sixth on the grid, knew there was only one winner on Sunday.
“Jenson was unbeatable, coming away with second was great – not a lot of people would have expected that after yesterday,” said the German.
Hamilton was disappointed afterwards but remains optimistic ahead of next weekend’s race in Malaysia. He said: “It wasn’t my day. I just have to keep my head down and my day will come.”
Pastor Maldonado was on course to secure the best result of his career before crashing out on the last lap whilst in sixth place.
The Williams driver lost control heading into turn seven, leading to a multi car battle for sixth – the cars sixth to 11th, from Kamui Kobayashi’s Sauber down to Jean-Eric Vergne in the Toro Rosso, finished just over three seconds apart.
The returning Kimi Raikonnen showed good race pace, gaining 10 places from his grid slot to finish seventh.
Sergio Perez, Daniel Ricciardo and Paul di Resta rounded out the points for Sauber, Toro Rosso and Force India respectively.
Ricciardo followed his countryman Webber in scoring his first points in F1 in his home race, mimicking the Red Bull driver’s achievement for Minardi – Toro Rosso’s predecessors no less – back in 2002.
The safety car made its almost annual appearance to allow Vitaly Petrov’s Caterham to be recovered on lap 37.
Hamilton lost out to Vettel in the safety car phase as the German continued at full speed towards the pits – the move was perfectly legal as he was approaching the pit entry while the McLaren driver had to slow down to the required limit.
There was disappointment for two drivers returning to the sport, with Romain Grosjean and Nico Hulkenberg suffering early retirements.
Grosjean will be especially frustrated after a career-best qualifying on Saturday saw him start third in the Lotus behind the McLarens.
1 Jenson Button (Gbr) McLaren 1hr 34mins 09.565secs
2 Sebastian Vettel (Ger) Red Bull 1:34:11.704
3 Lewis Hamilton (Gbr) McLaren 1:34:13.640
4 Mark Webber (Aus) Red Bull 1:34:14.112
5 Fernando Alonso (Spa) Ferrari 1:34:31.130
6 Kamui Kobayashi (Jpn) Sauber-Ferrari 1:34:46.331
7 Kimi Raikkonen (Fin) Lotus F1 Team 1:34:47.579
8 Sergio Perez (Mex) Sauber-Ferrari 1:34:49.023
9 Daniel Ricciardo (Aus) Scuderia Toro Rosso 1:34:49.121
10 Paul di Resta (Gbr) Force India 1:34:49.302
11 Jean-Eric Vergne (Fra) Scuderia Toro Rosso 1:34:49.413
12 Nico Rosberg (Ger) Mercedes GP 1:35:07.207
13 Pastor Maldonado (Ven) Williams at 1 Lap
14 Timo Glock (Ger) Marussia at 1 Lap
15 Charles Pic (Fra) Marussia at 5 Laps
16 Bruno Senna (Bra) Williams 52 Laps completed
17 Felipe Massa (Bra) Ferrari 46 Laps completed
18 Heikki Kovalainen (Fin) Caterham 38 Laps completed
19 Vitaly Petrov (Rus) Caterham 34 Laps completed
20 Michael Schumacher (Ger) Mercedes GP 10 Laps completed
21 Romain Grosjean (Swi) Lotus F1 Team 1 Laps completed
22 Nico Hulkenberg (Ger) Force India 0 Laps completed
MORE: The latest football news
MORE: The latest tennis news
BIOGRAPHY: Mohamed Salah