Batty was educated at Bingley Grammar School, a Voluntary Aided state school in Bingley, West Yorkshire.
Batty began his county career with his native Yorkshire, after playing for England Under 19's, making his County Championship debut in 1997. Due to lack of opportunities he transferred to Surrey in 1998 where he played mainly one-day games. He joined Worcestershire in 2002 where he became the main spinner and came to prominence with the national team. Batty was involved in an unsavoury incident while deputising as captain for Surrey in a Championship match against Somerset at Taunton in 2012. Murali Kartik, a spinner who had previously played for Somerset, ran out Somerset batsman Alex Barrow who was backing-up at the non-striker's end. Batty declined several invitations by the umpires to withdraw the appeal leading to bad feeling between the teams and around the ground. In August 2013, he was suspended from the T20 finals day after a clash with Somerset batsman Peter Trego. The ECB banned him for two games after he apparently physically confronted Trego and hurled foul language after dismissing him in a quarter-final match.
Batty was made permanent captain of Surrey in 2015 and later that year took a hat trick to send Surrey back into Division One of the County Championship after two years in Division Two. An even better year with the ball in Division One in 2016, combined with poor form for Moeen Ali, led to calls for his recall to the England test team after its draw against Pakistan. Nonetheless, when Batty was recalled later that year for the tour of Bangladesh, he described his call-up as "surreal".
Batty made his ODI debut against Australia. He took figures of 0-55 as Australia won by seven wickets. England lost the second match by 89 runs after Australia scored 318. Batty took figures of 1-65.
He made his Test debut in the first Test against Bangladesh. He took 1-43 in Bangladesh’s first innings before taking 1-65 in their second innings as England won by seven wickets. He played in the third ODI between the two sides, taking figures of 1-35 as England won by seven wickets. He played in the first Test against Sri Lanka, taking 2-98 in their first innings as they posted 331. He took 3-55 in their second innings. He made 26 in England’s second innings to help them hang on for a draw. In the second Test, he did not take a wicket in Sri Lanka’s first innings. He finished with 1-47 in their second innings and then made an unbeaten 25 as the match finished in a draw. In the third Test, he took figures of 0-137 as Sri Lanka posted 628 in their first innings. England lost the match by an innings and 215 runs.
He was picked for the tour of the West Indies in 2003–04. Batty was the bowler Brian Lara faced when he scored his world record 400th run in the fourth Test Match in Antigua. In the first innings, he finished with figures of 2-175, as the match ended in a high scoring draw. He was picked as second spinner for the South African tour the next season. He played in the sixth ODI between the two sides, taking figures of 2-40 although England lost by four wickets. He kept his place for the final match of the series, finishing with figures of 0-22 as England won by five wickets. He went on to play in the fourth match of the ODI series against Zimbabwe, taking figures of 0-36 as England secured a 74 run victory.
The selectors continued to show faith in him, picking him for the two Tests against Bangladesh in 2005 when Giles suffered a hip injury – in the first Test, he did not bat and did not bowl, as England won by an innings and 261 runs. He took figures of 1-44 in Bangladesh’s second innings in the next Test, as England won by an innings and 27 runs.
Batty was selected in the ODI squad against India, but found his chances limited. He only played in one match, the fourth ODI of the series. Batty made two with the bat as England posted 237, a target which was chased down by India, with Batty taking figures of 0-36. This turned out to Batty’s last England appearance for nearly three years.
Batty was selected for the England Lions squad to tour New Zealand in the winter of 2008, but didn’t return to the England side until the series against the West Indies. He replaced spinning all-rounder Samit Patel, who dropped out due to fitness concerns, and Swann who returned home after the Test series to undergo an operation on his elbow. He made his T20I debut against the West Indies, taking figures of 0-17 as England lost by six wickets. In the first ODI, he took figures of 1-34 as England won by one run on the D/L Method. England lost the second match by 21 runs, with Batty taking figures of 0-38. Batty did not bowl in the third match, although he did make 17 with the bat. England lost the match by eight wickets.
On 20 October 2016, Batty played in a Test match for England against Bangladesh, thus becoming the player who has missed the largest number of Tests between appearances, 142 games. Batty claimed 4 wickets in the game, finishing with figures of 1-52 in the first innings and 3-65 in the second innings, as England won the game by 22 runs.
Batty played in the third Test against India, and took 0-47 in the first innings as India made 417. He took 0-18 in India’s second innings as England lost the match by eight wickets.