The Polish striker, who turned down the offer of a new contract earlier this week, struck twice in the opening 21 minutes to put the home side in charge.
Mohammed Abdellaoue pulled a goal back for Hannover in the 40th minute but Julian Schieber made it 3-1 midway through the second half as Dortmund got back to winning ways.
Second-placed Dortmund remain a point ahead of Bayer Leverkusen, who snatched a late 2-1 win over Stuttgart.
Vedad Ibisevic's penalty had put the Swabians ahead in the 12th minute, but a penalty from Stefan Kiessling brought Leverkusen back on level terms 10 minutes from the end before Lars Bender completed the turnaround.
Basement side Greuther Furth shared a 1-1 draw with Hamburg although the point does little to help their desperate fight against relegation.
Furth took the lead in the 14th minute through Nikola Djurdjic but Maximilian Beister equalised for Hamburg in the 22nd minute.
Augsburg moved within six points of safety following a 1-0 win at Werder Bremen, courtesy of Tobias Werner's 29th-minute strike.
Julian Draxler scored two goals and set up a third as Schalke beat Wolfsburg 4-1.
Draxler's first goal in the 33rd minute was cancelled out by Ivica Olic early in the second half, but Draxler scored again after 63 minutes with Jefferson Farfan and Klaas Jan Huntelaar adding gloss to the scoreline.
Jonathan Schmid's late goal gave Freiburg a 1-1 draw at Nuremberg, who had taken the lead through Timmy Simons' first-half penalty.
On Friday, Luuk de Jong netted midway through the first half to hand Borussia Monchengladbach a 1-0 away win over Eintracht Frankfurt
Saturday's Bundesliga Results
Friday's Bundesliga Results