Hamilton took off from pole position and stayed ahead of Rosberg — despite the German closing to less than a second in a tense final lap — to record a fourth consecutive victory and move ahead of his teammate in the overall standings.
Hamilton's 26th career win gave him 100 points after five races and three more than Rosberg, who failed to find a way in front of his main rival for a fourth straight time after winning the season opener.
"This is our fourth one-two, it's just unreal," said Hamilton after his first career victory at the Barcelona-Catalunya circuit.
Hamilton hadn't led the championship since June 2012 after the Canadian GP with McLaren.
"Getting my first win here after trying for eight years, it is difficult to put into words my feeling," said Hamilton. "I have never had a car like this. I have never had a gap like this. I am grateful I was able to keep (Rosberg) behind me."
Red Bull's Daniel Ricciardo finished third for his first career podium after coming close on three occasions this year.
Four-time champion Sebastian Vettel had a flawless drive to move up from a 15th-place start to finish fourth, with his Red Bull finally not having any problems following two days of it stalling in practice and qualifying.
Valtteri Bottas of Williams crossed fifth, followed by troubled Ferrari pair Fernando Alonso and Kimi Raikkonen in sixth and seventh.
Lotus' Romain Grosjean and Force India duo Sergio Perez and Nico Hulkenberg rounded out the points.
Not even a three-week break for their rivals to improve their cars prevented Mercedes from earning its fifth win in as many events this year in a disheartening performance for the other 10 teams. Ricciardo ended up more than 48 seconds slower than Rosberg.
After executing a clean start, the Silver Arrows focused on protecting their tires and preparing a final fight at the end of the race to decide which would leave the other as runner-up.
Hamilton led all of the way, but he asked his team for help on several occasions — as well as complaining about the tire strategy— after never being able to shake Rosberg.
And although this race didn't see any close calls between the drivers, as happened in Bahrain earlier this season, there was drama right down to the last turn before Hamilton crossed 0.6 seconds ahead of Rosberg.
"I think if I had had one more lap I could have given it a go," said Rosberg. "I could have gone for a kamikaze move, but that wouldn't have made sense. I will try to get that little extra bit and edge him out next time."