Spring Boot 自動配置了 JdbcTemplate 與 JPA,但 MyBatis 需手動整合。本文演示基於 Druid 數據源、註解開發與 XML 映射混合的完整接入流程。
com.xxx.firstboot ├── common/MyBatisConfig.java # 整合入口 ├── mapper/UserMapper.java # Mapper 接口 ├── mapper/UserMapper.xml # SQL 映射 ├── dao/UserDao.java # DAO 層 ├── service/UserService.java # Service 層 ├── web/UserController.java # Controller └── domain/User.java # 實體類
<!-- JDBC & Druid --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency> <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.14</version></dependency> <!-- MySQL --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency> <!-- MyBatis --> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.2.8</version></dependency> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version></dependency>
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://xxx:3306/mytestdb?useUnicode=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=vvvxxx mybatis.typeAliasesPackage=com.xxx.firstboot.domain mybatis.mapperLocations=classpath:mapper/*.xml
@Configuration
@MapperScan(basePackages = "com.xxx.firstboot.mapper")
public class MyBatisConfig {
@Autowired
private Environment env;
@Bean
public DataSource dataSource() throws Exception {
Properties props = new Properties();
props.put("driverClassName", env.getProperty("jdbc.driverClassName"));
props.put("url", env.getProperty("jdbc.url"));
props.put("username", env.getProperty("jdbc.username"));
props.put("password", env.getProperty("jdbc.password"));
return DruidDataSourceFactory.createDataSource(props);
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
fb.setDataSource(dataSource);
fb.setTypeAliasesPackage(env.getProperty("mybatis.typeAliasesPackage"));
fb.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(env.getProperty("mybatis.mapperLocations")));
return fb.getObject();
}
}
關鍵點:@MapperScan 掃描 Mapper 接口,SqlSessionFactoryBean 必須設置 DataSource,XML 非必需時可省略 typeAliasesPackage 和 mapperLocations。
public interface UserMapper {
@Insert("INSERT INTO tb_user(username, password) VALUES(#{username}, #{password})")
int insertUser(@Param("username") String username, @Param("password") String password);
// 需返回自增主鍵,使用 XML
int insertUserWithBackId(User user);
}
<mapper namespace="com.xxx.firstboot.mapper.UserMapper">
<insert id="insertUserWithBackId" parameterType="User"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO tb_user (username, password)
VALUES (#{username, jdbcType=VARCHAR}, #{password, jdbcType=VARCHAR})
</insert>
</mapper>
// Dao
@Repository
public class UserDao {
@Autowired UserMapper userMapper;
public int insertUser(String u, String p) { return userMapper.insertUser(u, p); }
public int insertUserWithBackId(User user) { return userMapper.insertUserWithBackId(user); }
}
// Service
@Service
public class UserService {
@Autowired UserDao userDao;
public boolean addUser(String u, String p) { return userDao.insertUser(u, p) == 1; }
public User addUserWithBackId(String u, String p) {
User user = new User(); user.setUsername(u); user.setPassword(p);
userDao.insertUserWithBackId(user); // 主鍵自動回填
return user;
}
}
// Controller
@RestController @RequestMapping("/user") @Api("User API")
public class UserController {
@Autowired UserService userService;
@PostMapping("/addUser") public boolean addUser(@RequestParam String username, @RequestParam String password) {
return userService.addUser(username, password);
}
@PostMapping("/addUserWithBackId") public User addUserWithBackId(@RequestParam String username, @RequestParam String password) {
return userService.addUserWithBackId(username, password);
}
}
項目根目錄執行 mvn spring-boot:run,訪問 Swagger UI 測試接口。