论坛首页 Java企业应用论坛

让你的 Ibatis2 也支持Annotation

浏览 23913 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-11  
到目前为止,70%以上的声音是反对的,20%是中立的,剩下10%的我还在坚持自己的立场与观点。最终引发的还会是xml vs. annotation,类似的争论已经很多,两个极端都会遭人唾骂,事情总没有十全十美,我们如何通过自身的判断来找到适合项目的平衡点那才是最重要的。我们不能草率去判定某种方式带来的“不优雅”,像这种“不优雅”的方式其实随处可见,大家看下面被这样描述过的一个实体对象:
@Entity()
@Table(name = "Contact_tb")
@NamedQueries( {
	@NamedQuery(name="Contact.list[find]",query="select e from Contact e order by e.name"),
	@NamedQuery(name="Contact.list[count]",query="select count(*) from Contact"),
	@NamedQuery(name="Contact.byName[load]",query="select e from Contact e where e.name=?") })
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "contactCache")
public class Contact implements Serializable {

	@Id
	@GeneratedValue(generator = "system-uuid")
	@GenericGenerator(name = "system-uuid", strategy = "uuid")
	@Column(name = "id", nullable = false, updatable = false,length=32)
	@DocumentId
	private String id;

	@Column(name = "name", nullable = false, length = 36, unique = true)
	@NotNull(message="{contact.name}")
	@NotEmpty(message="{contact.name}")
	@Field(index=Index.TOKENIZED,store=Store.NO)
	private String name;

	@Column(name = "headPic", nullable = true, length = 255)
	private String headPic;

	@Column(name = "homePhone", nullable = true, length = 20)
	private String homePhone;

	@Column(name = "mobilePhone", nullable = true, length = 20)
	@NotNull(message="{contact.mobile}")
	@NotEmpty(message="{contact.mobile}")
	@Length(max=11,message="{contact.mobile}")
	private String mobilePhone;

	@Column(name = "eMail", nullable = true, length = 36)
	@Email(message="{contact.email}")
	private String email;

	@Lob
	@Column(name = "address", nullable = true, length = 2000)
	@Field(index=Index.UN_TOKENIZED)
	private String address;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
	..........
	..........
}

上面这个Contact对象被用jpa、hibernate validator、hibernate search的标注描述过,难道我们会因为这样的“不优雅”而放弃使用吗?
不知道谁的奶酪被动了?不过这都只是个习惯的问题,世态总是在发展,不管它是直线型的还是螺旋型,如果你我改变不了,那最好的方式就是适应(当然,我们也可以放弃),适应的过程是痛苦的(如果你很在意自己一个人的感受),但最终的结果就是给了你我另一种习惯。呵呵,是吗,我的朋友?



0 请登录后投票
   发表时间:2008-10-11  
这这样写跟直接在方法里面写sql没什么区别,复杂的sql就应该写在xml里面,你又把它拿进来
0 请登录后投票
   发表时间:2008-10-11  
xfan1982 写道
这这样写跟直接在方法里面写sql没什么区别


咋一看,是没有区别,我在之前的回复中已经说明

cnoss 写道
Ibatis配置文件中定义的sql语句是可以重用的(通过id来获取),它可以是其它查询的子查询。但如果写在指定的业务方法里面就实现不了这种共享与引用。


xfan1982 写道
复杂的sql就应该写在xml里面,你又把它拿进来

以下这段只是说明,可以通过以下方式来声明动态查询,用户可以按照自己的意愿选择是将其声明在xml中还是annotation。但这些都不重要,重要的是怎样让你自己更方便。
    @Select(id = "queryAccounts",    
        sql = "select * from ACCOUNT "  
            + "<dynamic prepend=\"where\">"  
            + " <isNotNull prepend=\"and\" property=\"firstName\">"  
            + "    firstName = #firstName#"    
            + " </isNotNull>"  
            + " <isNotNull prepend=\"and\" property=\"lastName\">"  
            + "    lastName = #lastName#"    
            + " </isNotNull>"  
            + " <isNotNull prepend=\"and\" property=\"emailAddress\">"  
            + "    emailAddress = #emailAddress#"    
            + " </isNotNull>"  
            + "</dynamic> "    
            + "order by lastName", resltMap = "accountResultMap",    
            cacheModel = "account-cache")   
    @Transactional(type = TransactionalType.READOLNY)   
    /**  
     * 动态SQL查询  
     */  
    public List<Account> queryAccounts(Account account) throws SQLException {   
        return sqlMapper.queryForList("queryAccounts",account);   
    }   


我通常的作法是将跟数据库配置相关的信息写在xml中,将sql定义写在java类里面。JPA的persistence.xml+annotation也是这种模式。
0 请登录后投票
   发表时间:2008-10-11  
这种争论有意义吗?就跟你换件衣服,智者见智,仁者见仁,你觉得漂亮不一定别人也觉得漂亮。sun也只不过提供了多一种方式而已,并没有说要和xml争天下的意思
0 请登录后投票
   发表时间:2008-10-11  
hibernate3可以用annotation写命名SQL,而且已经被大众接收,为什么iBatis用annotation就会引来这么多争议呢?它们以前都是使用xml来进行元数据的配置呀!看来问题在于使用者!
0 请登录后投票
   发表时间:2008-10-11  
hibernate对于一般比较简单的应用还可以,但是一旦你对数据库的操作比较复杂的话,就会发现ibatis是很好的解决方案,关于annotation的问题,比较支持lz的观点,其实只要看习惯了annotation就行了,如果你让一个不懂java地来看java代码,他一样会觉得很"恐怖"
0 请登录后投票
   发表时间:2008-10-11  
对于annotation的使用我同意lz的观点,看场合适度使用,不过目前看来annotation的普遍应用是一种趋势,我们应慢慢学会接受这种做法,习惯就好~~~
0 请登录后投票
   发表时间:2008-10-11  
annotation这样用不服也不行
0 请登录后投票
   发表时间:2008-10-11  
我也是支持lz的,我是从c++、c#转到java开发的,当面对大量的xml配置时都快疯掉了。个人还是很喜欢annotation这种方式的,尤其是小项目,annotation太方便了。
0 请登录后投票
   发表时间:2008-10-11  
问题不在于annotation本身,问题在于是否在部署时或第一次启动ORM引擎的时候能把字段到方法的Map一次性载入,避免重复读取。

大多数JPA软件已经做到了,但这个不知道做没做到。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics