The Orioles, who began the night tied for the lead in the American League East with the New York Yankees, had a three-game winning streak snapped.
It remained a 2-2 contest until Toronto struck four times in the seventh off Miguel Gonzalez and Luis Ayala.
Yunel Escobar opened the inning with a double and moved to third when Johnson reached on a bunt single.
Another bunt single by Adeiny Hechavarria drove in Escobar and an infield base hit by Anthony Gose loaded the bases.
That brought up Davis, who hit a 1-0 pitch up the middle to score both Johnson and Hechavaria. Gose dashed around to third and when the throw to third by center fielder Adam Jones got away, Gose came in to score the fourth run of the inning.
The win went to reliever Steve Delabar (4-1), who struck out two while working his only inning in the seventh. Casey Janssen came on in the ninth for Toronto in a non-save situation and gave up a two-run homer to Mark Reynolds.
Gonzalez (6-4) allowed five runs on seven hits in 6 1/3 to take the loss.
NASA celebrates Earth Day with #GlobalSelfie
Lytro unveils camera that can focus a photo after shooting it