傳統 Spring + MyBatis 專案將 SQL 寫在 XML Mapper 中,現需求改為「SQL 寫死在 Java 代碼」且仍使用 Spring 框架。本文介紹兩種主流無 XML 方案:Spring JdbcTemplate 及 MyBatis 註解開發。
@Configuration
public class DataConfig {
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
ds.setUsername("root");
ds.setPassword("123456");
return ds;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
@Repository
public class AdminRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
public Admin findAdminName(String adminName) {
String sql = "SELECT * FROM admins WHERE admin_name = ?";
return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Admin.class), adminName);
}
public int save(Admin admin) {
String sql = "INSERT INTO admins VALUES (?, ?, ?, ?)";
return jdbcTemplate.update(sql, admin.getAdminId(), admin.getAdminName(), admin.getAdminPassword(), admin.getAdminNickname());
}
public int update(Admin admin) {
String sql = "UPDATE admins SET admin_name=?, admin_password=?, admin_nickname=? WHERE admin_id=?";
return jdbcTemplate.update(sql, admin.getAdminName(), admin.getAdminPassword(), admin.getAdminNickname(), admin.getAdminId());
}
}
@Mapper
public interface AdminMapper {
@Select("SELECT * FROM admins WHERE admin_name = #{adminName}")
Admin findAdminName(@Param("adminName") String adminName);
@Insert("INSERT INTO admins VALUES (#{adminId}, #{adminName}, #{adminPassword}, #{adminNickname})")
int save(Admin admin);
@Update("UPDATE admins SET admin_name=#{adminName}, admin_password=#{adminPassword}, admin_nickname=#{adminNickname} WHERE admin_id=#{adminId}")
int update(Admin admin);
}
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application { ... }
| 維度 | JdbcTemplate | MyBatis 註解 |
|---|---|---|
| 學習成本 | 低 | 中 |
| SQL 維護性 | 分散在代碼中 | 集中在 Mapper 接口 |
| 動態 SQL | 手動拼接 | 支持 <script> 註解 |
| 結果映射 | RowMapper | 自動/註解配置 |
| 事務管理 | @Transactional | @Transactional |
建議:簡單專案或團隊習慣原生 JDBC 用 JdbcTemplate;需動態 SQL、結果映射複雜則用 MyBatis 註解。兩者均可完全去除 XML。