精华帖 (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的标注描述过,难道我们会因为这样的“不优雅”而放弃使用吗? 不知道谁的奶酪被动了?不过这都只是个习惯的问题,世态总是在发展,不管它是直线型的还是螺旋型,如果你我改变不了,那最好的方式就是适应(当然,我们也可以放弃),适应的过程是痛苦的(如果你很在意自己一个人的感受),但最终的结果就是给了你我另一种习惯。呵呵,是吗,我的朋友? |
|
返回顶楼 | |
发表时间:2008-10-11
这这样写跟直接在方法里面写sql没什么区别,复杂的sql就应该写在xml里面,你又把它拿进来
|
|
返回顶楼 | |
发表时间: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也是这种模式。 |
|
返回顶楼 | |
发表时间:2008-10-11
这种争论有意义吗?就跟你换件衣服,智者见智,仁者见仁,你觉得漂亮不一定别人也觉得漂亮。sun也只不过提供了多一种方式而已,并没有说要和xml争天下的意思
|
|
返回顶楼 | |
发表时间:2008-10-11
hibernate3可以用annotation写命名SQL,而且已经被大众接收,为什么iBatis用annotation就会引来这么多争议呢?它们以前都是使用xml来进行元数据的配置呀!看来问题在于使用者!
|
|
返回顶楼 | |
发表时间:2008-10-11
hibernate对于一般比较简单的应用还可以,但是一旦你对数据库的操作比较复杂的话,就会发现ibatis是很好的解决方案,关于annotation的问题,比较支持lz的观点,其实只要看习惯了annotation就行了,如果你让一个不懂java地来看java代码,他一样会觉得很"恐怖"
|
|
返回顶楼 | |
发表时间:2008-10-11
对于annotation的使用我同意lz的观点,看场合适度使用,不过目前看来annotation的普遍应用是一种趋势,我们应慢慢学会接受这种做法,习惯就好~~~
|
|
返回顶楼 | |
发表时间:2008-10-11
annotation这样用不服也不行
|
|
返回顶楼 | |
发表时间:2008-10-11
我也是支持lz的,我是从c++、c#转到java开发的,当面对大量的xml配置时都快疯掉了。个人还是很喜欢annotation这种方式的,尤其是小项目,annotation太方便了。
|
|
返回顶楼 | |
发表时间:2008-10-11
问题不在于annotation本身,问题在于是否在部署时或第一次启动ORM引擎的时候能把字段到方法的Map一次性载入,避免重复读取。
大多数JPA软件已经做到了,但这个不知道做没做到。 |
|
返回顶楼 | |