Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mybatis XML与注释_Java_Mybatis_Ibatis - Fatal编程技术网

Java Mybatis XML与注释

Java Mybatis XML与注释,java,mybatis,ibatis,Java,Mybatis,Ibatis,我读过关于Mybatis的书和文档,XML和Annotation都是我想要的,但是从Mybatis官方网站上,他们声称XML是一种更好的映射方法,因为Java Annotation有局限性 我个人更喜欢注释,例如 public interface PersonDAO { String INSERT_PERSON = "insert into person (title,firstName,surName,jobTitle,dob,email,mobile,landPhone,fax,t

我读过关于Mybatis的书和文档,XML和Annotation都是我想要的,但是从Mybatis官方网站上,他们声称XML是一种更好的映射方法,因为Java Annotation有局限性

我个人更喜欢注释,例如

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;

}

我想知道限制是什么?对我来说,似乎没有什么是显而易见的。

是的,Mybatis的文档警告说,对于更小、更简单的项目,注释可以更简单、更容易阅读。但是,与XML配置相比,注释是有限的。如果项目包含复杂对象或复杂数据库结构,请考虑使用XML配置而不是java注释。
最高级的映射(如MyBatis中的嵌套连接映射)仍然需要XML映射。

在Pitchers所说的嵌套连接映射之上,XML格式的resultMap支持继承,这在注释中无法实现,您每次都必须重写。@Results注释也是MapperXML元素的对应项。但是,从MyBatis 3.2.2开始,我们无法为@Results注释提供ID。因此,与XML元素不同,我们不能跨不同的映射语句重用@Results声明。这意味着您需要复制@Results配置,即使它是相同的。例如,请参见以下findStudentBy和findAllStudents方法:

使用注释的SQL映射器

在StudentMapper.java中,使用@resultMap引用resultMap属性StudentResult


引用Java-Persistence-with-MyBatis3

使用.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>
这种方法不太容易出错,也不太容易复制/粘贴。 你可以看看


条件、迭代等也应该提到。

我确信注释可以实现嵌套连接映射,不是吗?阅读本文了解注释的局限性。就myBatis而言,最高级的映射仍然需要XML映射。嵌套连接映射就是一个例子。另外,请阅读这个关于@Results重用的相关问题,它现在实际上是可能的。若您提供了一个带有@Results的id,那个么您可以从@ResultMap引用它。见和。
 <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>