我在Ruby中完成了过去几年的所有数据库开发,主要使用ActiveRecord。现在我不得不在项目中使用Java,感觉如此冗长和混乱,我想知道我做错了。
在ORM范例中,如果我想插入相关表格,我会像
那样# Joe Bob got a new car
p = Person.find_or_create_by_name("Joe Bob");
Car.new({:make=>"Toyota", :plate=>"ABC 123", :owner=>p});
在Java中,至少直接使用JDBC,我将不得不手动执行Person查找,如果不存在则插入,然后创建Car条目。
当然,在现实生活中,它不仅仅是2个表,疼痛呈指数级增长。当然有更好的方法吗?
答案 0 :(得分:3)
您可以使用Java的ORM解决方案 - 有各种解决方案可供使用。
值得关注的链接:
话虽如此,我经常发现,对于复杂的应用程序,ORM经常会造成比它值得更多的麻烦(是的,这确实包括带有Activerecord的Ruby项目)。有时候直接通过SQL获取数据而不是试图强制使用面向对象的外观确实有意义。
答案 1 :(得分:2)
更好的方法是学习SQL!您非常喜欢的ORM会在幕后为您编写SQL。
所以你可以创建一个试图选择记录的快速帮助函数,如果它不存在则为你创建它。
在MySQL中,您可以使用INSERT IGNORE .....
,只有当行不存在时才会插入行。
以下是您可能喜欢的一些特殊SQL(仅限MySQL):
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
这会尝试插入记录,如果它不存在,则会返回你在程序中检索的auto_increment。
但是:如果它确实存在则更新它 - (在这种情况下只设置c更新),但很酷的部分是它设置LAST_INSERT_ID()
就像在插入上一样。
无论哪种方式,您都可以获得ID字段。而且只需一点SQL。
SQL是一种非常好的语言 - 你应该学习它而不是依赖于orm的psudo语言。
答案 2 :(得分:1)
如果您正在使用JDBC,则需要查找自己并创建人员(如果不存在)。如果使用JDBC,没有更好的方法。
但是你可以使用Hibernate,它可以帮助你减少自己编写O-R映射并减少样板。
当你来自Ruby时如果你发现编写所有SQL查询很痛苦,那么更好的方法就是使用ORM。我推荐以下之一,
答案 3 :(得分:0)
Sormula包含active record package。如果没有记录,save method将更新现有记录或插入。
请参阅网站上的active record example。
另见项目中的org.sormula.tests.active.SaveTest.java:
SormulaTestAR record = new SormulaTestAR();
record.attach(getActiveDatabase()); // record needs to know data source
record.setId(8002);
record.setType(8);
record.setDescription("Save one AR 2");
record.save();
答案 4 :(得分:0)
看起来像我来晚了,但是,ActiveJDBC将按照Java的要求进行操作:
Person p = Person.findOrCreateIt("name", "Joe Bob");
Car car = Car.createIt("make", "Toyota", "plate", "ABC 123", "owner", p);
它还可以做很多事情,请访问http://javalite.io/