Mybatis的两种映射方式
MyBatis 有两种 SQL 语句映射模式,一种是基于注解,一种是基于XML。
Mybatis应该选择哪种映射方式呢?MyBatis 项目开发中是基于 XML 还是注解?
注解模式与 XML 模式对比 注解模式 优势:开发速度快,开发量小 劣势:难以线上维护(每次修改 SQL 语句都需要重新打包)
XML 模式 优势:便于线上维护(每次修改 SQL 语句不需要重新打包) 劣势:开发速度慢,开发量大
另外,注解模式开发速度快仅限于简单 SQL 语句处理,比如单表 CURD 操作之类。对于复杂的 SQL 语句处理,注解模式就显得有点力不从心,而且会带来混乱。
总结:实际项目开发中,用哪种实现方式取决于团队,因此两种都需要了解。 自己开发时,简单 SQL 语句可以采用注解模式,复杂 SQL 语句采用 XML 模式。(个人认为对Mybatis来说,XML是核心)
1、使用注解的目的:
减少编写Mapper映射文件
2、Mybatis的常用注解
@lnsert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询 @Result:实现结果集封装 @Results:可以与@Result一起使用,封装多个结果集 @One:实现一对一结果集封装 @Many:实现一对多结果集封装
3、快速入门:
3.1、在核心配置文件中加载配置关系
<mappers>
<package name="mapper"/>
</mappers>
说明1:该路径是相对与root文件路径下的 说明2:等价于加载映射文件,都是告知mapper接口映射的sql语句的路径
3.2 在Mapper接口写对应sql语句
public interface TeacherMapper {
@Select("select * from teacher ")
ArrayList<Teacher> findAll();
@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<String, Object> map);
@Update("update test.teacher set name = #{name} where id = #{id}")
void updateTeacher(Teacher teacher);
@Delete("delete from test.teacher where id = #{id}")
void deleteTeacher(int id);
}
对比(XML方式和注解方式)
3.3 开始测试
备注:下面的代码已经抽取出重复获取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();
}
}
|