我已经阅读了有关Mybatis的书和文档,XML和Annotation都做了我想要的,但是从myBatis官方网站,他们声称XML是一种更好的做Mappers的方法,因为Java注释有局限性。
我个人更喜欢注释,例如
public interface PersonDAO {
String INSERT_PERSON = "insert into person (title,firstName,surName,jobTitle,dob,email,mobile,landPhone,fax,twitter,facebook,linkedin) VALUES (#{title},#{firstName},#{surName},#{jobTitle},#{dob},#{email},#{mobile},#{landPhone},#{fax},#{twitter},#{facebook},#{linkedin})";
String UPDATE_PERSON = "update person set title=#{title},firstName=#{firstName},surName=#{surName},jobTitle=#{jobTitle},dob=#{dob},email=#{email},mobile=#{mobile},landPhone=#{landPhone},fax=#{fax},twitter=#{twitter},facebook=#{facebook},linkedin=#{linkedin} where id=#{id}";
String GET_PERSON_BY_ID = "SELECT * FROM vw_person WHERE id = #{personId}";
String DELETE_PERSON = "DELETE FROM person WHERE id = #{personId}";
@Select(GET_PERSON_BY_ID)
public PersonVO doSelectPerson(long personId) throws Exception;
@Update(UPDATE_PERSON)@Options(flushCache = true, useCache = true)
public int doUpdatePerson(PersonVO vo) throws Exception;
@Insert(INSERT_PERSON)@Options(useGeneratedKeys = true, keyProperty = "id", flushCache = true)
public int doCreatePerson(PersonVO person) throws Exception;
@Delete(DELETE_PERSON)@Options(flushCache = true)
public int doDeletePerson(long personId) throws Exception;
}
我想知道这个限制是什么?似乎没有什么比我看起来更明显了。
答案 0 :(得分:11)
在Pitchers所说的嵌套连接映射之上,XML格式的resultMap
支持继承,这在注释中无法实现,每次都要重写。此外,@Results
注释是Mapper XML元素<resultMap>
的对应部分。但是,从MyBatis 3.2.2开始,我们无法为@Results
注释提供ID。因此,与<resultMap>
XML元素不同,我们不能在不同的映射语句中重用@Results
声明。这意味着您需要复制@Results
配置,即使它是相同的。例如,请参阅以下findStudentBy()
和findAllStudents()
方法:
@Select("SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}")
@Results({
@Result(id=true, column="stud_id", property="studId"),
@Result(column="name", property="name"),
@Result(column="email", property="email"),
@Result(column="addr_id", property="address.addrId")
})
Student findStudentById(int studId);
@Select("SELECT * FROM STUDENTS")
@Results({
@Result(id=true, column="stud_id", property="studId"),
@Result(column="name", property="name"),
@Result(column="email", property="email"),
@Result(column="addr_id", property="address.addrId")
})
List<Student> findAllStudents();
这两个语句的@Results
配置相同,但我们需要复制它。还有一个解决这个问题的方法。我们可以使用<resultMap>
注释创建Mapper XML文件并配置resultMap
元素并引用@ResultMap
。
使用<resultMap>
中的ID StudentResult定义StudentMapper.xml
。
<mapper namespace="com.mybatis3.mappers.StudentMapper">
<resultMap type="Student" id="StudentResult">
<id property="studId" column="stud_id"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="phone" column="phone"/>
</resultMap>
</mapper>
使用注释的SQL Mappers
在StudentMapper.java
中,使用resultMap
引用StudentResult
属性@ResultMap
。
public interface StudentMapper
@Select("SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}")
@ResultMap("com.mybatis3.mappers.StudentMapper.StudentResult")
Student findStudentById(int studId);
@Select("SELECT * FROM STUDENTS")
@ResultMap("com.mybatis3.mappers.StudentMapper.StudentResult")
List<Student> findAllStudents();
引用Java-Persistence-with-MyBatis3
答案 1 :(得分:3)
是的,Mybatis的文档警告说,对于更小,更简单的项目,注释可以更简单,更容易阅读。但是,与XML配置相比,注释有限。如果您的项目包含复杂对象或复杂数据库结构,请考虑使用XML配置而不是Java注释。
MyBatis中的 嵌套连接映射 等最高级的映射仍然需要XML映射。
答案 2 :(得分:1)
使用.xml时有很多用例可以更加简洁和清晰。
比如说,你可以创建一些Common.xml
,定义一堆查询,比如
<sql id="inStmt">
IN
<foreach item="id" collection="ids" separator="," open="(" close=")">
#{id}
</foreach>
</sql>
并在项目中重复使用此代码。
此外,可以定义模板查询,例如:
<sql id="selectDistinct">
SELECT DISTINCT(${column}), #{param}
FROM ${entityTable}
</sql>
然后你可以通过
来引用它 <include refid="Common.selectDistinct">
<property name="column" value="id"/>
<property name="entityTable" value="some_table"/>
</include>
这种方法不易出错,更少复制/粘贴。 (你可以看看here)。
也应该提到条件,迭代等。