MyBatis 有两种 SQL 语句映射模式,一种是基于注解,一种是基于XML。
Mybatis应该选择哪种映射方式呢?MyBatis 项目开发中是基于 XML 还是注解?
注解模式与 XML 模式对比
注解模式
优势:开发速度快,开发量小
劣势:难以线上维护(每次修改 SQL 语句都需要重新打包)
XML 模式
优势:便于线上维护(每次修改 SQL 语句不需要重新打包)
劣势:开发速度慢,开发量大
另外,注解模式开发速度快仅限于简单 SQL 语句处理,比如单表 CURD 操作之类。对于复杂的 SQL 语句处理,注解模式就显得有点力不从心,而且会带来混乱。
总结:实际项目开发中,用哪种实现方式取决于团队,因此两种都需要了解。
自己开发时,简单 SQL 语句可以采用注解模式,复杂 SQL 语句采用 XML 模式。(个人认为对Mybatis来说,XML是核心)
减少编写Mapper映射文件
2、Mybatis的常用注解@lnsert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result一起使用,封装多个结果集
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
说明1:该路径是相对与root文件路径下的
说明2:等价于加载映射文件,都是告知mapper接口映射的sql语句的路径
public interface TeacherMapper {
//查询所有的教师
@Select("select * from teacher ")
ArrayList findAll();
//根据ID查询单个教师
@Select("select * from teacher where id = #{id}")
Teacher getTeacherById(int id);
//插入一个教师对象
@Insert("insert into test.teacher (id, name) value (#{id},#{name})")
void addTeacher(Teacher teacher);
@Insert("insert into test.teacher(id, name) value (#{id},#{name})")
void addTeacher2(Map map);
//根据id更新一个对象
@Update("update test.teacher set name = #{name} where id = #{id}")
void updateTeacher(Teacher teacher);
@Delete("delete from test.teacher where id = #{id}")
//根据id删除一个对象
void deleteTeacher(int id);
// void updateTeacher2(Map map);
}
对比(XML方式和注解方式)
备注:下面的代码已经抽取出重复获取mapper对象的操作
@Test
public void selectAll() throws IOException {
mapper.findAll();
}
@Test
public void selectbyId() throws IOException {
mapper.getTeacherById(5);
}
//
@Test
public void deletebyId() throws IOException {
mapper.deleteTeacher(5);
}
@Test
public void updateTeacher() throws IOException {
Teacher t5 = new Teacher(5, "令狐冲");
mapper.updateTeacher(t5);
}
@Test
public void insert() throws IOException {
Teacher t5 = new Teacher(4, "东方不败");
mapper.addTeacher(t5);
mapper.findAll();
}
附:用@Before等抽取出获取session会话对象的固定模板
每次测试代码时,都得重复获取mapper,可以使用@before、@After抽取出重复性的操作
public class MybatisTest {
private TeacherMapper mapper;
private SqlSession sqlSession;
@Before
public void before()throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
sqlSession = sqlSessionFactory.openSession(true);
mapper = sqlSession.getMapper(TeacherMapper.class);
}
@After
public void after ()throws IOException {
sqlSession.close();
}
}



